拦截聊天记录--Hook技巧简介【原创】
一、????戰場環境
[兵工場]:VC6.0
[兵器譜]:?Detours Express 2.1、Windbg6.11、OllyDBG
二、????戰術分析
Hook從字面上理解就是鉤子的意思,當然這個鉤子不是用來釣魚的。它是用來掛鉤程序用的,程序一但被掛鉤就可以改變程序原有的流程。例如Hook之前的流程如下:
Hook后的流程如下:
攔截XX聊天信息的基本原理就是掛鉤XX的聊天記錄函數,使得我們可以中途處理聊天記錄。
要改變程序的流程有很多匯編指令可以使用,常用的有兩種:JMP、CALL
下面是用OllyDBG反匯編MessageBox得到的頭部代碼:
77D5050B >??? 8BFF????????? MOV EDI,EDI
77D5050D? /.? 55??????????? PUSH EBP
77D5050E? |.? 8BEC????????? MOV EBP,ESP
這五個字節的指令是保護堆棧用的。我們要攻擊的地方就是這5個字節。
Hook后那5個字節是怎么樣的呢?在調試過程中發現Hook后OD不穩定,Hook的5個字節變成了下面的樣子:
77D5050B >- E9 FA0A2B98???? JMP HookDll.1000100A
77D50510??? 833D 1C04D777 0>CMP DWORD PTR DS:[77D7041C],0
77D50517??? 74 24?????????? JE SHORT USER32.77D5053D
77D50519??? 64:A1 18000000? MOV EAX,DWORD PTR FS:[18]
?
跟進跳轉看看做了什么……
一個很大的跳轉,繼續跟進跳轉到下面,我們自己寫的代碼
100010C0??? 55????????????? PUSH EBP
100010C1??? 8BEC??????????? MOV EBP,ESP
100010C3??? 83EC 44???????? SUB ESP,44
100010C6??? 53??? ??????????PUSH EBX
100010C7??? 56????????????? PUSH ESI
100010C8??? 57????????????? PUSH EDI
100010C9??? 8D7D BC???????? LEA EDI,DWORD PTR SS:[EBP-44]
100010CC??? B9 11000000???? MOV ECX,11
100010D1??? B8 CCCCCCCC???? MOV EAX,CCCCCCCC
100010D6??? F3:AB??? ???????REP STOS DWORD PTR ES:[EDI]
100010D8??? 8BF4??????????? MOV ESI,ESP
100010DA??? 8B45 14???????? MOV EAX,DWORD PTR SS:[EBP+14]
100010DD??? 50????????????? PUSH EAX
100010DE??? 68 30E00210???? PUSH HookDll.1002E030
100010E3??? 68 1CE00210???? PUSH HookDll.1002E01C
100010E8??? 8B4D 08???????? MOV ECX,DWORD PTR SS:[EBP+8]
100010EB??? 51????????????? PUSH ECX
100010EC??? FF15 306C0310?? CALL DWORD PTR DS:[10036C30]
100010F2??? 3BF4??????????? CMP ESI,ESP
100010F4??? E8 971D0000???? CALL HookDll.10002E90
100010F9??? 8945 FC???????? MOV DWORD PTR SS:[EBP-4],EAX
100010FC??? 8B45 FC???????? MOV EAX,DWORD PTR SS:[EBP-4]
100010FF??? 5F????????????? POP EDI
10001100??? 5E????????????? POP ESI
10001101??? 5B????????????? POP EBX
10001102??? 83C4 44???????? ADD ESP,44
10001105??? 3BEC??????????? CMP EBP,ESP
10001107??? E8 841D0000???? CALL HookDll.10002E90
1000110C??? 8BE5??????????? MOV ESP,EBP
1000110E??? 5D????????????? POP EBP
1000110F??? C2 1000???????? RETN 10
?
看到紅色那句沒?執行后后回到了原調用MessageBox后面的代碼,也就是上面的代碼段B
這里提下windbg調試器,掌握了它,windows的秘密再也就是秘密了
下面是對程序的分析結果:
看到沒有加載了兩個DLL,Hook要成功的一個重要前提是能夠讀寫進程的內存,否則沒辦法寫任何字節。通常的方法是寫一個DLL注意的進程的空間。網上有一大堆這種DLL注入器,這里就不一一介紹了。
一、????實彈演練
我八成猜到看到這的人已經云里霧里了,放心微軟放出了Detours Express 2.1(XX聊天攔截我沒用這玩意,根據原理自己實現的)專門干這事的。由于我國有明確的法律規定,不能發行惡意代碼,所以XX聊天記錄攔截代碼就不放出來了。下面以我寫的一個Demo為例來介紹。DEMO的功能是通過加載HookDll.dll實例掛鉤USER32.DLL里的MessageBox.? HookDll里實現所有的掛鉤操作。
1.加載DLL前,彈框內容如下:
? ? ??
??
2。加載DLL后,彈框內容如下:
MessageBox彈框內容已經被修改。
3.卸載DLL后,彈框內容如下:
下面講解一下Detours Express 2.1庫的使用:
Detours的幾個核心API如下:
用到的幾個API簡要說明下:
DetourTransactionBegin:?開始一個新的detours事務。
DetourUpdateThread:一個線程入隊等待更新
DetourAttach:將目標進程(MessageBox)和替換它的函數NEW_MessageBox綁定。第一個參數是一個指針,這個指針指向目標函數的指針(有點繞…)。
DetourTransactionCommit:?事務提交,如果不提交之前的更改是不會生效的。這個函數會返回一個值,如果是NO_ERROR 表明是成功,如果是其他的表示失敗。
DetourDetach:解除目標進程和替換函數的綁定,參數和DetourDetach一摸一樣。
下面是Hook代碼:
VOID Hook()?
{?
? DetourRestoreAfterWith();?
? DetourTransactionBegin();?
? DetourUpdateThread(GetCurrentThread());?
?
? //這里可以連續多次調用DetourAttach,表明HOOK多個函數?
? DetourAttach(&(PVOID&)TrueMessageBox,NEW_MessageBoxA);?
?
? DetourTransactionCommit();?
? OutputDebugString("Hook Success!\n");
}?
原始函數MessageBoxA由windows.h聲名了,直接用下面的方式使用
static int (WINAPI* TrueMessageBox)(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType)=MessageBoxA;
?
我們定義的新MessageBoxA如下:
int WINAPI NEW_MessageBoxA(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)?
{?
??????
?????? //修改輸入參數,調用原函數?
?????? int ret=TrueMessageBox(hWnd,"該函數已經被Hook","[測試]",uType);?
?????? return ret;?
}?
在完成了任務之后一定要把鉤子摘掉:
VOID UnHook()?
{?
?????? DetourTransactionBegin();?
?????? DetourUpdateThread(GetCurrentThread());?
??????
?????? //這里可以連續多次調用DetourDetach,表明撤銷多個函數HOOK?
?????? DetourDetach(&(PVOID&)TrueMessageBox,NEW_MessageBoxA);?
??????
?????? DetourTransactionCommit();?
?????? OutputDebugString("UnHook Success!\n");?
}
?
?
注意:我們如果要攔截非windows API的話,通常用下面兩個函數實現原有函數地址的導出:
LoadLibrary()
GetProcAddress()
?
程序下載地址:
http://pan.baidu.com/netdisk/singlepublic?fid=434312_4232810461
總結
以上是生活随笔為你收集整理的拦截聊天记录--Hook技巧简介【原创】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库中智能指针——
- 下一篇: 【Boost】boost库中的小工具en