国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

詳談HOOK API的技術
2006-03-20   

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下的病毒靠HOOK系統API(包括RING0層的和RING3層的),或者安裝IFS(CIH病毒所用的方法)來感染文件。因此可以說“沒有HOOK,就沒有今天多姿多彩的軟件世界”。

由于涉及到專利和知識產權,或者是商業機密,微軟一直不提倡大家HOOK它的系統API,提供IFS和NDIS等其他過濾接口,也是為了適應殺毒軟件和防火墻的需要才開放的。所以在大多數時候,HOOK API要靠自己的力量來完成。

HOOK API有一個原則,這個原則就是:被HOOK的API的原有功能不能受到任何影響。就象醫生救人,如果把病人身體里的病毒殺死了,病人也死了,那么這個“救人”就沒有任何意義了。如果你HOOK API之后,你的目的達到了,但API的原有功能失效了,這樣不是HOOK,而是REPLACE,操作系統的正常功能就會受到影響,甚至會崩潰。

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來引用參數,因此你要非常清楚你的HOOK代碼里此時的EBP/ESP的值是多少;
3,時機的問題,有些HOOK必須在API的開頭,有些必須在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那么此時你就不能寫文件,甚至不能訪問文件;HOOK RECV(),如果你在API頭HOOK,此時還沒有收到數據,你就去查看RECV()的接收緩沖區,里面當然沒有你想要的數據,必須等RECV()正常執行后,在RECV()的尾部HOOK,此時去查看RECV()的緩沖區,里面才有想要的數據;
4,上下文的問題,有些HOOK代碼不能執行某些操作,否則會破壞原API的上下文,原API就失效了;
5,同步問題,在HOOK代碼里盡量不使用全局變量,而使用局部變量,這樣也是模塊化程序的需要;
6,最后要注意的是,被替換的CPU指令的原有功能一定要在HOOK代碼的某個地方模擬實現。

下面以ws2_32.dll里的send()為例子來說明如何HOOK這個函數:

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種方法來HOOK這個API:

1,把API入口的第一條指令是PUSH EBP指令(機器碼0x55)替換成INT 3(機器碼0xcc),然后用WINDOWS提供的調試函數來執行自己的代碼,這中方法被SOFT ICE等DEBUGER廣泛采用,它就是通過BPX在相應的地方設一條INT 3指令來下斷點的。但是不提倡用這種方法,因為它會與WINDOWS或調試工具產生沖突,而匯編代碼基本都要調試;

2,把第二條mov ebp,esp指令(機器碼8BEC,2字節)替換為INT F0指令(機器碼CDF0),然后在IDT里設置一個中斷門,指向我們的代碼。我這里給出一個HOOK代碼:

lea ebp,[esp+12] //模擬原指令mov ebp,esp的功能
pushfd         //保存現場
pushad         //保存現場

//在這里做你想做的事情

popad         //恢復現場
popfd         //恢復現場
iretd         //返回原指令的下一條指令繼續執行原函數(71A21AF7地址處)

這種方法很好,但缺點是要在IDT設置一個中斷門,也就是要進RING0。

3,更改CALL指令的相對地址(CALL分別在71A21B12、71A21B25、71A21B64,但前面2條CALL之前有一個條件跳轉指令,有可能不被執行到,因此我們要HOOK 71A21B64處的CALL指令)。為什么要找CALL指令下手?因為它們都是5字節的指令,而且都是CALL指令,只要保持操作碼0xE8不變,改變后面的相對地址就可以轉到我們的HOOK代碼去執行了,在我們的HOOK代碼后面再轉到目標地址去執行。

假設我們的HOOK代碼在71A20400處,那么我們把71A21B64處的CALL指令改為CALL 71A20400(原指令是這樣的:CALL 71A21230)
而71A20400處的HOOK代碼是這樣的:

71A20400:
pushad

//在這里做你想做的事情

popad
jmp 71A21230   //跳轉到原CALL指令的目標地址,原指令是這樣的:call 71A21230

這種方法隱蔽性很好,但是比較難找這條5字節的CALL指令,計算相對地址也復雜。

