欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

軟件的函數(shù)修改方法

文檔序號:6489231閱讀:227來源:國知局
軟件的函數(shù)修改方法
【專利摘要】本發(fā)明提供一種軟件的函數(shù)修改方法,包括:獲取軟件運行空間中的原函數(shù)簽名;按照所述原函數(shù)簽名生成一替代函數(shù),其中所述替代函數(shù)的簽名中包括替代標(biāo)識;將所述替代函數(shù)中非通用類型的特征轉(zhuǎn)換為通用類型的特征,其中在該通用類型的特征下,所述替代函數(shù)可適用于任意函數(shù);將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間;按照所述替代函數(shù)執(zhí)行軟件。本發(fā)明無需針對每一原函數(shù)編寫一相同的替代函數(shù)即可修改各種類型的原函數(shù),不僅效率高,而且成本較低。
【專利說明】軟件的函數(shù)修改方法
【【技術(shù)領(lǐng)域】】
[0001]本發(fā)明涉及軟件【技術(shù)領(lǐng)域】,特別是涉及一種軟件的函數(shù)修改方法。
【【背景技術(shù)】】
[0002]隨著各種軟件的不斷增多,客戶端對軟件功能的要求越來越高。
[0003]以函數(shù)Hook技術(shù)為例,通過Hook技術(shù),可修改函數(shù)的二進制編碼,從而修改函數(shù),進而達到修改軟件的目的。譬如可通過Hook技術(shù)關(guān)閉原函數(shù)、修改原函數(shù),或者進行軟件的調(diào)試、重建等。
[0004]而現(xiàn)有的Hook技術(shù),需要通過修改編碼來修改原函數(shù),在調(diào)用原函數(shù)時,需調(diào)用一個劫持者提供的替代函數(shù)。為了保證劫持過程中函數(shù)的棧平衡,需要原函數(shù)和替代函數(shù)的函數(shù)傳入?yún)?shù)必須完全一致,這樣就需要針對不同的原函數(shù),編寫針對性的替代函數(shù)。
[0005]綜上,如何解決現(xiàn)有技術(shù)中在修改軟件中函數(shù)時,需針對每一原函數(shù)編寫一相同的替代函數(shù),導(dǎo)致效率低下,成本較高的技術(shù)問題,是軟件【技術(shù)領(lǐng)域】研究的方向之一。

【發(fā)明內(nèi)容】

