當前位置:律師網大全 - 專利申請 - 如何編寫壹個全局鉤子來鉤住系統中的API

如何編寫壹個全局鉤子來鉤住系統中的API

HOOK API是壹個永恒的話題。如果沒有HOOK,很多技術將很難實現,或者可能根本無法實現。這裏說的API是廣義上的API,包括DOS中的中斷、WINDOWS中的API、中斷服務、IFS和NDIS濾波等。比如大家熟悉的即時翻譯軟件,就是通過HOOK TextOut()或者ExtTextOut()來實現的。操作系統在使用這兩個功能輸出文本之前,會將對應的英文替換為中文,實現即時翻譯。對於IFS和NDIS濾波也是如此。在讀寫磁盤和收發數據之前,系統會調用第三方提供的回調函數來判斷操作是否可以釋放。它不同於普通的HOOK,是操作系統允許的,操作系統提供了安裝回調函數的接口。即使沒有HOOK,也沒有病毒,因為DOS和WINDOWS中的病毒都是通過HOOK系統服務實現其功能的:DOS中的病毒通過HOOK INT 21感染文件(文件病毒),通過HOOK INT 13感染引導扇區;WINDOWS下的病毒通過掛接系統API(包括RING0層和RING3層)或安裝IFS(CIH病毒使用的方法)感染文件。因此,可以說“沒有HOOK,就沒有今天多姿多彩的軟件世界”。因為涉及專利和知識產權,或者商業機密,微軟壹直不鼓勵人們去掛鉤它的系統API,提供了IFS、NDIS等其他過濾接口,也是為了滿足殺毒軟件和防火墻的需要而開放的。所以很多時候HOOK API都要自己做。HOOK API有壹個原則,就是不能以任何方式影響被掛接API的原始功能。就像醫生治病救人壹樣,如果把病人體內的病毒殺死了,病人就死了,那麽這個“治病救人”就沒有意義了。如果妳掛鉤了API,妳的目的達到了,但是API原來的功能失效了,所以不是掛鉤,而是替換,操作系統的正常功能會受到影響甚至崩潰。HOOK API技術,說起來並不復雜,就是改變程序流程的技術。在CPU的指令中,有幾個指令可以改變程序的流程:JMP、CALL、INT、RET、RETF、IRET等等。理論上可以掛接任何改變API入口和出口的機器碼,但實際實現起來要復雜得多,因為需要處理好以下問題:1,CPU指令的長度,在32位系統中,壹條JMP/CALL指令的長度是5個字節,所以妳要替換API中超過5個字節的機器碼(或者替換幾條加起來5個字節的指令),否則就是。2、參數問題,為了訪問原API的參數,妳不得不通過EBP或者ESP來引用參數,所以這個時候妳要非常清楚妳的鉤子代碼中EBP/ESP的值;3、計時,有些鉤子必須在API的開頭,有些必須在API的結尾,比如HOOK CreateFilaA()。如果在API的末尾掛接了API,那麽此時就不能寫文件,甚至不能訪問文件;鉤子RECV(),如果妳在API鉤子的頂端,此時還沒有收到數據,可以檢查RECV()的接收緩沖區,當然沒有妳想要的數據。您必須等待RECV()的正常執行,然後檢查RECV()的緩沖區以獲得所需的數據。4、上下文的問題,有些鉤子代碼不能執行某些操作,否則會破壞原API的上下文,原API失效;5、同步問題,鉤子代碼中盡量不要使用全局變量,而要使用局部變量,這也是模塊化程序的需要;6.最後需要註意的是,被替換的CPU指令的原函數必須在鉤子代碼的某個地方模擬。我們以ws2_32.dll中的send()為例,來說明如何掛接這個函數:Exported fn()。:send-Ord:0013h地址機器碼匯編代碼:71a 21af 455 pushe BP//待掛接機器碼(方法1):71a 21f 58 bec move BP,ESP//待掛接機器碼(方法2):71a 2100065438+)dword ptr[ebp-08]:71a 21b 11 50推送eax:71a 21b 12 e 869 f 7 ffff調用71a 21280:71a 21b 6 5438+07 3 BCF dword ptr[ebp+08]:71a 21b 42 57推送edi:71A21B43 57推送EDI:71a 21b 44 ff 7514推送[ebp+14]:71a 21b 47 8945 F0 mov dw EDI:71a 21B6B 5B pop ebx:71a 21B6C 0f 855 f 940000 jne 71a 2 AFD 1a 21b 72 8b 4508 mov eax,dword ptr[ebp+08]:71a 265448 這種方法被Sofice等DEBUGER廣泛使用,它通過BPX在相應的地方設置壹個INT 3指令來斷點。但不推薦這種方法,因為會和WINDOWS或者調試工具沖突,匯編代碼基本都調試好了;2.將第二條mov ebp,esp指令(機器碼8BEC,2字節)替換為INT F0指令(機器碼CDF0),然後在IDT設置壹個中斷門指向我們的代碼。我在這裏給出壹個鉤子代碼:lea ebp,[esp+12] //模擬原指令mov ebp,esp pushfd的函數//保存場景pushad //保存場景//在這裏做妳想做的popad //恢復場景popfd //返回原指令的下壹個ring 0指令繼續執行原函數(地址為71A21A7)。這種方法很好,但缺點是在IDT中設置了壹個中斷門。3.更改調用指令的相對地址(調用分別在71A21B12,71A21B25,71A21B64,但前兩次調用前有壹條條件跳轉指令,可能無法執行。為什麽要找通話指令?因為都是5字節指令,而且都是調用指令,只要保持操作碼0xE8不變,就可以通過改變後面的相對地址去我們的鉤子代碼執行,然後去我們鉤子代碼之後的目標地址執行。假設我們的鉤子代碼在71A20400,那麽我們把71A21A64處的調用指令改為調用71A20400(原指令是這樣的:調用71A21230)而71A20400處的鉤子代碼是這樣的:71A20400。在這裏做妳想做的事。popad JMP 71a 21230/跳轉到原調用指令的目標地址。原指令如下:call 71A21230這種方法非常隱蔽,但是很難找到這種5字節的call指令,而且計算相對地址比較復雜。4.替換地址為71A265438的CMP DWORD PTR[71a 3201C]和71A21C93指令(機器代碼:813D 10A3765438+)。10字節)變成了Call 71a 20400 nopnoponop(機器碼:E8XX XX XX 90 90 90 90 90,10字節)。71A20400處的鉤碼為:Pushed MOVEDX。71A3201Ch //模擬原指令CMP DWORD PTR[71a 3201C],71a 21C 93 c CMP DWORD PTR[EDX],71a 2193h//模擬原指令CMP DWORD PTR[71a 3201C],765438這個方法是最隱蔽的,但是並不是每個API都有這樣的指令。以上方法都是常用的。值得壹提的是,很多人都是修改API的前五個字節,但是現在很多殺毒軟件都是用這種方法來檢查API是否被勾過,或者其他病毒木馬在妳之後修改了前五個字節,這樣就會互相覆蓋,最後壹個勾API的操作是有效的。
  • 上一篇:永久的悔(全文)
  • 下一篇:智能鎖和指紋鎖品牌推薦?
  • copyright 2024律師網大全