最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

封裝Detours用于Python中x64函數(shù)hook詳解

 更新時間:2023年12月23日 08:55:20   作者:Python成長路  
Detours是微軟發(fā)布的一個API hook框架,同時支持x86和x64,看文檔說也支持ARM和ARM64的Windows,這篇文章主要介紹了封裝Detours用于Python中x64函數(shù)hook,需要的朋友可以參考下

Detours

代碼倉庫: https://github.com/microsoft/Detours

x64寫一個任意地址hook要比x86麻煩的多,所以這里直接封裝框架來用于x64的hook。

Detours是微軟發(fā)布的一個API hook框架,同時支持x86和x64,看文檔說也支持ARM和ARM64的Windows。

編譯文檔

Detours翻了下github,并沒有發(fā)現(xiàn)什么編譯文檔,就只有README里面有這么一段話:

大概意思是說打開visual studio的命令行,然后切換到源碼目錄,執(zhí)行nmake就能編譯,測試除了一個小問題確實是可以編譯成功。

visual studio的命令行在開始菜單里打開,上面兩個是x86的,下面兩個是x64的,至于x64和x86_x64有啥區(qū)別我就不清楚了,因為測試編譯的時候沒什么不一樣的,就懶得去搜了。

錯誤

編譯的時候有一個錯誤: 'sn' 不是內(nèi)部或外部命令,也不是可運行的程序

搜索發(fā)現(xiàn)這是一個秘鑰管理和簽名驗證的工具,而visual studio安裝完后就已經(jīng)有了,那就是沒加入到環(huán)境變量里,用everything搜索一下,把這個路徑添加到環(huán)境變量。我就臨時用set命令來設(shè)置環(huán)境變量

開始編譯

如果要編譯64位就打開64位的命令行,
set path=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64;%path%

nmake或者nmake all(可以從cmake文件里看到,還有nmake cleannmake test等)

這樣就編譯成功了,然后就會在bin.X64和lib.X64生成相應(yīng)的文件,需要的是lib.X64下面的lib庫

怎么編譯Debug版本

這樣編譯出來的版本應(yīng)該是Release版本,因為沒有pdb文件,看了下cmake文件里的信息,指定Debug版本的變量是DETOURS_CONFIG, 而指定是x86、x64、arm的變量是DETOURS_TARGET_PROCESSOR

!IF "$(DETOURS_CONFIG)" == "Debug"
DETOURS_DEBUG=1
!ELSE
DETOURS_DEBUG=0
!ENDIF

那么只需要在編譯之前執(zhí)行下set DETOURS_CONFIG=Debug就可以編譯成Debug版本的了,會生成一個lib.X64Debug目錄,里面編譯出來的lib就有了pdb文件

編譯成dll

Detours的使用很簡單,幾行代碼就行了,srcFunc是hook的函數(shù)指針的指針,注意這是二級指針(PVOID就是void *),具體為什么要定義二級指針看下面的解釋。newFunc是新函數(shù)的函數(shù)指針,在c++里的話,可以直接傳函數(shù)名。

#include "detours.h"
DWORD DetourHookFunction(PVOID* srcFunc, PVOID newFunc) {
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourAttach(srcFunc, newFunc);
	DetourTransactionCommit();
	return 0;
}
DWORD DetourUnHookFunction(PVOID* srcFunc, PVOID newFunc) {
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourDetach(srcFunc, newFunc);
	DetourTransactionCommit();
	return 0;
}

為了避免大家還不知道,我說一下怎么引入頭文件和lib庫

引入外部頭文件

如果就想Detours就兩個頭文件,你可以直接添加到項目里,如果頭文件比較多的話,放到dllmain.cpp目錄下,然后在右鍵屬性里,配置屬性->C/C++->常規(guī)->附加包含目錄添加這個頭文件目錄,我這里用$(ProjectDir)來表示項目的目錄, 你也可以添加絕對路徑。

注意上面配置(C)選所有配置,平臺(P)選所有平臺,避免每個配置都要添加一遍

lib庫則是在鏈接器->常規(guī)->附加庫目錄里添加

你可以在輸入里填lib庫的名稱(detours.lib)

不過我更喜歡在代碼里用#pragma comment(lib, "detours.lib")來引入lib庫,因為這樣可以根據(jù)宏來分別引入Debug還是Release的lib

#ifdef _DEBUG
#pragma comment(lib, "detours.lib")
#else
#pragma comment(lib, "detoursd.lib")
#endif

也可以判斷是x86還是x64

#ifdef _WIN64
#pragma comment(lib, "detours64.lib")
#else
#pragma comment(lib, "detours32.lib")
#endif

也可以兩個宏都判斷一下。

hook函數(shù)為啥要定義成二級指針

我為啥要定義成二級指針?因為DetourAttach函數(shù)就是傳的二級指針,它的定義如下:

LONG WINAPI DetourAttach(_Inout_ PVOID *ppPointer,
                         _In_ PVOID pDetour);

為啥DetourAttach要把它定義成二級指針? 開始我也不理解這個問題,直到我想在Python里調(diào)用原函數(shù),發(fā)生了無限遞歸的異常。

為啥C++寫的代碼不會觸發(fā)無限遞歸,它同樣是用的函數(shù)指針來調(diào)用,要想知道原因只能自己使用x64dbg調(diào)試看看。

經(jīng)過漫長的調(diào)試發(fā)現(xiàn),我傳進(jìn)去的ppPointer指針指向的值會被修改,它不在指向原函數(shù)(被hook函數(shù)),而是指向Detours新構(gòu)建的一個函數(shù)指針,這也就能解釋為啥不會無限遞歸了

這里再接上【Python微信機(jī)器人】第六七篇: 封裝32位和64位Python hook框架實戰(zhàn)打印微信日志這篇文章留的一個坑: 如何在新函數(shù)里調(diào)用原函數(shù)。

c_log_addr就是我傳給DetourAttach的第一個參數(shù)ppPointer,我通過調(diào)用Detours修改后的函數(shù)指針也就是c_log_addr.value就可以避免無限遞歸的問題

你可以在hook前和hook后打印下c_log_addr.value的值看一下,肯定是不一樣的,

Python使用Detours

這個就看【Python微信機(jī)器人】第六七篇: 封裝32位和64位Python hook框架實戰(zhàn)打印微信日志這篇文章了,里面說了怎么用Detours的dll hook日志

相關(guān)文章

最新評論

东光县| 元氏县| 五原县| 荆州市| 泰州市| 云南省| 始兴县| 青州市| 肥东县| 巴中市| 隆昌县| 汤原县| 长乐市| 曲周县| 玉山县| 镇巴县| 临沭县| 安阳市| 深泽县| 彝良县| 娄底市| 海伦市| 武强县| 大丰市| 利川市| 贵南县| 华蓥市| 甘德县| 当雄县| 奎屯市| 敦化市| 新密市| 宝鸡市| 新龙县| 扬中市| 灵台县| 手游| 呼图壁县| 瓦房店市| 荥阳市| 灵寿县|