麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

軟件的函數修改方法

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

【發明內容】

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

【附圖說明】】
[0034]圖1為本發明中軟件的函數修改方法的較佳實施例流程示意圖。
【【具體實施方式】】 [0035]以下各實施例的說明是參考附加的圖式,用以例示本發明可用以實施的特定實施例。本發明所提到的方向用語,例如「上」、「下」、「前」、「后」、「左」、「右」、「內」、「外」、「側面」等,僅是參考附加圖式的方向。因此,使用的方向用語是用以說明及理解本發明,而非用以限制本發明。在圖中,結構相似的單元是以相同標號表示。
[0036]請參閱圖1,圖1為本發明中軟件的函數修改方法的較佳實施例流程示意圖。
[0037]在步驟SlOl中,預先在原函數的運行空間中設置啟動器。
[0038]譬如利用進程注入技術,將一啟動器注入到軟件運行空間中,其中在該軟件運行空間中運行有原函數。而該啟動器用于加載替代函數,即負責將替代函數的代碼加載至軟件運行空間。 [0039]在步驟S102中,獲取配置文件中的原函數簽名列表,其中所述原函數簽名列表中包括有原函數的簽名。
[0040]在步驟S103中,判斷原函數的簽名對應的原函數是否存在于軟件運行空間中,若是,則進行步驟S104 ;否則繼續進行步驟S102。
[0041]在步驟S104中,按照所述原函數的簽名生成一替代函數,其中所述替代函數的簽名具有一替代標識。
[0042]譬如所述原函數的簽名為下式(I):
[0043]int func_hello (void*, int)(I)
[0044]則將上式(I)中的原函數簽名添加一替代標識“pitc_”,生成一替代函數,該替代函數的簽名請參閱下式(2):
[0045]int pitc_func_hello (void*, int)(2)
[0046]在步驟S105中,將替代函數中非通用類型的特征替換為通用類型的特征,其中在該通用類型下,所述替代函數可適用于適應任意的函數的參數類型。
[0047]譬如以以下三種情況為例進行說明:
[0048]第一、如果原函數簽名中有非通用類型的指針,則將該非通用類型的指針替換為通用類型指針,該通用類型指針優選為void*。
[0049]譬如一原函數的簽名為下式(3):
[0050]void ptr_func (st_obj *p_obj)(3)
[0051]其中上式(3)中的原函數的簽名包含有非通用類型的指針“st_obj”;本發明將該非通用類型的指針“st_obj”替換為一通用類型的指針void*,則生成的替代函數的簽名為下式(4):
[0052]void pitc_ptr_func(void *p_obj)(4)
[0053]其中上式(4)的替代函數的簽名中包括有替代標識“pitc_”。
[0054]第二、如果原函數的簽名中具有傳遞C語音的第一結構體(struct),本發明則生成一第二結構體,并將該第二結構體寫入到文本文件中,其中該第二結構體與所述第一結構體的大小相同。
[0055]譬如包含第一結構體的原函數的簽名為下式(5):
[0056]void st_func (struct st_type st_obj);
[0057]struct st_type{
[0058]int a;
[0059]int b;
[0060]} ;(5)[0061]則本發明生成一具有第二結構體的替代函數,該替代函數的簽名請參閱下式(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)中替代函數的簽名同樣包括替代標識“pitc_”。
[0067]第三、如果原函數為C++函數,則原函數的簽名中包括有非通用類型的符號“:”,本發明將該非通用類型的符號“:”替換成通用類型的符號"_",同時在原函數的簽名中添加替換標識,以生成替代函數。
[0068]本發明將非通用類型的特征替換成通用類型特征后,可減少所述替代函數對腳本編譯的依賴,在后續對替代函數進行編譯時,無需獲知不同類型特征的定義,譬如無需獲知不同類型指針的定義。
[0069]在步驟S106中,將已轉換為通用類型特征的替代函數編譯成替代機器碼(opcode),并將替代機器碼通過步驟SlOl中設置的啟動器加載到原函數的軟件運行空間中,同時記錄導入到該軟件運行空間中的替代加載碼的地址。
[0070]譬如以以下兩種情況為例進行說明:
[0071]第一、以TCC (Tiny C Compiler)編譯器為例,通過TCC編譯器中的應用程序編程接口(Application Programming Interface, API):tcc_add_symbol 將替代函數的符號導入到替代函數的編譯過程中,譬如將編碼“statistics_inf0_bef0re”導入到替代函數的編譯過程中。由于TCC編譯器可將函數編碼直接編譯到內存,所以無需導入,僅僅需要調用API:tcc_add_file (添加文件)即可。
[0072]第二、以GCC編譯器為例,首先將替代函數保存為一個.c文件,同時通過編碼“statistics_info_before”將該.c文件編譯成一個動態鏈接庫,之后通過AP1:dlopen將上述動態鏈接庫導入到運行空間中。
[0073]在步驟S106中,將原函數的函數體的開始部分的機器碼,修改為跳轉指令(jmp)到所述替代機器碼,并執 行所述替代機器碼對應的替代函數。
[0074]本發明中,所述在生成替代函數的過程中,還可生成以下編碼:
[0075]替代標識添加編碼,其用于添加替代標識,譬如請參閱下式(7):
[0076]int pitc_func_hello(void *ptr, int i){ //(7)
[0077]原函數修復編碼,其用于修復原函數為原始狀態,譬如請參閱下式(8):
[0078]repair_old_func () ; //(8)
[0079]信息獲取編碼,其用于獲取信息,該編碼可調用一個位于動態庫中的可以用戶自行定制的函數,用于統計用戶感興趣的信息。譬如請參閱下式(9):
[0080]statistics_info_beforeO ; //(9)
[0081]函數調用編碼,其用于調用原函數或者修改原函數的其他版本。譬如請參閱下式
(10):
[0082]call_old_func (ptr, i) ; //(10)
[0083]執行信息獲取編碼,其用于獲取執行后的信息,獲取執行后的信息;譬如請參閱下式(11):[0084]statistics_info_after(); //(11)
[0085]修改編碼,其用于將原函數修改會hook狀態,譬如請參閱下式(12):
[0086]repair_hook_func () ; //(12)
[0087]本發明在獲取軟件運行空間中的原函數簽名后,按照原函數簽名生成一替代函數簽名,并將替代函數簽名中非通用類型的特征轉換為通用類型的特征,其中在該通用類型的特征下,替代函數簽名可適用于任意函數,之后將轉換后的替代函數加載至軟件運行空間,并按照替代函數執行軟件。顯然本發明無需針對每一原函數編寫一相同的替代函數即可修改各種類型的原函數,不僅效率高,而且成本較低。
[0088]綜上所述,雖然本發明已以優選實施例揭露如上,但上述優選實施例并非用以限制本發明,本領域的普通技術人員,在不脫離本發明的精神和范圍內,均可作各種更動與潤飾,因此本發明的保護范圍以權利要求界定的范圍為準。
【權利要求】
1.一種軟件的函數修改方法,其特征在于:包括以下步驟: 獲取軟件運行空間中的原函數簽名; 按照所述原函數簽名生成一替代函數,其中所述替代函數的簽名中包括替代標識; 將所述替代函數中非通用類型的特征轉換為通用類型的特征,其中在該通用類型的特征下,所述替代函數可適用于任意函數; 將轉換后的替代函數加載至軟件運行空間; 按照所述替代函數執行軟件。
2.根據權利要求1所述的軟件的函數修改方法,其特征在于:獲取軟件運行空間中的原函數簽名的步驟具體包括: 獲取配置文件中的原函數簽名列表,并判斷原函數的簽名對應的原函數是否存在于運行空間中,若是,則獲取軟件運行空間中的原函數簽名;其中所述原函數簽名列表中包括有原函數的簽名。
3.根據權利要求1所述的軟件的函數修改方法,其特征在于:將轉換后的替代函數加載至軟件運行空間的步驟具體包括: 將轉換后的替代函數編譯成替代機器碼,并將該替代機器碼加載到軟件運行空間。
4.根據權利要求3所述的軟件的函數修改方法,其特征在于:按照所述替代函數執行軟件的步驟具體包括: 將原函數的開始部分的機器碼,修改為跳轉指令到所述替代機器碼,并按照所述替代機器碼執行軟件。
5.根據權利要求1所述的軟件的函數修改方法,其特征在于:將替換后的替代函數加載至軟件的運行空間的步驟之后,所述方法還包括以下步驟: 記錄加載到運行空間中的替代函數的地址。
6.根據權利要求2所述的軟件的函數修改方法,其特征在于:獲取配置文件中的原函數簽名列表的步驟之前,所述方法還包括以下步驟: 預先在原函數的運行空間中設置啟動器,該啟動器用于將所述替代函數加載至軟件的運行空間中。
7.根據權利要求1所述的軟件的函數修改方法,其特征在于:將所述替代函數中非通用類型的特征替換為通用類型的特征的步驟具體包括: 若所述原函數的簽名中有類型指針,則將該類型指針替換為通用類型指針void*。
8.根據權利要求1所述的軟件的函數修改方法,其特征在于:將所述替代函數中非通用類型的特征替換為通用類型的特征的步驟具體包括: 若所述原函數的簽名為一 C++函數,則將所述原函數的簽名中的“:”替換為",并在所述替代函數簽名的參數前添加一指針參數。
9.根據權利要求1所述的軟件的函數修改方法,其特征在于:將替換后的替代函數加載至軟件的運行空間中的步驟具體包括: 通過編譯器中的應用程序編程接口將替代函數的符號導入到替代函數的編譯過程。
10.根據權利要求1所述的軟件的函數修改方法,其特征在于:將替換后的替代函數加載至軟件的運行空間中的步驟具體包括: 通過編譯器將替代函數保存為一個.C文件,同時將該.C文件編譯成一個動態鏈接庫,之后通過應用程序編程接口將上述動態鏈接庫導入到軟件的運行空間中。
11.根據權利要求1所述的軟件的函數修改方法,其特征在于:按照所述原函數簽名生成一替代函數簽名時,還包括`以下步驟:生成信息獲取編碼用于統計客戶端的信息。
【文檔編號】G06F9/44GK103677790SQ201210362533
【公開日】2014年3月26日 申請日期:2012年9月26日 優先權日:2012年9月26日
【發明者】侯健 申請人:騰訊科技(深圳)有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 平顺县| 嵊泗县| 利川市| 韩城市| 贵阳市| 锡林郭勒盟| 绥芬河市| 台南市| 宜兰县| 濉溪县| 永善县| 孙吴县| 丹棱县| 太仆寺旗| 长宁县| 拜城县| 甘德县| 永春县| 获嘉县| 延川县| 克东县| 青岛市| 祁东县| 丹寨县| 镇原县| 和平区| 满洲里市| 塘沽区| 黄龙县| 潞西市| 山阳县| 固原市| 阿图什市| 永泰县| 三明市| 双鸭山市| 海伦市| 甘孜| 大化| 当雄县| 和硕县|