欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
API HOOK - 日志 - tomore - 問(wèn)友源碼空間
HOOK API是一個(gè)永恒的話(huà)題,如果沒(méi)有HOOK,許多技術(shù)將很難實(shí)現,也許根本不能實(shí)現。這里所說(shuō)的API,是廣義上的API,它包括DOS下的中斷, WINDOWS里的API、中斷服務(wù)、IFS和NDIS過(guò)濾等。比如大家熟悉的即時(shí)翻譯軟件,就是靠HOOK TextOut()或ExtTextOut()這兩個(gè)函數實(shí)現的,在操作系統用這兩個(gè)函數輸出文本之前,就把相應的英文替換成中文而達到即時(shí)翻譯;IFS 和NDIS過(guò)濾也是如此,在讀寫(xiě)磁盤(pán)和收發(fā)數據之前,系統會(huì )調用第三方提供的回調函數來(lái)判斷操作是否可以放行,它與普通HOOK不同,它是操作系統允許 的,由操作系統提供接口來(lái)安裝回調函數。甚至如果沒(méi)有HOOK,就沒(méi)有病毒,因為不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系統服務(wù)來(lái)實(shí)現自己的功能的:DOS下的病毒靠 HOOK INT 21來(lái)感染文件(文件型病毒),靠HOOK INT 13來(lái)感染引導扇區(引導型病毒);WINDOWS下的病毒靠HOOK系統API(包括RING0層的和RING3層的),或者安裝IFS(CIH病毒所 用的方法)來(lái)感染文件。因此可以說(shuō)“沒(méi)有HOOK,就沒(méi)有今天多姿多彩的軟件世界”。由于涉及到專(zhuān)利和知識產(chǎn)權,或者是商業(yè)機密,微軟一直不提倡大家HOOK它的系統API,提供IFS和NDIS等其他過(guò)濾接口,也是為了適應殺毒軟件和防火墻的需要才開(kāi)放的。所以在大多數時(shí)候,HOOK API要靠自己的力量來(lái)完成。HOOK API有一個(gè)原則,這個(gè)原則就是:被HOOK的API的原有功能不能受到任何影響。就象醫生救人,如果把病人身體里的病毒殺死了,病人也死了,那么這個(gè) “救人”就沒(méi)有任何意義了。如果你HOOK API之后,你的目的達到了,但API的原有功能失效了,這樣不是HOOK,而是REPLACE,操作系統的正常功能就會(huì )受到影響,甚至會(huì )崩潰。HOOK API的技術(shù),說(shuō)起來(lái)也不復雜,就是改變程序流程的技術(shù)。在CPU的指令里,有幾條指令可以改變程序的流程:JMP,CALL,INT,RET, RETF,IRET等指令。理論上只要改變API入口和出口的任何機器碼,都可以HOOK,但是實(shí)際實(shí)現起來(lái)要復雜很多,因為要處理好以下問(wèn)題:1,CPU指令長(cháng)度問(wèn)題,在32位系統里,一條JMP/CALL指令的長(cháng)度是5個(gè)字節,因此你只有替換API里超過(guò)5個(gè)字節長(cháng)度的機器碼(或者替換幾條指 令長(cháng)度加起來(lái)是5字節的指令),否則會(huì )影響被更改的小于5個(gè)字節的機器碼后面的數條指令,甚至程序流程會(huì )被打亂,產(chǎn)生不可預料的后果;2,參數問(wèn)題,為了訪(fǎng)問(wèn)原API的參數,你要通過(guò)EBP或ESP來(lái)引用參數,因此你要非常清楚你的HOOK代碼里此時(shí)的EBP/ESP的值是多少;3,時(shí)機的問(wèn)題,有些HOOK必須在A(yíng)PI的開(kāi)頭,有些必須在A(yíng)PI的尾部,比如HOOK CreateFilaA(),如果你在A(yíng)PI尾部HOOK API,那么此時(shí)你就不能寫(xiě)文件,甚至不能訪(fǎng)問(wèn)文件;HOOK RECV(),如果你在A(yíng)PI頭HOOK,此時(shí)還沒(méi)有收到數據,你就去查看RECV()的接收緩沖區,里面當然沒(méi)有你想要的數據,必須等RECV()正常 執行后,在RECV()的尾部HOOK,此時(shí)去查看RECV()的緩沖區,里面才有想要的數據;4,上下文的問(wèn)題,有些HOOK代碼不能執行某些操作,否則會(huì )破壞原API的上下文,原API就失效了;5,同步問(wèn)題,在HOOK代碼里盡量不使用全局變量,而使用局部變量,這樣也是模塊化程序的需要;6,最后要注意的是,被替換的CPU指令的原有功能一定要在HOOK代碼的某個(gè)地方模擬實(shí)現。下面以ws2_32.dll里的send()為例子來(lái)說(shuō)明如何HOOK這個(gè)函數:Exported fn(): send - Ord:0013h地址 機器碼 匯編代碼:71A21AF4 55 push ebp //將被HOOK的機器碼(第1種方法):71A21AF5 8BEC mov ebp, esp //將被HOOK的機器碼(第2種方法):71A21AF7 83EC10 sub esp, 00000010:71A21AFA 56 push esi:71A21AFB 57 push edi:71A21AFC 33FF xor edi, edi:71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //將被HOOK的機器碼(第4種方法):71A21B08 0F84853D0000 je 71A25893:71A21B0E 8D45F8 lea eax, dword ptr [ebp-08]:71A21B11 50 push eax:71A21B12 E869F7FFFF call 71A21280:71A21B17 3BC7 cmp eax, edi:71A21B19 8945FC mov dword ptr [ebp-04], eax:71A21B1C 0F85C4940000 jne 71A2AFE6:71A21B22 FF7508 push [ebp+08]:71A21B25 E826F7FFFF call 71A21250:71A21B2A 8BF0 mov esi, eax:71A21B2C 3BF7 cmp esi, edi:71A21B2E 0F84AB940000 je 71A2AFDF:71A21B34 8B4510 mov eax, dword ptr [ebp+10]:71A21B37 53 push ebx:71A21B38 8D4DFC lea ecx, dword ptr [ebp-04]:71A21B3B 51 push ecx:71A21B3C FF75F8 push [ebp-08]:71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08]:71A21B42 57 push edi:71A21B43 57 push edi:71A21B44 FF7514 push [ebp+14]:71A21B47 8945F0 mov dword ptr [ebp-10], eax:71A21B4A 8B450C mov eax, dword ptr [ebp+0C]:71A21B4D 51 push ecx:71A21B4E 6A01 push 00000001:71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10]:71A21B53 51 push ecx:71A21B54 FF7508 push [ebp+08]:71A21B57 8945F4 mov dword ptr [ebp-0C], eax:71A21B5A 8B460C mov eax, dword ptr [esi+0C]:71A21B5D FF5064 call [eax+64]:71A21B60 8BCE mov ecx, esi:71A21B62 8BD8 mov ebx, eax:71A21B64 E8C7F6FFFF call 71A21230 //將被HOOK的機器碼(第3種方法):71A21B69 3BDF cmp ebx, edi:71A21B6B 5B pop ebx:71A21B6C 0F855F940000 jne 71A2AFD1:71A21B72 8B4508 mov eax, dword ptr [ebp+08]:71A21B75 5F pop edi:71A21B76 5E pop esi:71A21B77 C9 leave:71A21B78 C21000 ret 0010下面用4種方法來(lái)HOOK這個(gè)API:1,把API入口的第一條指令是PUSH EBP指令(機器碼0x55)替換成INT 3(機器碼0xcc),然后用WINDOWS提供的調試函數來(lái)執行自己的代碼,這中方法被SOFT ICE等DEBUGER廣泛采用,它就是通過(guò)BPX在相應的地方設一條INT 3指令來(lái)下斷點(diǎn)的。但是不提倡用這種方法,因為它會(huì )與WINDOWS或調試工具產(chǎn)生沖突,而匯編代碼基本都要調試;2,把第二條mov ebp,esp指令(機器碼8BEC,2字節)替換為INT F0指令(機器碼CDF0),然后在IDT里設置一個(gè)中斷門(mén),指向我們的代碼。我這里給出一個(gè)HOOK代碼:lea ebp,[esp+12] //模擬原指令mov ebp,esp的功能pushfd //保存現場(chǎng)pushad //保存現場(chǎng)//在這里做你想做的事情popad //恢復現場(chǎng)popfd //恢復現場(chǎng)iretd //返回原指令的下一條指令繼續執行原函數(71A21AF7地址處)這種方法很好,但缺點(diǎn)是要在IDT設置一個(gè)中斷門(mén),也就是要進(jìn)RING0。3,更改CALL指令的相對地址(CALL分別在71A21B12、71A21B25、71A21B64,但前面2條CALL之前有一個(gè)條件跳轉指令,有 可能不被執行到,因此我們要HOOK 71A21B64處的CALL指令)。為什么要找CALL指令下手?因為它們都是5字節的指令,而且都是CALL指令,只要保持操作碼0xE8不變,改變 后面的相對地址就可以轉到我們的HOOK代碼去執行了,在我們的HOOK代碼后面再轉到目標地址去執行。假設我們的HOOK代碼在71A20400處,那么我們把71A21B64處的CALL指令改為CALL 71A20400(原指令是這樣的:CALL 71A21230)而71A20400處的HOOK代碼是這樣的:71A20400:pushad//在這里做你想做的事情popadjmp 71A21230 //跳轉到原CALL指令的目標地址,原指令是這樣的:call 71A21230這種方法隱蔽性很好,但是比較難找這條5字節的CALL指令,計算相對地址也復雜。4,替換71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(機器碼:813D1C20A371931CA271,10字節)成為call 71A20400nopnopnopnopnop(機器碼:E8 XX XX XX XX 90 90 90 90 90,10字節)在71A20400的HOOK代碼是:pushadmov edx,71A3201Ch //模擬原指令cmp dword ptr [71A3201C], 71A21C93cmp dword ptr [edx],71A21C93h //模擬原指令cmp dword ptr [71A3201C], 71A21C93pushfd//在這里做你想做的事popfdpopadret這種方法隱蔽性最好,但不是每個(gè)API都有這樣的指令,要具體情況具體操作。以上幾種方法是常用的方法,值得一提的是很多人都是改API開(kāi)頭的5個(gè)字節,但是現在很多殺毒軟件用這樣的方法檢查API是否被HOOK,或其他病毒木馬 在你之后又改了前5個(gè)字節,這樣就會(huì )互相覆蓋,最后一個(gè)HOOK API的操作才是有效的,所以提倡用第3和第4種方法。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
詳談 HOOK API 的技術(shù)
利用HOOK API技術(shù),內存中截獲QQ密碼
獻給匯編初學(xué)者-函數調用堆棧變化分析
WIN32匯編基礎
Windows系統調用中API的3環(huán)部分(依據分析重寫(xiě)ReadProcessMemory函數)
在VS2005中利用map文件查找內存錯誤
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久