[0006]本發(fā)明的一個目的在于提供一種軟件的函數(shù)修改方法,以解決現(xiàn)有技術(shù)中在修改軟件中函數(shù)時,需針對每一原函數(shù)編寫一相同的替代函數(shù),導(dǎo)致效率低下,成本較高的技術(shù)問題。
[0007]為解決上述技術(shù)問題,本發(fā)明構(gòu)造了一種軟件的函數(shù)修改方法,包括以下步驟:
[0008]獲取軟件運行空間中的原函數(shù)簽名;
[0009]按照所述原函數(shù)簽名生成一替代函數(shù),其中所述替代函數(shù)的簽名中包括替代標(biāo)識;
[0010]將所述替代函數(shù)中非通用類型的特征轉(zhuǎn)換為通用類型的特征,其中在該通用類型的特征下,所述替代函數(shù)可適用于任意函數(shù);
[0011]將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間;
[0012]按照所述替代函數(shù)執(zhí)行軟件。
[0013]在本發(fā)明一實施例中:獲取軟件運行空間中的原函數(shù)簽名的步驟具體包括:
[0014]獲取配置文件中的原函數(shù)簽名列表,并判斷原函數(shù)的簽名對應(yīng)的原函數(shù)是否存在于運行空間中,若是,則獲取軟件運行空間中的原函數(shù)簽名;其中所述原函數(shù)簽名列表中包括有原函數(shù)的簽名。
[0015]在本發(fā)明一實施例中:將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間的步驟具體包括:
[0016]將轉(zhuǎn)換后的替代函數(shù)編譯成替代機器碼,并將該替代機器碼加載到軟件運行空間。
[0017]在本發(fā)明一實施例中:按照所述替代函數(shù)執(zhí)行軟件的步驟具體包括:
[0018]將原函數(shù)的開始部分的機器碼,修改為跳轉(zhuǎn)指令到所述替代機器碼,并按照所述替代機器碼執(zhí)行軟件。
[0019]在本發(fā)明一實施例中:將替換后的替代函數(shù)加載至軟件的運行空間的步驟之后,所述方法還包括以下步驟:
[0020]記錄加載到運行空間中的替代函數(shù)的地址。
[0021]在本發(fā)明一實施例中:獲取配置文件中的原函數(shù)簽名列表的步驟之前,所述方法還包括以下步驟:
[0022]預(yù)先在原函數(shù)的運行空間中設(shè)置啟動器,該啟動器用于將所述替代函數(shù)加載至軟件的運行空間中。
[0023]在本發(fā)明一實施例中:將所述替代函數(shù)中非通用類型的特征替換為通用類型的特征的步驟具體包括:
[0024]若所述原函數(shù)的簽名中有類型指針,則將該類型指針替換為通用類型指針void*:
[0025]在本發(fā)明一實施例中:將所述替代函數(shù)中非通用類型的特征替換為通用類型的特征的步驟具體包括:
[0026]若所述原函數(shù)的簽名為一 C++函數(shù),則將所述原函數(shù)的簽名中的“:”替換為〃_〃,并在所述替代函數(shù)簽名的參數(shù)前添加一個指針參數(shù)。
[0027]在本發(fā)明一實施例中:將替換后的替代函數(shù)加載至軟件的運行空間中的步驟具體包括:
[0028]通過編譯器中的應(yīng)用程序編程接口將替代函數(shù)的符號導(dǎo)入到替代函數(shù)的編譯過程。
[0029]在本發(fā)明一實施例中:將替換后的替代函數(shù)加載至軟件的運行空間中的步驟具體包括:
[0030]通過編譯器將替代函數(shù)保存為一個.c文件,同時將該.c文件編譯成一個動態(tài)鏈接庫,之后通過應(yīng)用程序編程接口將上述動態(tài)鏈接庫導(dǎo)入到軟件的運行空間中。
[0031]在本發(fā)明一實施例中:按照所述原函數(shù)簽名生成一替代函數(shù)簽名時,還包括以下步驟:生成信息獲取編碼用于統(tǒng)計客戶端的信息。
[0032]相對于現(xiàn)有技術(shù),本發(fā)明在獲取軟件運行空間中的原函數(shù)簽名后,按照原函數(shù)簽名生成一替代函數(shù)簽名,并將替代函數(shù)簽名中非通用類型的特征轉(zhuǎn)換為通用類型的特征,其中在該通用類型的特征下,替代函數(shù)簽名可適用于任意函數(shù),之后將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間,并按照替代函數(shù)執(zhí)行軟件。顯然本發(fā)明無需針對每一原函數(shù)編寫一相同的替代函數(shù)即可修改各種類型的原函數(shù),不僅效率高,而且成本較低。
[0033]為讓本發(fā)明的上述內(nèi)容能更明顯易懂,下文特舉優(yōu)選實施例,并配合所附圖式,作詳細說明如下:
【【專利附圖】

