C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)
目錄
劫持
detours
實現劫持
步驟:
1. 安裝Detours
2. 編譯Detours工程
3. 把靜態庫和頭文件引入工程
4. 函數指針與函數的定義
5.攔截
劫持QQ
實現劫持system函數。
1. 設置項目生成dll
2. 源文件(注意:需要保存為.c文件,或者加上extern C,因為detours是使用C語言實現的,表示代碼使用C的規則進行編譯)?
3. 生成"劫持1.dll"文件
4. 把dll注入到QQ.exe
5. 攔截QQ執行system函數
參考
劫持
- 劫持的原理就是把目標函數的指針的指向修改為自定義函數的地址。
- 函數是放在內存中的代碼區,所以劫持與代碼區密切相關。
- 實現劫持需要使用detours。
detours
- detours是微軟亞洲研究院出口的信息安全產品,主要用于劫持。這個工具使用C語言實現,所以是跨平臺的。
- detours根據函數指針改變函數的行為,可以攔截任何函數,即使操作系統函數。
detours下載地址:
下載地址1: http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx
下載地址2: http://pan.baidu.com/s/1eQEijtS
實現劫持
開發環境說明:win7、vs2012
步驟:
1. 安裝Detours
2. 編譯Detours工程
在安裝目錄C:\Program Files\Microsoft Research\Detours Express 3.0\src目錄下的是工程的源文件。
????????(1) 打開VS2012命令行工具,進入src目錄。
????????(2) 使用nmake(linux下是make)命令編譯生成靜態庫。
?????????(3) 在lib.x86目錄下的.lib文件是win32平臺下的靜態庫文件
?????????(4) 在include目錄下的是Detours工程的頭文件
3. 把靜態庫和頭文件引入工程
// 引入detours頭文件 #include "detours.h"// 引入detours.lib靜態庫 #pragma comment(lib,"detours.lib")4. 函數指針與函數的定義
????????(1) 定義一個函數指針指向目標函數,這里目標函數是system
????????例如:
????????detour在realse模式生效(因為VS在Debug模式下已經把程序中的函數劫持了)
static int ( *oldsystem)(const char * _Command) = system;//定義一個函數指針指向目標函數????????(2) 定義與目標函數原型相同的函數替代目標函數
????????例如:
//3.定義新的函數替代目標函數,需要與目標函數的原型相同 int newsystem(const char * _Command){int result = MessageBoxA(0,"是否允許該程序調用system命令","提示",1);//printf("result = %d", result);if (result == 1){oldsystem(_Command); //調用舊的函數}else{MessageBoxA(0,"終止調用system命令","提示",0);}return 0; }5.攔截
//開始攔截 void Hook() {DetourRestoreAfterWith();//恢復原來狀態(重置)DetourTransactionBegin();//攔截開始DetourUpdateThread(GetCurrentThread());//刷新當前線程(刷新生效)//這里可以連續多次調用DetourAttach,表明HOOK多個函數DetourAttach((void **)&oldsystem, newsystem);//實現函數攔截DetourTransactionCommit();//攔截生效 } //取消攔截 void UnHook() {DetourTransactionBegin();//攔截開始DetourUpdateThread(GetCurrentThread());//刷新當前線程//這里可以連續多次調用DetourDetach,表明撤銷多個函數HOOKDetourDetach((void **)&oldsystem, newsystem); //撤銷攔截函數DetourTransactionCommit();//攔截生效 }劫持QQ
實現劫持system函數。
1. 設置項目生成dll
2. 源文件(注意:需要保存為.c文件,或者加上extern C,因為detours是使用C語言實現的,表示代碼使用C的規則進行編譯)?
#include #include #include // 引入detours頭文件 #include "detours.h"//1.引入detours.lib靜態庫 #pragma comment(lib,"detours.lib")//2.定義函數指針 static int ( *oldsystem)(const char * _Command) = system;//定義一個函數指針指向目標函數//3.定義新的函數替代目標函數,需要與目標函數的原型相同 int newsystem(const char * _Command){char cmd[100] = {0};int result = 0;sprintf_s(cmd,100, "是否允許該程序執行%s指令", _Command);result = MessageBoxA(0,cmd,"提示",1);//printf("result = %d", result);if (result == 1) // 允許調用{oldsystem(_Command); //調用舊的函數}else{// 不允許調用}return 0; }// 4.攔截 //開始攔截 _declspec(dllexport) void Hook() // _declspec(dllexport)表示外部可調用,需要加上該關鍵字其它進程才能成功調用該函數 {DetourRestoreAfterWith();//恢復原來狀態(重置)DetourTransactionBegin();//攔截開始DetourUpdateThread(GetCurrentThread());//刷新當前線程(刷新生效)//這里可以連續多次調用DetourAttach,表明HOOK多個函數DetourAttach((void **)&oldsystem, newsystem);//實現函數攔截DetourTransactionCommit();//攔截生效 }//取消攔截 _declspec(dllexport) void UnHook() {DetourTransactionBegin();//攔截開始DetourUpdateThread(GetCurrentThread());//刷新當前線程//這里可以連續多次調用DetourDetach,表明撤銷多個函數HOOKDetourDetach((void **)&oldsystem, newsystem); //撤銷攔截函數DetourTransactionCommit();//攔截生效 }// 劫持別人的程序:通過DLL注入,并調用Hook函數實現劫持。 // 劫持系統:通過DLL注入系統程序(如winlogon.exe)實現劫持系統函數。_declspec(dllexport) void main(){Hook(); // 攔截system("tasklist"); //彈出提示框UnHook(); // 解除攔截system("ipconfig"); //成功執行system("pause"); // 成功執行 }3. 生成"劫持1.dll"文件
4. 把dll注入到QQ.exe
DLL注入工具下載: https://coding.net/u/linchaolong/p/DllInjector/git/raw/master/Xenos.exe
????????(1) 打開dll注入工具,點擊add,選擇"劫持1.dll"
????????(2) 在Process中選擇QQ.exe,點擊Inject進行注入。
????????(3) 點擊菜單欄Tools,選擇Eject modules顯示當前QQ.exe進程中加載的所有模塊,如果有"劫持1.dll"表示注入成功。
5. 攔截QQ執行system函數
????????(1) 點擊Advanced,在Init routine中填寫動態庫(dll)中的函數的名稱,如Hook,然后點擊Inject進行調用。此時,我們已經把system函數劫持了。
????????(2) 點擊Advanced,在Init routine中填寫main,執行動態庫中的main函數。
?????????此時,彈出一個對話框,問是否允許執行tasklist指令,表示成功把system函數攔截下來了。
參考
DLL注入工具源碼地址: https://coding.net/u/linchaolong/p/DllInjector/git
說明:
該工具來自以下兩個項目
Xenos: https://github.com/DarthTon/Xenos.git
Blackbone: https://github.com/DarthTon/Blackbone
總結
以上是生活随笔為你收集整理的C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell练习03 安装mysql
- 下一篇: 编译原理中LL(1)分析程序的设计---