本技術(shù)涉及計算機領(lǐng)域,具體而言,涉及一種數(shù)據(jù)的處理方法和裝置、存儲介質(zhì)及電子設(shè)備。
背景技術(shù):
1、目前,在現(xiàn)有的動態(tài)鏈接庫中,線程局部存儲變量通常通過全局偏移表來進(jìn)行重定位,當(dāng)動態(tài)鏈接庫被加載到內(nèi)存中時,線程局部存儲變量的地址會被填充到全局偏移表中,程序在運行時通過全局偏移表來訪問線程局部存儲變量。
2、然而,當(dāng)動態(tài)鏈接庫中的補丁函數(shù)使用常規(guī)動態(tài)模式尋址線程局部存儲變量,而線程局部存儲變量在可執(zhí)行文件中以局部可執(zhí)行模式尋址時,由于局部可執(zhí)行模式缺少重定位信息,使得補丁函數(shù)加載失敗,也即,相關(guān)技術(shù)中存在著由于常規(guī)動態(tài)模式與局部可執(zhí)行模式下的線程局部存儲變量的尋址方式不同,導(dǎo)致補丁函數(shù)加載失敗的技術(shù)問題。
3、針對上述的問題,目前尚未提出有效的解決方案。
技術(shù)實現(xiàn)思路
1、本技術(shù)實施例提供了一種數(shù)據(jù)的處理方法和裝置、存儲介質(zhì)及電子設(shè)備,以至少解決由于常規(guī)動態(tài)模式與局部可執(zhí)行模式下的線程局部存儲變量的尋址方式不同,導(dǎo)致補丁函數(shù)加載失敗的技術(shù)問題。
2、根據(jù)本技術(shù)實施例的一個方面,提供了一種數(shù)據(jù)的處理方法,包括:在目標(biāo)進(jìn)程需要加載動態(tài)鏈接庫的情況下,根據(jù)補丁函數(shù)關(guān)聯(lián)的代碼片段確定所述補丁函數(shù)需要訪問的目標(biāo)線程局部存儲變量對應(yīng)的變量標(biāo)識和對應(yīng)的匯編代碼的起始位置,其中,所述動態(tài)鏈接庫包括所述補丁函數(shù);查找可執(zhí)行文件中是否存在具有所述變量標(biāo)識的目標(biāo)重定位信息,在未查找到所述目標(biāo)重定位信息的情況下,確定所述目標(biāo)線程局部存儲變量的訪問方式為局部可執(zhí)行模式;在所述目標(biāo)線程局部存儲變量的訪問方式為所述局部可執(zhí)行模式的情況下,根據(jù)所述變量標(biāo)識在所述可執(zhí)行文件中確定具有所述變量標(biāo)識的同名線程局部存儲變量,以及所述同名線程局部存儲變量的目標(biāo)偏移;根據(jù)所述目標(biāo)偏移修改所述同名線程局部存儲變量對應(yīng)的匯編代碼,得到目標(biāo)匯編代碼;使用所述目標(biāo)匯編代碼替換所述起始位置對應(yīng)的初始匯編代碼,并將所述目標(biāo)線程局部存儲變量的重定位類型修改為禁止重定位,更新并加載所述動態(tài)鏈接庫。
3、根據(jù)本技術(shù)實施例的另一方面,還提供了一種數(shù)據(jù)的處理裝置,包括:確定模塊,用于在目標(biāo)進(jìn)程需要加載動態(tài)鏈接庫的情況下,根據(jù)補丁函數(shù)關(guān)聯(lián)的代碼片段確定所述補丁函數(shù)需要訪問的目標(biāo)線程局部存儲變量對應(yīng)的變量標(biāo)識和對應(yīng)的匯編代碼的起始位置,其中,所述動態(tài)鏈接庫包括所述補丁函數(shù);查找模塊,用于查找可執(zhí)行文件中是否存在具有所述變量標(biāo)識的目標(biāo)重定位信息,在未查找到所述目標(biāo)重定位信息的情況下,確定所述目標(biāo)線程局部存儲變量的訪問方式為局部可執(zhí)行模式;執(zhí)行模塊,用于在所述目標(biāo)線程局部存儲變量的訪問方式為所述局部可執(zhí)行模式的情況下,根據(jù)所述變量標(biāo)識在所述可執(zhí)行文件中確定具有所述變量標(biāo)識的同名線程局部存儲變量,以及所述同名線程局部存儲變量的目標(biāo)偏移;修改模塊,用于根據(jù)所述目標(biāo)偏移修改所述同名線程局部存儲變量對應(yīng)的匯編代碼,得到目標(biāo)匯編代碼;替換模塊,用于使用所述目標(biāo)匯編代碼替換所述起始位置對應(yīng)的初始匯編代碼,并將所述目標(biāo)線程局部存儲變量的重定位類型修改為禁止重定位,更新并加載所述動態(tài)鏈接庫。
4、可選地,所述裝置用于通過如下方式根據(jù)所述補丁函數(shù)關(guān)聯(lián)的代碼片段確定所述補丁函數(shù)需要訪問的目標(biāo)線程局部存儲變量對應(yīng)的變量標(biāo)識和對應(yīng)的匯編代碼的起始位置:遍歷所述動態(tài)鏈接庫對應(yīng)的內(nèi)存,查找所述代碼片段,其中,所述代碼片段的第一部分字節(jié)為預(yù)設(shè)格式,所述代碼片段包括所述第一部分字節(jié);基于所述代碼片段和所述動態(tài)鏈接庫對應(yīng)的重定位表確定所述變量標(biāo)識和所述起始位置。
5、可選地,所述裝置用于通過如下方式基于所述代碼片段和所述動態(tài)鏈接庫對應(yīng)的重定位表確定所述變量標(biāo)識和所述起始位置,包括:根據(jù)所述代碼片段的第二部分字節(jié)確定與寄存器之間的第一偏移值,其中,所述代碼片段包括所述第二部分字節(jié);獲取所述寄存器的下一條操作指令的地址;根據(jù)所述第一偏移值與所述地址的和值在所述重定位表中確定所述變量標(biāo)識和所述起始位置。
6、可選地,所述裝置用于通過如下方式查找可執(zhí)行文件中是否存在具有所述變量標(biāo)識的目標(biāo)重定位信息,在未查找到所述目標(biāo)重定位信息的情況下,確定所述目標(biāo)線程局部存儲變量的訪問方式為局部可執(zhí)行模式:獲取所述可執(zhí)行文件的符號信息;在所述符號信息為預(yù)設(shè)類型的情況下,確定所述可執(zhí)行文件包括所述目標(biāo)線程局部存儲變量;在所述可執(zhí)行文件中查找是否存在具有所述變量標(biāo)識的所述目標(biāo)重定位信息;在未查找到所述目標(biāo)重定位信息的情況下,確定所述目標(biāo)線程局部存儲變量的訪問方式為所述局部可執(zhí)行模式。
7、可選地,所述裝置用于通過如下方式在所述目標(biāo)線程局部存儲變量的訪問方式為所述局部可執(zhí)行模式的情況下,根據(jù)所述變量標(biāo)識在所述可執(zhí)行文件中確定具有所述變量標(biāo)識的同名線程局部存儲變量,以及所述同名線程局部存儲變量的目標(biāo)偏移:在所述目標(biāo)線程局部存儲變量的訪問方式為所述局部可執(zhí)行模式的情況下,根據(jù)所述變量標(biāo)識在所述可執(zhí)行文件中確定具有所述變量標(biāo)識的同名線程局部存儲變量;獲取所述同名線程局部存儲變量在線程局部存儲空間的第二偏移以及所述線程局部存儲空間的對齊尺寸;根據(jù)所述第二偏移和所述對齊尺寸確定所述目標(biāo)偏移。
8、可選地,所述裝置用于通過如下方式根據(jù)所述第二偏移和所述對齊尺寸確定所述目標(biāo)偏移:確定所述線程局部存儲空間中的最后一個線程局部存儲變量對應(yīng)的第三偏移;將所述第三偏移與所述對齊尺寸之和確定為指針偏移;將所述第二偏移與所述指針偏移之差確定為所述目標(biāo)偏移。
9、可選地,所述裝置用于根據(jù)所述目標(biāo)偏移修改所述同名線程局部存儲變量對應(yīng)的匯編代碼,得到目標(biāo)匯編代碼:獲取所述同名線程局部存儲變量對應(yīng)的匯編代碼,其中,所述同名線程局部存儲變量對應(yīng)的匯編代碼至少包括4個字節(jié);根據(jù)所述目標(biāo)偏移對所述同名線程局部存儲變量對應(yīng)的匯編代碼的最后4個字節(jié)進(jìn)行修改,得到所述目標(biāo)匯編代碼。
10、根據(jù)本技術(shù)實施例的又一方面,還提供了一種計算機可讀的存儲介質(zhì),該計算機可讀的存儲介質(zhì)中存儲有計算機程序,其中,該計算機程序被設(shè)置為運行時執(zhí)行上述數(shù)據(jù)的處理方法。
11、根據(jù)本技術(shù)實施例的又一方面,提供一種計算機程序產(chǎn)品或計算機程序,該計算機程序產(chǎn)品或計算機程序包括計算機指令,該計算機指令存儲在計算機可讀存儲介質(zhì)中。計算機設(shè)備的處理器從計算機可讀存儲介質(zhì)讀取該計算機指令,處理器執(zhí)行該計算機指令,使得該計算機設(shè)備執(zhí)行如以上數(shù)據(jù)的處理方法。
12、根據(jù)本技術(shù)實施例的又一方面,還提供了一種電子設(shè)備,包括存儲器和處理器,上述存儲器中存儲有計算機程序,上述處理器被設(shè)置為通過所述計算機程序執(zhí)行上述的數(shù)據(jù)的處理方法。
13、在本技術(shù)實施例中,采用在目標(biāo)進(jìn)程需要加載動態(tài)鏈接庫的情況下,根據(jù)補丁函數(shù)關(guān)聯(lián)的代碼片段確定補丁函數(shù)需要訪問的目標(biāo)線程局部存儲變量對應(yīng)的變量標(biāo)識和對應(yīng)的匯編代碼的起始位置,其中,動態(tài)鏈接庫包括補丁函數(shù);查找可執(zhí)行文件中是否存在具有變量標(biāo)識的目標(biāo)重定位信息,在未查找到目標(biāo)重定位信息的情況下,確定目標(biāo)線程局部存儲變量的訪問方式為局部可執(zhí)行模式;在目標(biāo)線程局部存儲變量的訪問方式為局部可執(zhí)行模式的情況下,根據(jù)變量標(biāo)識在可執(zhí)行文件中確定具有變量標(biāo)識的同名線程局部存儲變量,以及同名線程局部存儲變量的目標(biāo)偏移;根據(jù)目標(biāo)偏移修改同名線程局部存儲變量對應(yīng)的匯編代碼,得到目標(biāo)匯編代碼;使用目標(biāo)匯編代碼替換起始位置對應(yīng)的初始匯編代碼,并將目標(biāo)線程局部存儲變量的重定位類型修改為禁止重定位,更新并加載動態(tài)鏈接庫的方式,從而,解除補丁函數(shù)里使用目標(biāo)線程局部存儲變量的重定位依賴,使得補丁函數(shù)得以被成功加載,進(jìn)一步地,解決了由于常規(guī)動態(tài)模式與局部可執(zhí)行模式下的線程局部存儲變量的尋址方式不同,導(dǎo)致補丁函數(shù)加載失敗的技術(shù)問題。