国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Hook函數(shù)在進(jìn)程操作中的應(yīng)用

2015-10-18 02:16琚,張
天津科技 2015年1期
關(guān)鍵詞:數(shù)組調(diào)用線程

王 琚,張 偉

(1. 國家計(jì)算機(jī)病毒應(yīng)急處理中心 天津 300457;2. 天津市公安局公共信息網(wǎng)絡(luò)安全監(jiān)察總隊(duì)案件支隊(duì) 天津 300020)

Hook(鉤子)實(shí)際上是 1個(gè)消息處理的程序段,它通過系統(tǒng)調(diào)用實(shí)現(xiàn)掛入系統(tǒng)。鉤子程序總能先于目的程序率先截獲原本發(fā)往該地的消息,從而率先得到控制權(quán)。隨后鉤子函數(shù)可以對(duì)消息進(jìn)行修改,或放行接著傳遞,或直接結(jié)束該消息。

Hook程序與消息緊密相關(guān),其主要功能是對(duì)消息進(jìn)行監(jiān)聽。Hook根據(jù)要截獲的消息可以分為若干類。但無論何種消息,Hook對(duì)“對(duì)象的搭接”不是硬性的,它是一種柔性連接,一經(jīng)接觸,Hook的搭鉤立刻能“化”進(jìn)監(jiān)聽的線路中,即Hook的代碼能變成對(duì)象進(jìn)程的一部分。原本用戶進(jìn)程間彼此互相獨(dú)立,互不聯(lián)系,而 Hook機(jī)制提供了操縱特定程序行為的方法。

1 對(duì)API實(shí)現(xiàn)Hook

Hook程序想發(fā)揮更大的作用,要找到一種系統(tǒng)內(nèi)置函數(shù),最佳的目標(biāo)為 API。API函數(shù)是用戶應(yīng)用程序需求的接收者和工作的完成者。API Hook的基本思想是由 Hook“套”到API的入口點(diǎn),把它的地址指向自定義函數(shù)地址。

談Hook獲得API入口點(diǎn),要從內(nèi)存空間中的PE可執(zhí)行文件說起。

PE文件頭的格式為:

其中“IMAGE_FILE_HEADER”與“MAGE_OPTIONAL_HEADER32”這 2個(gè)結(jié)構(gòu),分別對(duì) PE文件的屬性進(jìn)行定義,兩者共同構(gòu)造了 PE文件的結(jié)構(gòu)。在后者的結(jié)構(gòu)中擁有不下30個(gè)字段的描述,最后一條是:

IMAGE_DATA_DIRECTORY,這個(gè) DataDirectory是一個(gè)結(jié)構(gòu)數(shù)組,有16個(gè)成員,它們的結(jié)構(gòu)是相同的,均為:

根據(jù) winnt.H中的定義,將 DataDirectory結(jié)構(gòu)的數(shù)據(jù)目錄定義列表(見表1)。

表1 Data Directory結(jié)構(gòu)的數(shù)據(jù)目錄定義子表Tab.1 Subtable of Data directory definitions

在 PE文件中查找想要的數(shù)據(jù)需先從表 1中搜尋對(duì)應(yīng)的信息,如需要找DLL文件中有哪些API函數(shù)(導(dǎo)入函數(shù))在運(yùn)行,則需要查 IMAGE_IMPORT_DESCRIPTOR(導(dǎo)入表),它是1個(gè)結(jié)構(gòu)數(shù)組,其中的每個(gè)元素代表1個(gè)動(dòng)態(tài)鏈接庫,而各成員變量則包括了動(dòng)態(tài)鏈接庫導(dǎo)入了哪些函數(shù)及這些函數(shù)地址的信息。想找到導(dǎo)入表,需要知道它的地址。從表 1中得知導(dǎo)入表對(duì)應(yīng)第 2個(gè)目錄 IMAGE_DIRECTORY_EN-TRY_IMPORT,即從IMAGE_DATA_DIRECTORY結(jié)構(gòu)數(shù)組中查第2個(gè)元素的Virtual Address和Size值,從中找到導(dǎo)入表的地址和大小,這里數(shù)據(jù)的起始地址稱為 RVA(RVA是相對(duì)虛地址,Relative Virtual Addresses。它是相對(duì)于基址 Base address而言。一個(gè) PE文件加載進(jìn)內(nèi)存后,就以當(dāng)前內(nèi)存地址作為基址,文件中各個(gè)模塊都以 RVA表示,只要參照基址就能得出各自實(shí)際地址)。

