青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

淺談API HOOK技術(shù)

HOOK API是一個(gè)永恒的話題,如果沒有HOOK,許多技術(shù)將很難實(shí)現(xiàn),也許根本不能實(shí)現(xiàn)。這里所說的API,是廣義上的API,它包括DOS下的中斷, WINDOWS里的API、中斷服務(wù)、IFS和NDIS過濾等。比如大家熟悉的即時(shí)翻譯軟件,就是靠HOOK TextOut()或ExtTextOut()這兩個(gè)函數(shù)實(shí)現(xiàn)的,在操作系統(tǒng)用這兩個(gè)函數(shù)輸出文本之前,就把相應(yīng)的英文替換成中文而達(dá)到即時(shí)翻譯;IFS 和NDIS過濾也是如此,在讀寫磁盤和收發(fā)數(shù)據(jù)之前,系統(tǒng)會(huì)調(diào)用第三方提供的回調(diào)函數(shù)來判斷操作是否可以放行,它與普通HOOK不同,它是操作系統(tǒng)允許 的,由操作系統(tǒng)提供接口來安裝回調(diào)函數(shù)。

甚至如果沒有HOOK,就沒有病毒,因?yàn)椴还苁荄OS下的病毒或WINDOWS里的病毒,都是靠HOOK系統(tǒng)服務(wù)來實(shí)現(xiàn)自己的功能的:DOS下的病毒靠 HOOK INT 21來感染文件(文件型病毒),靠HOOK INT 13來感染引導(dǎo)扇區(qū)(引導(dǎo)型病毒);WINDOWS下的病毒靠HOOK系統(tǒng)API(包括RING0層的和RING3層的),或者安裝IFS(CIH病毒所 用的方法)來感染文件。因此可以說“沒有HOOK,就沒有今天多姿多彩的軟件世界”。

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

HOOK API有一個(gè)原則,這個(gè)原則就是:被HOOK的API的原有功能不能受到任何影響。就象醫(yī)生救人,如果把病人身體里的病毒殺死了,病人也死了,那么這個(gè) “救人”就沒有任何意義了。如果你HOOK API之后,你的目的達(dá)到了,但API的原有功能失效了,這樣不是HOOK,而是REPLACE,操作系統(tǒng)的正常功能就會(huì)受到影響,甚至?xí)罎ⅰ?br>
HOOK API的技術(shù),說起來也不復(fù)雜,就是改變程序流程的技術(shù)。在CPU的指令里,有幾條指令可以改變程序的流程:JMP,CALL,INT,RET, RETF,IRET等指令。理論上只要改變API入口和出口的任何機(jī)器碼,都可以HOOK,但是實(shí)際實(shí)現(xiàn)起來要復(fù)雜很多,因?yàn)橐幚砗靡韵聠栴}:

1,CPU指令長度問題,在32位系統(tǒng)里,一條JMP/CALL指令的長度是5個(gè)字節(jié),因此你只有替換API里超過5個(gè)字節(jié)長度的機(jī)器碼(或者替換幾條指 令長度加起來是5字節(jié)的指令),否則會(huì)影響被更改的小于5個(gè)字節(jié)的機(jī)器碼后面的數(shù)條指令,甚至程序流程會(huì)被打亂,產(chǎn)生不可預(yù)料的后果;
2,參數(shù)問題,為了訪問原API的參數(shù),你要通過EBP或ESP來引用參數(shù),因此你要非常清楚你的HOOK代碼里此時(shí)的EBP/ESP的值是多少;
3,時(shí)機(jī)的問題,有些HOOK必須在API的開頭,有些必須在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那么此時(shí)你就不能寫文件,甚至不能訪問文件;HOOK RECV(),如果你在API頭HOOK,此時(shí)還沒有收到數(shù)據(jù),你就去查看RECV()的接收緩沖區(qū),里面當(dāng)然沒有你想要的數(shù)據(jù),必須等RECV()正常 執(zhí)行后,在RECV()的尾部HOOK,此時(shí)去查看RECV()的緩沖區(qū),里面才有想要的數(shù)據(jù);
4,上下文的問題,有些HOOK代碼不能執(zhí)行某些操作,否則會(huì)破壞原API的上下文,原API就失效了;
5,同步問題,在HOOK代碼里盡量不使用全局變量,而使用局部變量,這樣也是模塊化程序的需要;
6,最后要注意的是,被替換的CPU指令的原有功能一定要在HOOK代碼的某個(gè)地方模擬實(shí)現(xiàn)。

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