【附圖說明】】
[0034]圖1為本發(fā)明中軟件的函數(shù)修改方法的較佳實施例流程示意圖。
【【具體實施方式】】 [0035]以下各實施例的說明是參考附加的圖式,用以例示本發(fā)明可用以實施的特定實施例。本發(fā)明所提到的方向用語,例如「上」、「下」、「前」、「后」、「左」、「右」、「內(nèi)」、「外」、「側(cè)面」等,僅是參考附加圖式的方向。因此,使用的方向用語是用以說明及理解本發(fā)明,而非用以限制本發(fā)明。在圖中,結(jié)構(gòu)相似的單元是以相同標(biāo)號表示。
[0036]請參閱圖1,圖1為本發(fā)明中軟件的函數(shù)修改方法的較佳實施例流程示意圖。
[0037]在步驟SlOl中,預(yù)先在原函數(shù)的運行空間中設(shè)置啟動器。
[0038]譬如利用進程注入技術(shù),將一啟動器注入到軟件運行空間中,其中在該軟件運行空間中運行有原函數(shù)。而該啟動器用于加載替代函數(shù),即負責(zé)將替代函數(shù)的代碼加載至軟件運行空間。 [0039]在步驟S102中,獲取配置文件中的原函數(shù)簽名列表,其中所述原函數(shù)簽名列表中包括有原函數(shù)的簽名。
[0040]在步驟S103中,判斷原函數(shù)的簽名對應(yīng)的原函數(shù)是否存在于軟件運行空間中,若是,則進行步驟S104 ;否則繼續(xù)進行步驟S102。
[0041]在步驟S104中,按照所述原函數(shù)的簽名生成一替代函數(shù),其中所述替代函數(shù)的簽名具有一替代標(biāo)識。
[0042]譬如所述原函數(shù)的簽名為下式(I):
[0043]int func_hello (void*, int)(I)
[0044]則將上式(I)中的原函數(shù)簽名添加一替代標(biāo)識“pitc_”,生成一替代函數(shù),該替代函數(shù)的簽名請參閱下式(2):
[0045]int pitc_func_hello (void*, int)(2)
[0046]在步驟S105中,將替代函數(shù)中非通用類型的特征替換為通用類型的特征,其中在該通用類型下,所述替代函數(shù)可適用于適應(yīng)任意的函數(shù)的參數(shù)類型。
[0047]譬如以以下三種情況為例進行說明:
[0048]第一、如果原函數(shù)簽名中有非通用類型的指針,則將該非通用類型的指針替換為通用類型指針,該通用類型指針優(yōu)選為void*。
[0049]譬如一原函數(shù)的簽名為下式(3):
[0050]void ptr_func (st_obj *p_obj)(3)
[0051]其中上式(3)中的原函數(shù)的簽名包含有非通用類型的指針“st_obj”;本發(fā)明將該非通用類型的指針“st_obj”替換為一通用類型的指針void*,則生成的替代函數(shù)的簽名為下式(4):
[0052]void pitc_ptr_func(void *p_obj)(4)
[0053]其中上式(4)的替代函數(shù)的簽名中包括有替代標(biāo)識“pitc_”。
[0054]第二、如果原函數(shù)的簽名中具有傳遞C語音的第一結(jié)構(gòu)體(struct),本發(fā)明則生成一第二結(jié)構(gòu)體,并將該第二結(jié)構(gòu)體寫入到文本文件中,其中該第二結(jié)構(gòu)體與所述第一結(jié)構(gòu)體的大小相同。
[0055]譬如包含第一結(jié)構(gòu)體的原函數(shù)的簽名為下式(5):
[0056]void st_func (struct st_type st_obj);
[0057]struct st_type{
[0058]int a;
[0059]int b;
[0060]} ;(5)[0061]則本發(fā)明生成一具有第二結(jié)構(gòu)體的替代函數(shù),該替代函數(shù)的簽名請參閱下式(6):
[0062]void pitc_st_func (struct st_pitc_type st_obj);
[0063]struct st_pitc_type {
[0064]char val[8];
[0065]} ;(6)
[0066]其中上式(6)中替代函數(shù)的簽名同樣包括替代標(biāo)識“pitc_”。
[0067]第三、如果原函數(shù)為C++函數(shù),則原函數(shù)的簽名中包括有非通用類型的符號“:”,本發(fā)明將該非通用類型的符號“:”替換成通用類型的符號"_",同時在原函數(shù)的簽名中添加替換標(biāo)識,以生成替代函數(shù)。
[0068]本發(fā)明將非通用類型的特征替換成通用類型特征后,可減少所述替代函數(shù)對腳本編譯的依賴,在后續(xù)對替代函數(shù)進行編譯時,無需獲知不同類型特征的定義,譬如無需獲知不同類型指針的定義。
[0069]在步驟S106中,將已轉(zhuǎn)換為通用類型特征的替代函數(shù)編譯成替代機器碼(opcode),并將替代機器碼通過步驟SlOl中設(shè)置的啟動器加載到原函數(shù)的軟件運行空間中,同時記錄導(dǎo)入到該軟件運行空間中的替代加載碼的地址。
[0070]譬如以以下兩種情況為例進行說明:
[0071]第一、以TCC (Tiny C Compiler)編譯器為例,通過TCC編譯器中的應(yīng)用程序編程接口(Application Programming Interface, API):tcc_add_symbol 將替代函數(shù)的符號導(dǎo)入到替代函數(shù)的編譯過程中,譬如將編碼“statistics_inf0_bef0re”導(dǎo)入到替代函數(shù)的編譯過程中。由于TCC編譯器可將函數(shù)編碼直接編譯到內(nèi)存,所以無需導(dǎo)入,僅僅需要調(diào)用API:tcc_add_file (添加文件)即可。
[0072]第二、以GCC編譯器為例,首先將替代函數(shù)保存為一個.c文件,同時通過編碼“statistics_info_before”將該.c文件編譯成一個動態(tài)鏈接庫,之后通過AP1:dlopen將上述動態(tài)鏈接庫導(dǎo)入到運行空間中。
[0073]在步驟S106中,將原函數(shù)的函數(shù)體的開始部分的機器碼,修改為跳轉(zhuǎn)指令(jmp)到所述替代機器碼,并執(zhí) 行所述替代機器碼對應(yīng)的替代函數(shù)。
[0074]本發(fā)明中,所述在生成替代函數(shù)的過程中,還可生成以下編碼:
[0075]替代標(biāo)識添加編碼,其用于添加替代標(biāo)識,譬如請參閱下式(7):
[0076]int pitc_func_hello(void *ptr, int i){ //(7)
[0077]原函數(shù)修復(fù)編碼,其用于修復(fù)原函數(shù)為原始狀態(tài),譬如請參閱下式(8):
[0078]repair_old_func () ; //(8)
[0079]信息獲取編碼,其用于獲取信息,該編碼可調(diào)用一個位于動態(tài)庫中的可以用戶自行定制的函數(shù),用于統(tǒng)計用戶感興趣的信息。譬如請參閱下式(9):
[0080]statistics_info_beforeO ; //(9)
[0081]函數(shù)調(diào)用編碼,其用于調(diào)用原函數(shù)或者修改原函數(shù)的其他版本。譬如請參閱下式
(10):
[0082]call_old_func (ptr, i) ; //(10)
[0083]執(zhí)行信息獲取編碼,其用于獲取執(zhí)行后的信息,獲取執(zhí)行后的信息;譬如請參閱下式(11):[0084]statistics_info_after(); //(11)
[0085]修改編碼,其用于將原函數(shù)修改會hook狀態(tài),譬如請參閱下式(12):
[0086]repair_hook_func () ; //(12)
[0087]本發(fā)明在獲取軟件運行空間中的原函數(shù)簽名后,按照原函數(shù)簽名生成一替代函數(shù)簽名,并將替代函數(shù)簽名中非通用類型的特征轉(zhuǎn)換為通用類型的特征,其中在該通用類型的特征下,替代函數(shù)簽名可適用于任意函數(shù),之后將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間,并按照替代函數(shù)執(zhí)行軟件。顯然本發(fā)明無需針對每一原函數(shù)編寫一相同的替代函數(shù)即可修改各種類型的原函數(shù),不僅效率高,而且成本較低。
[0088]綜上所述,雖然本發(fā)明已以優(yōu)選實施例揭露如上,但上述優(yōu)選實施例并非用以限制本發(fā)明,本領(lǐng)域的普通技術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),均可作各種更動與潤飾,因此本發(fā)明的保護范圍以權(quán)利要求界定的范圍為準(zhǔn)。
【權(quán)利要求】
1.一種軟件的函數(shù)修改方法,其特征在于:包括以下步驟: 獲取軟件運行空間中的原函數(shù)簽名; 按照所述原函數(shù)簽名生成一替代函數(shù),其中所述替代函數(shù)的簽名中包括替代標(biāo)識; 將所述替代函數(shù)中非通用類型的特征轉(zhuǎn)換為通用類型的特征,其中在該通用類型的特征下,所述替代函數(shù)可適用于任意函數(shù); 將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間; 按照所述替代函數(shù)執(zhí)行軟件。
2.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:獲取軟件運行空間中的原函數(shù)簽名的步驟具體包括: 獲取配置文件中的原函數(shù)簽名列表,并判斷原函數(shù)的簽名對應(yīng)的原函數(shù)是否存在于運行空間中,若是,則獲取軟件運行空間中的原函數(shù)簽名;其中所述原函數(shù)簽名列表中包括有原函數(shù)的簽名。
3.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將轉(zhuǎn)換后的替代函數(shù)加載至軟件運行空間的步驟具體包括: 將轉(zhuǎn)換后的替代函數(shù)編譯成替代機器碼,并將該替代機器碼加載到軟件運行空間。
4.根據(jù)權(quán)利要求3所述的軟件的函數(shù)修改方法,其特征在于:按照所述替代函數(shù)執(zhí)行軟件的步驟具體包括: 將原函數(shù)的開始部分的機器碼,修改為跳轉(zhuǎn)指令到所述替代機器碼,并按照所述替代機器碼執(zhí)行軟件。
5.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將替換后的替代函數(shù)加載至軟件的運行空間的步驟之后,所述方法還包括以下步驟: 記錄加載到運行空間中的替代函數(shù)的地址。
6.根據(jù)權(quán)利要求2所述的軟件的函數(shù)修改方法,其特征在于:獲取配置文件中的原函數(shù)簽名列表的步驟之前,所述方法還包括以下步驟: 預(yù)先在原函數(shù)的運行空間中設(shè)置啟動器,該啟動器用于將所述替代函數(shù)加載至軟件的運行空間中。
7.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將所述替代函數(shù)中非通用類型的特征替換為通用類型的特征的步驟具體包括: 若所述原函數(shù)的簽名中有類型指針,則將該類型指針替換為通用類型指針void*。
8.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將所述替代函數(shù)中非通用類型的特征替換為通用類型的特征的步驟具體包括: 若所述原函數(shù)的簽名為一 C++函數(shù),則將所述原函數(shù)的簽名中的“:”替換為",并在所述替代函數(shù)簽名的參數(shù)前添加一指針參數(shù)。
9.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將替換后的替代函數(shù)加載至軟件的運行空間中的步驟具體包括: 通過編譯器中的應(yīng)用程序編程接口將替代函數(shù)的符號導(dǎo)入到替代函數(shù)的編譯過程。
10.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:將替換后的替代函數(shù)加載至軟件的運行空間中的步驟具體包括: 通過編譯器將替代函數(shù)保存為一個.C文件,同時將該.C文件編譯成一個動態(tài)鏈接庫,之后通過應(yīng)用程序編程接口將上述動態(tài)鏈接庫導(dǎo)入到軟件的運行空間中。
11.根據(jù)權(quán)利要求1所述的軟件的函數(shù)修改方法,其特征在于:按照所述原函數(shù)簽名生成一替代函數(shù)簽名時,還包括`以下步驟:生成信息獲取編碼用于統(tǒng)計客戶端的信息。
【文檔編號】G06F9/44GK103677790SQ201210362533
【公開日】2014年3月26日 申請日期:2012年9月26日 優(yōu)先權(quán)日:2012年9月26日
【發(fā)明者】侯健 申請人:騰訊科技(深圳)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
梁河县| 肃南| 游戏| 普定县| 乾安县| 句容市| 深水埗区| 油尖旺区| 万州区| 桓仁| 稻城县| 库尔勒市| 定边县| 扶风县| 新郑市| 丹棱县| 常州市| 崇仁县| 盐亭县| 定西市| 油尖旺区| 全南县| 上蔡县| 大姚县| 基隆市| 柏乡县| 聊城市| 舞钢市| 忻州市| 黎平县| 周口市| 武乡县| 金阳县| 天祝| 临武县| 时尚| 韩城市| 开封县| 鹿泉市| 张掖市| 定安县|