成員變量OriginalFirstThunk包含1個(gè)IMAGE_THUNK_DATA結(jié)構(gòu)數(shù)組的地址,該數(shù)組存儲(chǔ)著函數(shù)序號(hào)和名稱。成員變量 Name記錄的是引入的動(dòng)態(tài)鏈接庫名稱,這提醒我們,1個(gè)IMAGE_IMPORT_DESCRIPTOR直接對(duì)應(yīng)1個(gè)動(dòng)態(tài)鏈接庫。而成員變量FirstThunk包含1個(gè)IMAGE_THUNK_DATA結(jié)構(gòu)數(shù)組的地址??梢钥闯?,這是兩個(gè)同名函數(shù)。IMAGE_THUNK_DATA數(shù)組結(jié)構(gòu)為:

在導(dǎo)入表加載之前,F(xiàn)irstThunk所指向的數(shù)組與OriginalFirstThunk指向的數(shù)組有相同的內(nèi)容,都包含了要導(dǎo)入的函數(shù)的名稱和序號(hào)。而在導(dǎo)入表加載之后,F(xiàn)irstThunk所指向的數(shù)組所包含的內(nèi)容就變成了要導(dǎo)入函數(shù)的實(shí)際地址。

這樣,通過 PE文件頭,一路找尋,最終找到了 API函數(shù)的入口點(diǎn),從而可以為Hook操作所用。

2 Hook在進(jìn)程監(jiān)控的應(yīng)用

利用進(jìn)程Hook操作可以實(shí)現(xiàn)對(duì)特定進(jìn)程的監(jiān)控,對(duì)目標(biāo)實(shí)現(xiàn)限時(shí)、關(guān)閉、暫停的操作。監(jiān)控可以通過定期獲得系統(tǒng)當(dāng)前進(jìn)程的快照隊(duì)列完成,而每次將隊(duì)列中進(jìn)程名逐個(gè)與監(jiān)控目標(biāo)進(jìn)程名作比較,不一致就調(diào)用隊(duì)列的下一個(gè)進(jìn)程;一致則對(duì)其進(jìn)行相應(yīng)控制。對(duì)系統(tǒng)當(dāng)前進(jìn)程的掌握可以借助ToolHelp API的幾個(gè)函數(shù)完成。首先是 CreateToolhelp32 Snapshot函數(shù),它的結(jié)構(gòu)是:

參數(shù)dwFlags:DWORD根據(jù)用戶針對(duì)的目標(biāo)類型不同而采取不同設(shè)置,對(duì)進(jìn)程、線程、進(jìn)程的堆列表、進(jìn)程的模塊列表進(jìn)行信息捕獲時(shí)分別對(duì)應(yīng)的設(shè)置值為:TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD、TH32CS_SNAPHEAPLIS、TH32CS_SNAPMODULE。

利用以上 2個(gè)函數(shù)可以實(shí)現(xiàn)對(duì)系統(tǒng)當(dāng)前進(jìn)程隊(duì)列的遍歷,Process32First捕獲隊(duì)列中首個(gè)進(jìn)程的信息,Process32Next則對(duì)下一個(gè)進(jìn)程操作。其中參數(shù) hSnapshot返回CreateToolhelp32Snapshot函數(shù)建立的當(dāng)前進(jìn)程快照的句柄;有了快照,還要設(shè) 1個(gè)存放它們的所在,于是又有了 1個(gè)PROCESSENTRY32結(jié)構(gòu)體來承擔(dān)這項(xiàng)工作,而參數(shù)LPPROCESSENTRY32就充當(dāng)指向結(jié)構(gòu) PROCESSENTRY32的指針。

對(duì)進(jìn)程的控制用到OpenProcess函數(shù)和TerminateProcess函數(shù)。它們的結(jié)構(gòu)分別為:

HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId);

BOOL TerminateProcess(HANDLE hProcess;UINT uExit-Code);

OpenProcess函數(shù)用來獲得要訪問進(jìn)程的句柄,參數(shù)dwDesiredAccess存放目標(biāo)進(jìn)程的訪問權(quán)限,參數(shù)bInheritHandle表示所得到的目標(biāo)進(jìn)程的句柄能否被繼承,參數(shù)dwProcessId表示目標(biāo)進(jìn)程的PID值。

TerminateProcess函數(shù)用來無延時(shí)地終止特定進(jìn)程,參數(shù)HANDLE hProcess的值即目標(biāo)進(jìn)程的句柄,這個(gè)值要從Open Process函數(shù)獲得;參數(shù)uExitCode負(fù)責(zé)接收代碼退出值。

在進(jìn)行進(jìn)程操作時(shí),先要調(diào)用 OpenProcess函數(shù),接著再調(diào)用 TerminateProcess函數(shù),一般使用完進(jìn)程句柄后,應(yīng)調(diào)用CloseHandle函數(shù)把它關(guān)閉,否則會(huì)造成句柄泄漏,降低系統(tǒng)效率。