Exported fn(): send - Ord:0013h
地址      機(jī)器碼              匯編代碼
:71A21AF4 55                push ebp //將被HOOK的機(jī)器碼(第1種方法)
:71A21AF5 8BEC              mov ebp, esp //將被HOOK的機(jī)器碼(第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的機(jī)器碼(第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的機(jī)器碼(第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這個(gè)API:

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

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

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

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

popad          //恢復(fù)現(xiàn)場
popfd          //恢復(fù)現(xiàn)場
iretd          //返回原指令的下一條指令繼續(xù)執(zhí)行原函數(shù)(71A21AF7地址處)

這種方法很好,但缺點(diǎn)是要在IDT設(shè)置一個(gè)中斷門,也就是要進(jìn)RING0。

3,更改CALL指令的相對(duì)地址(CALL分別在71A21B12、71A21B25、71A21B64,但前面2條CALL之前有一個(gè)條件跳轉(zhuǎn)指令,有 可能不被執(zhí)行到,因此我們要HOOK 71A21B64處的CALL指令)。為什么要找CALL指令下手?因?yàn)樗鼈兌际?字節(jié)的指令,而且都是CALL指令,只要保持操作碼0xE8不變,改變 后面的相對(duì)地址就可以轉(zhuǎn)到我們的HOOK代碼去執(zhí)行了,在我們的HOOK代碼后面再轉(zhuǎn)到目標(biāo)地址去執(zhí)行。

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

71A20400:
pushad

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

popad
jmp 71A21230    //跳轉(zhuǎn)到原CALL指令的目標(biāo)地址,原指令是這樣的:call 71A21230

這種方法隱蔽性很好,但是比較難找這條5字節(jié)的CALL指令,計(jì)算相對(duì)地址也復(fù)雜。

4,替換71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(機(jī)器碼:813D1C20A371931CA271,10字節(jié))成為
call 71A20400
nop
nop
nop
nop
nop
(機(jī)器碼:E8 XX XX XX XX 90 90 90 90 90,10字節(jié))

在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
這種方法隱蔽性最好,但不是每個(gè)API都有這樣的指令,要具體情況具體操作。

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

