日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拦截聊天记录--Hook技巧简介【原创】

發布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拦截聊天记录--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技巧简介【原创】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。