4,替換71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(機器碼:813D1C20A371931CA271,10字節)成為

call 71A20400
nop
nop
nop
nop
nop
(機器碼:E8 XX XX XX XX 90 90 90 90 90,10字節)

在71A20400的HOOK代碼是:

pushad
mov edx,71A3201Ch           //模擬原指令cmp dword ptr [71A3201C], 71A21C93
cmp dword ptr [edx],71A21C93h   //模擬原指令cmp dword ptr [71A3201C], 71A21C93
pushfd

//在這里做你想做的事
popfd
popad
ret


這種方法隱蔽性最好,但不是每個API都有這樣的指令,要具體情況具體操作。

以上幾種方法是常用的方法,值得一提的是很多人都是改API開頭的5個字節,但是現在很多殺毒軟件用這樣的方法檢查API是否被HOOK,或其他病毒木馬在你之后又改了前5個字節,這樣就會互相覆蓋,最后一個HOOK API的操作才是有效的,所以提倡用第3和第4種方法。


熱詞搜索:

上一篇:SP2更新時謹防ICMP攻擊
下一篇:查出反向木馬的反向連接域名

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
av亚洲精华国产精华| 亚洲精品国产第一综合99久久| 国产精品18久久久久久久久| 久久久精品tv| 欧美性猛片aaaaaaa做受| 久久99国产精品麻豆| 亚洲日本欧美天堂| 欧美一级爆毛片| 91免费观看视频在线| 免费观看一级欧美片| 亚洲人亚洲人成电影网站色| 91视视频在线直接观看在线看网页在线看| 亚洲欧美韩国综合色| 久久久久九九视频| 日韩美一区二区三区| 欧洲一区在线电影| 不卡的电视剧免费网站有什么| 美脚の诱脚舐め脚责91| 亚洲午夜久久久久久久久电影院| 亚洲欧洲av色图| 国产亚洲1区2区3区| 精品三级av在线| 7777精品伊人久久久大香线蕉 | 欧美午夜影院一区| 中文字幕一区二区三区视频| 色综合久久久久久久久| 日韩精品每日更新| 欧美成人一级视频| 99re66热这里只有精品3直播| 亚洲免费在线播放| 国产欧美日韩视频在线观看| 奇米影视在线99精品| 亚洲制服丝袜在线| 亚洲激情在线播放| 亚洲综合在线观看视频| 亚洲精品成人悠悠色影视| 国产精品色一区二区三区| 国产清纯在线一区二区www| 国产午夜亚洲精品羞羞网站| 国产色婷婷亚洲99精品小说| 欧美国产综合一区二区| 国产精品久久久久久久浪潮网站| 欧美国产精品一区二区三区| 中文字幕亚洲区| 亚洲欧美乱综合| 亚洲一区二区三区四区不卡| 五月天精品一区二区三区| 亚洲成av人片一区二区| 天天操天天干天天综合网| 五月综合激情网| 奇米精品一区二区三区四区| 六月丁香婷婷久久| 国产成人综合在线观看| 丁香六月综合激情| 色综合天天狠狠| 欧美区在线观看| 日韩欧美亚洲一区二区| 久久精品人人做人人爽人人| 国产精品私人自拍| 亚洲一区二区成人在线观看| 日日夜夜精品视频免费| 国内不卡的二区三区中文字幕| 国产成人精品亚洲日本在线桃色| youjizz久久| 欧美日韩国产综合草草| 久久蜜桃av一区二区天堂| 成人免费一区二区三区在线观看| 亚洲第一主播视频| 精品亚洲国内自在自线福利| 成人h动漫精品一区二区| 欧美三级韩国三级日本三斤| 精品欧美一区二区久久| 亚洲天堂网中文字| 蜜臀va亚洲va欧美va天堂| av中文字幕不卡| 成人动漫av在线| 精品国产1区二区| 国产精品美女久久久久aⅴ | 亚洲h动漫在线| 一级女性全黄久久生活片免费| 国产精品美女久久久久高潮| 国产精品久久久久久妇女6080| 一区二区三区不卡在线观看 | 国产日韩精品一区| 中文字幕免费一区| 亚洲一区二区高清| 国产成人综合视频| 欧美日韩黄视频| 中文字幕国产精品一区二区| 日韩精品一二区| 成人手机在线视频| 日韩午夜av电影| 亚洲乱码日产精品bd| 国产麻豆成人传媒免费观看| 精品视频资源站| 中文字幕一区免费在线观看| 蜜臀91精品一区二区三区| 色综合婷婷久久| 久久人人97超碰com| 日韩高清在线观看| 99视频有精品| 国产欧美日韩不卡免费| 日本成人在线看| 欧美视频在线一区二区三区 | 精品嫩草影院久久| 亚洲伊人伊色伊影伊综合网| 国产iv一区二区三区| 69久久夜色精品国产69蝌蚪网| 成人欧美一区二区三区视频网页 | 国产真实乱偷精品视频免| 欧美日韩一区精品| ㊣最新国产の精品bt伙计久久| 麻豆高清免费国产一区| 欧美系列一区二区| 亚洲色图欧洲色图婷婷| www.亚洲在线| 久久久久国产精品免费免费搜索| 美女脱光内衣内裤视频久久网站| 91国产丝袜在线播放| 国产精品国产三级国产a| 精品一区二区三区在线播放视频| 欧美日本一区二区三区四区| 亚洲精品日韩专区silk| 99久久国产综合色|国产精品| 国产精品免费看片| 懂色av一区二区夜夜嗨| 精品一区二区三区欧美| 日韩欧美一级片| 一本一本久久a久久精品综合麻豆| 男人的天堂久久精品| 精品处破学生在线二十三| 丰满放荡岳乱妇91ww| 亚洲精品成人天堂一二三| 欧美精品一区二区三区很污很色的 | 国产精品色婷婷| 韩国欧美国产1区| 欧美大片一区二区| 极品美女销魂一区二区三区| 欧美成人女星排名| 激情综合五月婷婷| www国产精品av| 国产精品自拍一区| 中文字幕欧美三区| 一本大道av一区二区在线播放| 亚洲视频一区二区在线| 91丨九色丨蝌蚪丨老版| 亚洲精品中文字幕乱码三区| 欧美在线免费视屏| 日日欢夜夜爽一区| 欧美成人video| 成人综合在线网站| 亚洲免费观看在线视频| 色婷婷久久99综合精品jk白丝| 亚洲国产综合人成综合网站| 欧美浪妇xxxx高跟鞋交| 久久99最新地址| 中文一区二区在线观看| 欧美在线免费观看亚洲| 美国三级日本三级久久99| 精品嫩草影院久久| av亚洲精华国产精华精| 亚洲国产色一区| 精品国产乱码久久久久久夜甘婷婷| 国产精品一二三四五| 亚洲色图在线播放| 欧美一区二区人人喊爽| 国产麻豆日韩欧美久久| 亚洲裸体在线观看| 日韩一区二区电影| 国产·精品毛片| 亚洲第一福利视频在线| 久久这里只有精品6| 色哟哟在线观看一区二区三区| 日本不卡视频在线| 日本一区二区三区久久久久久久久不| 91视频国产观看| 麻豆一区二区99久久久久| 国产欧美一区二区精品仙草咪| 欧美专区日韩专区| 国产精品综合二区| 亚洲成人免费在线| 国产精品女同互慰在线看| 欧美日韩国产123区| 国产不卡在线播放| 五月综合激情日本mⅴ| 亚洲国产高清在线观看视频| 555www色欧美视频| 日韩一级免费观看| 91精品国产综合久久久久久 | 亚洲男人天堂av网| 五月婷婷久久丁香| 国产成人免费在线| 色播五月激情综合网| 国产亚洲一本大道中文在线| 国产精品欧美久久久久无广告 | 国产成人午夜精品影院观看视频 | 不卡的av电影在线观看| 亚洲国产一区二区三区青草影视| 国产午夜精品一区二区三区视频| 欧美日韩国产电影|