posted on 2007-07-29 10:32 旅途 閱讀(1422) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 深入windows

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美黄色免费网站| 亚洲福利视频二区| 亚洲国产高清在线| 久久国产婷婷国产香蕉| 欧美一区免费视频| 久久国产免费| 蜜桃av一区二区| 激情亚洲网站| 99xxxx成人网| 一二美女精品欧洲| 午夜综合激情| 麻豆国产va免费精品高清在线| 亚洲毛片网站| 亚洲视频免费| 久久三级福利| 欧美日韩国产成人在线91| 欧美午夜宅男影院| 狠狠操狠狠色综合网| 日韩午夜三级在线| 午夜在线一区| 亚洲福利视频网站| 亚洲尤物在线| 欧美成人精品在线| 国产伦精品一区二区三区在线观看| 男人的天堂成人在线| 欧美日韩一区二区在线播放| 国产欧美日本| 99国产精品久久久久久久| 久久不射电影网| 欧美色图首页| 久久久精品日韩| 欧美激情网友自拍| 国产原创一区二区| 亚洲欧美成人一区二区三区| 亚洲精品网址在线观看| 午夜精品在线看| 亚洲国产精品va在线看黑人| 亚洲欧美日韩一区二区| 亚洲字幕在线观看| 欧美电影打屁股sp| 欧美连裤袜在线视频| 国产一区视频在线观看免费| 亚洲伊人伊色伊影伊综合网| 亚洲一区成人| 欧美二区乱c少妇| 午夜老司机精品| 国产精品成人aaaaa网站| 亚洲激情电影在线| 开心色5月久久精品| 欧美1级日本1级| 亚洲欧美日韩一区在线观看| 欧美日韩一区三区| 日韩视频中文字幕| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产欧美一区视频| 亚洲激情av在线| 裸体歌舞表演一区二区| 欧美肥婆在线| 欧美与黑人午夜性猛交久久久| 久久大综合网| 国产区在线观看成人精品| 午夜精品久久久久久久男人的天堂| 欧美夜福利tv在线| 亚洲视频精选| 国产精品视频男人的天堂| 亚洲欧美国产毛片在线| 一二美女精品欧洲| 国产精品久久久久国产a级| 亚洲视频日本| 国产精品99久久久久久久久久久久 | 久久亚洲美女| 在线观看视频一区| 欧美激情第3页| 欧美精品免费观看二区| 亚洲小说欧美另类社区| 久久影院午夜论| 亚洲国产精品欧美一二99| 亚洲女女做受ⅹxx高潮| 亚洲自拍三区| 午夜在线观看欧美| 极品少妇一区二区三区精品视频| 亚洲人成在线观看网站高清| 鲁鲁狠狠狠7777一区二区| 蜜臀av一级做a爰片久久| a91a精品视频在线观看| 在线一区视频| 狠狠做深爱婷婷久久综合一区| 制服丝袜激情欧洲亚洲| 9久re热视频在线精品| 麻豆久久久9性大片| 99精品国产一区二区青青牛奶| 久久久久久久久久久久久9999| 亚洲精品久久久久久久久久久久久 | 国产精品一区二区三区乱码| 在线免费观看欧美| 亚洲国产欧美国产综合一区| 欧美女主播在线| 久久精品人人做人人爽| 欧美国产日韩在线| 亚洲成人资源网| 亚洲欧洲日本mm| 国产精品一区二区在线观看不卡| 99v久久综合狠狠综合久久| 一区二区三区你懂的| 好吊色欧美一区二区三区四区| 欧美一二三区精品| 久久夜色精品一区| 性欧美激情精品| 欧美精品亚洲一区二区在线播放| 亚洲第一视频| 中文一区二区| 日韩一区二区高清| 欧美激情欧美激情在线五月| 久久精品理论片| 激情久久五月天| 在线亚洲欧美视频| 一区二区高清| 在线亚洲一区| 99国产精品99久久久久久| 亚洲精品裸体| 亚洲国产成人久久综合一区| 亚洲欧美一区二区三区极速播放| 国产精品欧美日韩一区| 亚洲激情综合| 91久久中文字幕| 久久综合狠狠| 女女同性精品视频| 在线观看国产日韩| 欧美福利影院| 影音先锋日韩资源| 久久久亚洲人| 暖暖成人免费视频| 亚洲国产精品女人久久久| 欧美中文字幕不卡| 久久亚洲私人国产精品va| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产激情| 日韩网站在线观看| 欧美日韩在线视频一区二区| 欧美午夜影院| 亚洲在线视频观看| 男人插女人欧美| 国产精品久久久久久久久免费| 亚洲一区二区免费在线| 久久婷婷国产综合国色天香| 久久免费99精品久久久久久| 国产欧美日韩视频一区二区三区 | 国产精品视频久久久| 99国产精品国产精品久久| 日韩一区二区免费高清| 欧美福利电影网| 亚洲人成高清| 亚洲线精品一区二区三区八戒| 欧美亚洲日本网站| 久久精品免费播放| 黄色av成人| 你懂的国产精品| 性欧美video另类hd性玩具| 国产精品免费视频xxxx| 亚洲欧美日韩一区在线观看| 久久久久久亚洲精品杨幂换脸 | 亚洲精品在线观看免费| 99天天综合性| 国产麻豆综合| 久久在线视频| 一本色道久久综合亚洲精品按摩| 国产一区在线视频| 久久免费精品日本久久中文字幕| 亚洲一区二区动漫| 久久亚洲精品视频| 亚洲精品小视频在线观看| 依依成人综合视频| 国产精品99久久久久久久女警| 亚洲福利视频专区| 欧美日韩无遮挡| 欧美一级成年大片在线观看| 美女视频黄a大片欧美| 一区二区三区高清视频在线观看| 久久亚洲精品欧美| 亚洲最新合集| 另类专区欧美制服同性| 一区二区三区高清在线观看| 国内激情久久| 欧美在线视频a| 亚洲国产精品一区在线观看不卡| 在线观看中文字幕亚洲| 欧美视频三区在线播放| 久久久久国产一区二区| 一区二区三区欧美成人| 欧美成人免费全部观看天天性色| 国内精品**久久毛片app| 欧美精品三级日韩久久| 久久九九热免费视频| 久久综合九色综合网站| 日韩视频免费观看| 欧美久久电影| 日韩一级在线| 亚洲久久成人| 欧美激情一区二区三区全黄| 久久精品成人一区二区三区蜜臀 |