當前位置:法律諮詢服務網 - 知識產權保護 - 如何在C#中掛接壹個API函數!

如何在C#中掛接壹個API函數!

HOOK API是壹個永恒的話題。如果沒有HOOK,很多技術將很難實現,或者可能根本無法實現。

這裏說的API是廣義上的API,包括DOS中的中斷,WINDOWS中的API,中斷服務,IFS和。

NDIS濾波等。比如大家熟悉的即時翻譯軟件,依靠的就是HOOK TextOut()或者ExtTextOut()。

函數,在操作系統使用這兩個函數輸出文本之前,它用中文替換相應的英文來實現。

時間翻譯;對於IFS和NDIS濾波也是如此。在讀寫磁盤和收發數據之前,系統會調用第三方。

回調函數來判斷操作是否可以釋放,這和普通的鉤子不同,是操作系統允許的,是由操作系統決定的。

提供安裝回調函數的接口。

即使沒有鉤子也沒有病毒,因為不管是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

任何入口和出口的機器碼都可以被HOOK,但實際實現要復雜得多,因為要處理好以下幾個問題:

1,CPU指令長度問題,在32位系統中,壹條JMP/CALL指令的長度是5個字節,所以妳要替換API。

長度超過5個字節的機器碼(或者用5個字節的總長度代替幾個指令),否則會影響修正。

機器碼後面的幾條指令改成5字節以下,甚至程序流程會被打亂,造成不可預知的後果;

2、參數問題,為了訪問原API的參數,妳不得不通過EBP或者ESP來引用參數,所以這個時候妳要非常清楚妳的鉤子代碼中EBP/ESP的值;

3、計時,有些鉤子必須在API的開頭,有些必須在API的結尾,比如HOOK CreateFilaA()。

如果在API的末尾掛接了API,那麽此時就不能寫文件,甚至不能訪問文件;鉤子RECV(),

如果妳在API頭鉤子中,此時還沒有收到數據,可以檢查RECV()的接收緩沖區,但是裏面肯定沒有數據。

妳想要的數據,妳必須等待RECV()正常執行,並在RECV()的末尾鉤子,然後檢查RECV()的緩沖區。

裏面只有想要的數據;

4、上下文的問題,有些鉤子代碼不能執行某些操作,否則會破壞原API的上下文,原API失效;

5、同步問題,鉤子代碼中盡量不要使用全局變量,而要使用局部變量,這也是模塊化程序的需要;

6.最後需要註意的是,被替換的CPU指令的原函數必須在鉤子代碼的某個地方模擬。

以ws2_32.dll中的send()為例,說明如何掛接這個函數:

出口fn():發送- Ord:0013h

地址機器代碼匯編代碼

:71a 21af 455 push ebp//要掛鉤的機器碼(方法1)

:71A21F58BEC MOVEBP,ESP//要掛鉤的機器碼(方法2)。

:71a 21af 7 83ec 10 sub esp,00000010

:71A21AFA 56推送esi

:71A21AFB 57推送edi

:71A21AFC 33FF xor edi,edi

:71a 21afe 813d 1931a 271 CMP DWORD PTR[71a 3201C],71A26558。

:71a 21b 08 0f 84853d 0000 je 71a 25893

:71a 21B0E 8d 45 F8 lea eax,dword ptr [ebp-08]

:71a 21b 11 50推送eax

:71a 21b 12 e 869 f 7 ffff電話71A21280

:71a 21b 17 3bc 7 CMP eax,edi

:71a 21b 19 8945 fc mov dword ptr[ebp-04],eax

:71a 21b 1C 0f 85c 4940000 jne 71a 2 AFE 6

:71A21B22 FF7508推送[ebp+08]

:71A21B25 E826F7FFFF電話71A21250

:71A21B2A 8BF0 mov esi,eax

:71A21B2C 3BF7 cmp esi,edi

:71a 21B2E 0f 84 ab 940000 je 71a 2 afdf

:71a 21b 34 8b 4510 mov eax,dword ptr [ebp+10]

:71A21B37 53推送ebx

:71a 21b 38 8d 4 DFC lea ecx,dword ptr [ebp-04]

:71A21B3B 51推送ecx

:71A21B3C FF75F8推送[ebp-08]

:71a 21B3F 8d 4d 08 lea ecx,dword ptr [ebp+08]

