本發(fā)明涉及鉤取函數領域,特別涉及一種改進的鉤取技術的方法及裝置。
背景技術:
現有的鉤取技術是通過修改系統(tǒng)程序的入口地址處的五個字節(jié)的內容,從而跳轉至注入程序的入口地址,從而達到鉤取的目的。在修改系統(tǒng)程序的入口地址處的五個字節(jié)的內容前,需要保存系統(tǒng)函數的入口地址的前五個字節(jié)的內容。當運行完成鉤取函數之后,需要跳轉至系統(tǒng)程序的入口地址,此時就需要利用保存過的系統(tǒng)函數的入口地址處的前五個字節(jié)的內容來恢復原系統(tǒng)函數。但是在多線程環(huán)境中,過于頻繁的對系統(tǒng)程序的入口地址的前五個字節(jié)的內容進行修改操作和恢復操作,有可能會造成讀寫異常的情況發(fā)生,導致系統(tǒng)進程發(fā)生異常。如何解決上述問題,就成為了業(yè)界亟待解決的課題。
技術實現要素:
本發(fā)明提供一種改進的鉤取技術的方法及裝置,用以在使用鉤取技術時,避免發(fā)生讀寫異常的情況。
根據本發(fā)明實施例的第一方面,提供一種改進的鉤取技術的方法,包括:
當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容;
根據修改后的所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,跳轉至注入程序的入口地址;
在執(zhí)行完所述注入程序后,計算出所述系統(tǒng)程序的第一入口地址;
以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
本在一個實施例中,所述當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,包括:
當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容為短跳轉指令,所述短跳轉指令包括一個字節(jié)的短跳轉關鍵字和一個字節(jié)的短跳轉地址;
所述短跳轉地址指向所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址。
在一個實施例中,所述根據修改后的所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,跳轉至注入程序的入口地址,包括:
根據所述短跳轉指令,跳轉至所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址;
修改所述系統(tǒng)程序入口地址之前連續(xù)的五個字節(jié)的內容為跳轉指令,所述跳轉指令包括一個字節(jié)的跳轉關鍵字和四個字節(jié)的跳轉地址;
根據所述跳轉指令,跳轉至所述注入程序的入口地址。
在一個實施例中,所述在執(zhí)行完所述注入程序后,計算出所述系統(tǒng)程序的第一入口地址,包括:
在執(zhí)行完所述注入程序后,將所述系統(tǒng)程序的所述入口地址加上兩個字節(jié),得到新的地址;
確認所述新的地址為所述系統(tǒng)程序的第一入口地址。
在一個實施例中,所述以所述第一入口地址為起始地址,運行所述系統(tǒng)程序,包括:
跳轉至所述系統(tǒng)程序的第一入口地址;
以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
根據本發(fā)明實施例的第二方面,提供一種改進的鉤取技術的裝置,包括:
修改模塊,用于當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容;
跳轉模塊,用于根據修改后的所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,跳轉至注入程序的入口地址;
計算模塊,用于在執(zhí)行完所述注入程序后,計算出所述系統(tǒng)程序的第一入口地址;
運行模塊,用于以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
在一個實施例中,所述修改模塊,包括:
第一修改子模塊,用于當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容為短跳轉指令,所述短跳轉指令包括一個字節(jié)的短跳轉關鍵字和一個字節(jié)的短跳轉地址;
指向子模塊,用于所述短跳轉地址指向所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址。
在一個實施例中,所述跳轉模塊,包括:
第一跳轉子模塊,用于根據所述短跳轉指令,跳轉至所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址;
第二修改子模塊,用于修改所述系統(tǒng)程序入口地址之前連續(xù)的五個字節(jié)的內容為跳轉指令,所述跳轉指令包括一個字節(jié)的跳轉關鍵字和四個字節(jié)的跳轉地址;
第二跳轉子模塊,用于根據所述跳轉指令,跳轉至所述注入程序的入口地址。
在一個實施例中,所述計算模塊,包括:
相加子模塊,用于在執(zhí)行完所述注入程序后,將所述系統(tǒng)程序的所述入口地址加上兩個字節(jié),得到新的地址;
確認子模塊,用于確認所述新的地址為所述系統(tǒng)程序的第一入口地址。
在一個實施例中,所述運行模塊,包括:
第三跳轉子模塊,用于跳轉至所述系統(tǒng)程序的第一入口地址;
運行子模塊,用于以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
本發(fā)明的其它特征和優(yōu)點將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點可通過在所寫的說明書、權利要求書、以及附圖中所特別指出的結構來實現和獲得。
下面通過附圖和實施例,對本發(fā)明的技術方案做進一步的詳細描述。
附圖說明
附圖用來提供對本發(fā)明的進一步理解,并且構成說明書的一部分,與本發(fā)明的實施例一起用于解釋本發(fā)明,并不構成對本發(fā)明的限制。在附圖中:
圖1為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的流程圖;
圖2為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的步驟s11的流程圖;
圖3為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的步驟s12的流程圖;
圖4為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的步驟s13的流程圖;
圖5為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的步驟s14流程圖;
圖6a為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的方法的示意圖;
圖6b為本發(fā)明另一示例性實施例示出的一種改進的鉤取技術的方法的示意圖;
圖7為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的裝置的框圖;
圖8為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的裝置的修改模塊71的框圖;
圖9為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的裝置的跳轉模塊72的框圖;
圖10為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的裝置的計算模塊73的框圖;
圖11為本發(fā)明一示例性實施例示出的一種改進的鉤取技術的裝置的修改模塊74的框圖。
具體實施方式
以下結合附圖對本發(fā)明的優(yōu)選實施例進行說明,應當理解,此處所描述的優(yōu)選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。
現有的鉤取技術是通過修改系統(tǒng)程序的入口地址處的五個字節(jié)的內容,跳轉至注入程序的入口地址,從而達到鉤取的目的。在修改系統(tǒng)程序的入口地址處的五個字節(jié)的內容前,需要保存系統(tǒng)函數的入口地址的前五個字節(jié)的內容。當運行完成鉤取函數之后,需要跳轉至系統(tǒng)程序的入口地址,此時就需要利用保存過的系統(tǒng)函數的入口地址處的前五個字節(jié)的內容來恢復原系統(tǒng)函數。但是在多線程環(huán)境中,過于頻繁的對系統(tǒng)程序的入口地址的前五個字節(jié)的內容進行修改操作和恢復操作,有可能會造成讀寫異常的情況發(fā)生,導致系統(tǒng)進程發(fā)生異常。
圖1是根據一示例性實施例示出的一種改進的鉤取技術的方法流程圖,如圖1所示,該一種改進的鉤取技術的方法,包括以下步驟s11-s14:
在步驟s11中,當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容;
當監(jiān)測到系統(tǒng)程序被鉤取時,修改該系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容為短跳轉指令,該短跳轉指令包括一個字節(jié)的短跳轉關鍵字和一個字節(jié)的短跳轉地址;該短跳轉地址指向該系統(tǒng)程序入口地址之前的第五個字節(jié)的地址。
在步驟s12中,根據修改后的所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,跳轉至注入程序的入口地址;
根據該短跳轉指令,跳轉至該系統(tǒng)程序入口地址之前的第五個字節(jié)的地址;修改該系統(tǒng)程序入口地址之前連續(xù)的五個字節(jié)的內容為跳轉指令,該跳轉指令包括一個字節(jié)的跳轉關鍵字和四個字節(jié)的跳轉地址;根據該跳轉指令,跳轉至該注入程序的入口地址。
在步驟s13中,在執(zhí)行完所述注入程序后,計算出所述系統(tǒng)程序的第一入口地址;
在執(zhí)行完該注入程序后,將該系統(tǒng)程序的該入口地址加上兩個字節(jié),得到新的地址;確認該新的地址為該系統(tǒng)程序的第一入口地址。
在步驟s14中,以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
跳轉至該系統(tǒng)程序的第一入口地址;以該第一入口地址為起始地址,運行該系統(tǒng)程序。通過上述操作即可在多線程環(huán)境中有效的避免對系統(tǒng)程序頻繁的進行鉤取操作和去鉤取操作而帶來的讀寫異常的情況,提高了鉤取技術的魯棒性和安全性。
在一個實施例中,如圖2所示,步驟s11包括如下步驟s21-s22:
在步驟s21中,當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容為短跳轉指令,所述短跳轉指令包括一個字節(jié)的短跳轉關鍵字和一個字節(jié)的短跳轉地址;
不妨假設系統(tǒng)程序的入口地址為x,那么對地址為x和x+1兩個字節(jié)中的內容進行修改。使用本實施例中的技術方案,在進行修改前,無需保存系統(tǒng)程序的入口地址為起始的連續(xù)的兩個字節(jié)的內容??梢允÷袁F有的鉤取技術中,保存系統(tǒng)函數前兩個字節(jié)的內容的操作步驟,還可以節(jié)省出為保存系統(tǒng)程序前兩個字節(jié)的內容所使用的存儲空間。
在步驟s22中,所述短跳轉地址指向所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址。
不妨假設系統(tǒng)程序的入口地址為x,那么該短跳轉地址指向的地址為x-5。
在一個實施例中,如圖3所示,步驟s12包括如下步驟s31-s33:
在步驟s31中,根據所述短跳轉指令,跳轉至所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址;
不妨假設系統(tǒng)程序的入口地址為x,那么根據該短跳轉指令,跳轉至x-5處的地址,系統(tǒng)準備運行地址為x-5處的程序。
在步驟s32中,修改所述系統(tǒng)程序入口地址之前連續(xù)的五個字節(jié)的內容為跳轉指令,所述跳轉指令包括一個字節(jié)的跳轉關鍵字和四個字節(jié)的跳轉地址;
修改地址為x-5處的內容為跳轉指令,該挑戰(zhàn)指令中的跳轉地址為注入函數的入口地址,不妨假設該入口地址為y。
在步驟s33中,根據所述跳轉指令,跳轉至所述注入程序的入口地址。
根據該跳轉指令,跳轉至該注入程序的入口地址y,系統(tǒng)準備運行地址為y處的程序。
在一個實施例中,如圖4所示,步驟s13包括如下步驟s41-s42:
在步驟s41中,在執(zhí)行完所述注入程序后,將所述系統(tǒng)程序的所述入口地址加上兩個字節(jié),得到新的地址;
不妨假設系統(tǒng)程序的入口地址為x,那么新的地址為x+2。
在步驟s42中,確認所述新的地址為所述系統(tǒng)程序的第一入口地址。
確認新的地址x+2為系統(tǒng)程序的第一入口地址。在現有的鉤取技術中,需要利用保存的未修改前的系統(tǒng)函數前2個字節(jié)的內容,來恢復修改后的系統(tǒng)程序。而且,現有技術中,跳回的地址也是原系統(tǒng)程序的入口地址。使用本實施例中的技術方案,可以節(jié)省現有鉤取技術中的恢復原系統(tǒng)程序的入口地址的操作。本發(fā)明可在多線程環(huán)境中有效的避免對系統(tǒng)程序頻繁的進行鉤取操作和去鉤取操作而帶來的讀寫異常的情況,提高了鉤取技術的魯棒性和安全性。
在一個實施例中,如圖5所示,步驟s14包括如下步驟s51-s52:
在步驟s51中,跳轉至所述系統(tǒng)程序的第一入口地址;
在步驟s52中,以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
跳轉至第一入口地址x+2處,以第一入口地址x+2處為起始地址,系統(tǒng)運行該處的系統(tǒng)程序。
在一個實施例中,如圖6a和圖6b所示,在一個實施例,系統(tǒng)函數的入口地址為77d507ea。地址為77d507ea處的指令movedi,edi作用是將edi寄存器中的數據送至edi,該條指令占用2個字節(jié)的內容。地址為77d507e5到地址為77d507e9處的5行代碼皆為nop,nop指令的作用是空循環(huán)一個機器指令的時間,每一條nop指令占用1個字節(jié)的空間。
修改地址為77d507ea處的movedi,edi指令為jmpshortuser32.77d507e5,該指令的作用為短跳轉至地址為77d507e5處,系統(tǒng)繼續(xù)執(zhí)行地址為77d507e5處的代碼。地址為77d507e5處的代碼為jmprpcrt4.77e507ea,該條指令jmprpcrt4.77e507ea的作用為跳轉至注入函數的入口地址。
在運行完注入函數后,跳轉至地址77d507ec處,77d507ec=77d507ea+2,即跳轉至系統(tǒng)函數的入口地址77d507ea加上2個字節(jié)出的地址77d507ec,以地址77d507ec處為起始地址,運行該系統(tǒng)函數。
在一個實施例中,圖7是根據一示例性實施例示出的一種改進的鉤取技術的裝置框圖。如圖7示,該裝置包括修改模塊71、跳轉模塊72、計算模塊73和運行模塊74。
該修改模塊71,用于當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容;
該跳轉模塊72,用于根據修改后的所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容,跳轉至注入程序的入口地址;
該計算模塊73,用于在執(zhí)行完所述注入程序后,計算出所述系統(tǒng)程序的第一入口地址;
該運行模塊74,用于以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
如圖8所示,該修改模塊71包括第一修改子模塊81和指向子模塊82。
該第一修改子模塊81,用于當監(jiān)測到系統(tǒng)程序被鉤取時,修改所述系統(tǒng)程序以入口地址為起始的連續(xù)的兩個字節(jié)的內容為短跳轉指令,所述短跳轉指令包括一個字節(jié)的短跳轉關鍵字和一個字節(jié)的短跳轉地址;
該指向子模塊82,用于所述短跳轉地址指向所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址。
如圖9所示,該跳轉模塊72包括第一跳轉子模塊91、第二修改子模塊92和第二跳轉子模塊93。
該第一跳轉子模塊91,用于根據所述短跳轉指令,跳轉至所述系統(tǒng)程序入口地址之前的第五個字節(jié)的地址;
該第二修改子模塊92,用于修改所述系統(tǒng)程序入口地址之前連續(xù)的五個字節(jié)的內容為跳轉指令,所述跳轉指令包括一個字節(jié)的跳轉關鍵字和四個字節(jié)的跳轉地址;
該第二跳轉子模塊93,用于根據所述跳轉指令,跳轉至所述注入程序的入口地址。
如圖10所示,該計算模塊73包括相加子模塊101和確認子模塊102:
該相加子模塊101,用于在執(zhí)行完所述注入程序后,將所述系統(tǒng)程序的所述入口地址加上兩個字節(jié),得到新的地址;
該確認子模塊102,用于確認所述新的地址為所述系統(tǒng)程序的第一入口地址。
如圖11所示,該運行模塊74包括第三跳轉子模塊111和運行子模塊112。
該第三跳轉子模塊111,用于跳轉至所述系統(tǒng)程序的第一入口地址;
該運行子模塊112,用于以所述第一入口地址為起始地址,運行所述系統(tǒng)程序。
本領域內的技術人員應明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結 合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器和光學存儲器等)上實施的計算機程序產品的形式。
本發(fā)明是參照根據本發(fā)明實施例的方法、設備(系統(tǒng))、和計算機程序產品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數據處理設備的處理器以產生一個機器,使得通過計算機或其他可編程數據處理設備的處理器執(zhí)行的指令產生用于實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數據處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產生包括指令裝置的制造品,該指令裝置實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數據處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產生計算機實現的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
顯然,本領域的技術人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權利要求及其等同技術的范圍之內,則本發(fā)明也意圖包含這些改動和變型在內。