最近逆向某聊天軟體協議部分,需要列印出所有報文加解密的原文,密文以及金鑰。想通過hook的方式,hook匯出函式的位址,然後在函式進入前輸出想要的入參,函式返回時輸出想要的出參。用到了dll注入的方式。參考了逆向工程核心原理的內容。可通用性還可以,分享**如下:
如果想針對自己的dll進行hook,需要修改的檔案部分如下:
#include "stdafx.h"
#include "gdc_apihook.h"
#include #include #include #include #pragma comment(lib,"ws2_32.lib") //主機轉位元組序
gdc_apihook g_objscalehook;
gdc_apihook g_objcorehook;
file *fp = null;
char buf = ;
char zero = ; //填充部分,我這裡自己標識位,無意義。
typedef unsigned int (*aout_filtersplay) (int *in, __m128 *out, unsigned int flag, int param, const __m128i *param2); //待捕獲函式的替代。這裡注意引數需要和hook的函式個數一樣,型別不是很重要。且函式呼叫方式要一樣,這裡函式呼叫方式指stdcall之類。
//這裡就是函式的具體實現了,其中有函式的真實呼叫。在呼叫前後列印自己所需的引數即可。
unsigned int gdc_aout_filtersplay (int *in, __m128 *out, unsigned int flag, int param, const __m128i *param2)
//上面是函式之前的呼叫
//下面接真實函式呼叫後,輸出需要的返回引數
unsigned int p = oldfileterplay(in, out, flag, param, param2);
if(flag == 5)
return p;
}void hook()
int addr = (int)getprocaddress(hmod, "aout_filtersplay");
g_objcorehook.hookapi((char*)addr, (char*)gdc_aout_filtersplay);*/
hmodule hmod = getmodulehandle("wechatwin.dll");//dll名稱
if (null == hmod)
int addr = ((int)hmod) + 0x215a0;//偏移位址
g_objcorehook.hookapi((char*)addr, (char*)gdc_aout_filtersplay);
//g_objscalehook.hookapi((char*)addr, (char*)gdc_dowork);
}bool apientry dllmain( hmodule hmodule,
dword ul_reason_for_call,
lpvoid lpreserved
)return true;}
共分兩個exe,乙個是hook的dll,就是上面那長段**生成的。
乙個是dll注入函式,用來將上面編寫的hook用dll注入進exe,使用方式如下:
injectdll.exe 276748 c:\users\liuti\downloads\apihook\apihook\release\apihook.dll
其中 276748 是需要注入的exe的當前pid。 動態鏈結庫中匯出模板函式
c 支援函式模板。利用函式模板,能夠簡化我們的程式 我在自己的 中也經經常使用到函式模板,可是曾經一直以為函式模板是要放到標頭檔案裡的,否則呼叫模板函式時,編譯器會找不到函式模板的定義。今天閒暇,又翻了翻 c primer。發現我曾經的理解是有問題的。模板函式也能夠像普通函式那樣。將宣告放在標頭檔案...
DLL中匯出函式的兩種方式
dll中匯出函式的兩種方式 dllexport與.def檔案 2009 03 06 11 34 58 標籤 dll匯出函式 兩種方式 declspec dllexport def 檔案it 分類 程式設計技術 dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dlle...
DLL中匯出函式的兩種方式
經常使用vc6的dependency檢視dll匯出函式的名字,會發現有dll匯出函式的名字有時大不相同,導致不同的原因大多是和編譯dll時候指定dll匯出函式的界定符有關係。vc 支援兩種語言 即c c 這也是造成dll匯出函式差異的根源 我們用vs2008新建個dll工程,工程名為 testdll...