實(shí)際上,如果對(duì) OpenProcess函數(shù)進(jìn)行 Hook操作,能達(dá)到進(jìn)程免殺的效果。在進(jìn)程的眾多屬性中,只有 ProcessId值是唯一的,只有它能準(zhǔn)確標(biāo)識(shí)進(jìn)程。當(dāng)對(duì) OpenProcess函數(shù)實(shí)施Hook,一旦OpenProcess函數(shù)被調(diào)用,我們就可以截獲它的調(diào)用信息,判斷被調(diào)用的 ProcessId值與設(shè)置的進(jìn)程 ID是否一致,只要一致,就為調(diào)用程序返回 1個(gè)錯(cuò)誤值,這樣系統(tǒng)始終無法獲得我們的進(jìn)程句柄,也就無法停止它。這在實(shí)現(xiàn)進(jìn)程監(jiān)控和植入木馬的應(yīng)用上都是有效方法。

3 遠(yuǎn)程注入DLL

在進(jìn)程加載 DLL庫的過程中,要涉及到 LoadLibrary(lpFileName)函數(shù),它返回DLL的句柄。而與之經(jīng)常配合使用的是 GetProcAddress(Hinstance,lpname)函數(shù),其中參數(shù)Hinstance獲得 LoadLibrary函數(shù)返回的句柄,參數(shù) Ipname為文件名,最終的返回值為動(dòng)態(tài)鏈接庫的地址。這2個(gè)函數(shù)均為動(dòng)態(tài)調(diào)用,即只有當(dāng)需要調(diào)用它們時(shí),才將函數(shù)實(shí)例引入。LoadLibrary函數(shù)可以對(duì)應(yīng)不同類型的 DLL 庫,而GetProcAddress函數(shù)對(duì)應(yīng)不同的實(shí)例。一旦調(diào)用鏈接庫失敗,不影響程序的運(yùn)行。

但是,當(dāng)外部進(jìn)程要調(diào)用 LoadLibrary函數(shù)以實(shí)現(xiàn)加載DLL目的時(shí),因?yàn)闆]有訪問權(quán)限不能直接使用。這時(shí)可以使用CreateRemoteThread函數(shù)來建立遠(yuǎn)程線程,它能夠在其他進(jìn)程地址空間中創(chuàng)建線程。CreateRemoteThread函數(shù)不僅實(shí)現(xiàn)跨進(jìn)程地址空間訪問的目的,而且它的參數(shù) IpParameter是指向線程操作函數(shù)的指針,這與LoadLibrary函數(shù)的IpFileName參數(shù)有異曲同工的效果,這樣在完成遠(yuǎn)程線程的建立后又可以用LoadLibrary函數(shù)實(shí)現(xiàn)線程操作。■

[1] Evil. eagle PE文件結(jié)構(gòu)詳解(四)PE導(dǎo)入表[EB/OL].http://blog.csdn.net/evileagle/article/details/12357155.2013.

[2] Qxiniu. Windows下 Hook API技術(shù)[EB/OL]. http://wenku.baidu.com/link?url=hl3FowyNyM8kIfKfg4ur_vj0rcligYxccbEtCQNpY3dADCH528tYu2n2Ut-9BC9LXTYrqQT7wuVFAznpO3GGXcT2bAQWJnQheUhFUh ZRxK. 2010.

[3] 天堂水. 2009 Windows下Hook API技術(shù)小結(jié)[EB/OL].http://www.cnblogs.com/heavenwater/articles/1527446.html. 2009.

猜你喜歡
數(shù)組調(diào)用線程
JAVA稀疏矩陣算法
基于C#線程實(shí)驗(yàn)探究
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
基于國產(chǎn)化環(huán)境的線程池模型研究與實(shí)現(xiàn)
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
線程池調(diào)度對(duì)服務(wù)器性能影響的研究*
系統(tǒng)虛擬化環(huán)境下客戶機(jī)系統(tǒng)調(diào)用信息捕獲與分析①
更高效用好 Excel的數(shù)組公式
尋找勾股數(shù)組的歷程
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
资中县| 平乡县| 额尔古纳市| 清新县| 嵊州市| 出国| 汕头市| 盐城市| 龙州县| 尼玛县| 静安区| 马山县| 芒康县| 琼结县| 山阳县| 崇信县| 财经| 会理县| 江口县| 灵川县| 沁阳市| 慈利县| 新密市| 嘉兴市| 绍兴市| 哈巴河县| 玉溪市| 岳阳县| 霸州市| 汉川市| 南和县| 邹平县| 邯郸市| 临武县| 泽普县| 宁晋县| 建瓯市| 泸定县| 怀集县| 华安县| 盖州市|