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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)

發布時間:2025/3/15 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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