:71A21B42 57推送edi

:71A21B43 57推送edi

:71a 21b 44 ff 7514推送[ebp+14]

:71a 21b 47 8945 f 0 mov dword ptr[ebp-10],eax

:71a 21B4A 8b 450 c mov eax,dword ptr [ebp+0C]

:71A21B4D 51推送ecx

:71A21B4E 6A01推送00000001

:71a 21b 50 8d 4 df 0 lea ecx,dword ptr [ebp-10]

:71A21B53 51推送ecx

:71A21B54 FF7508推送[ebp+08]

:71a 21b 57 8945 F4 mov dword ptr[ebp-0C],eax

:71a 21B5A 8b 460 c mov eax,dword ptr [esi+0C]

:71a 21B5D ff 5064 call[eax+64]

:71A21B60 8BCE mov ecx,esi

:71A21B62 8BD8 mov ebx,eax

:71a 21b 64 E8 c 7 6 fff call 71a 21230//要掛鉤的機器碼(方法3)

:71A21B69 3BDF cmp ebx,edi

:71A21B6B 5B pop ebx

:71a 21B6C 0f 855 f 940000 jne 71a 2 AFD 1

:71a 21b 72 8b 4508 mov eax,dword ptr [ebp+08]

:71A21B75 5F pop edi

:71A21B76 5E pop esi

:71A21B77 C9離開

:71a 21b 78 c 21000 ret 0010

以下是掛鉤該API的四種方法:

1,用INT 3(機器代碼0xcc)將API條目中的第壹條指令替換為推送EBP指令(機器代碼0x55)。

然後使用WINDOWS提供的調試功能執行自己的代碼,這是軟冰等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 //還原現場

Iretd //返回原指令的下壹條指令繼續執行原函數(地址為71A21AF7)。

這種方法很好,但缺點是在IDT中設置了壹個中斷門,即進入RING0。

3.更改調用指令的相對地址(調用分別是71A21B12,71A21B25,71A21B64,但是前兩次調用前有壹個條件。

跳轉指令可能無法執行,所以我們需要HOOK 71A21B64處的CALL指令)。為什麽要找通話指令?

因為都是5字節指令,而且都是調用指令,只要操作碼0xE8不變,就可以通過改變後面的相對地址來轉移。

轉到我們的鉤子代碼去執行,然後轉到我們的鉤子代碼後的目標地址去執行。

假設我們的鉤子代碼在71A20400,那麽我們把71A21B64的調用指令改為調用71A20400(原來的指令是這樣的:調用71A21230)。

而71A20400處的鉤子代碼是這樣的:

71A20400:

普沙德

//在這裏做妳想做的。

波普德

Jmp 71A21230 //跳轉到原調用指令的目標地址,如下:調用71A21230。

這種方法隱蔽性很好,但是很難找到這個5字節的調用指令,計算相對地址也很復雜。

4.替換地址為71A265438的CMP DWORD PTR[71a 3201C]和71A21C93指令(機器代碼:813D 10A3765438+)。

致電71A20400

not otherwise provided 除非另有規定

not otherwise provided 除非另有規定

not otherwise provided 除非另有規定

not otherwise provided 除非另有規定

not otherwise provided 除非另有規定

(機器代碼:E8XX XX XX 90 90 90 90 90 10字節)

71A20400中的掛鉤代碼是:

普沙德

Mov edx,71A3201Ch //模擬原指令CMP DWORD PTR[71a 3201c 93],71A21C93。

Cmpword ptr [EDX],71a21c93h//模擬原指令cmpd word ptr[71a 3201c],71a 21c 93。

pushfd

//在這裏做妳想做的。

popfd

波普德

浸水使柔軟

這種方法是最好的隱蔽,但並不是每個API都有這樣的說明,需要根據具體情況來操作。

以上方法都是常用的。值得壹提的是,很多人更改API的前五個字節,但是現在很多殺毒軟件都是用這種方法。

檢查API是否在妳之後被HOOK或者其他病毒木馬改了,這樣會互相覆蓋,最後壹個HOOK API的操作是有效的。

  • 上一篇:離職員工在什麽情況下可以解除競業限制協議?
  • 下一篇:拿破侖民法典產生的條件和特點
  • copyright 2024法律諮詢服務網