-
-
inline hook 自动调用原函数实现
-
发表于: 2011-10-12 16:21 3842
-
每次都要写个 __declspec (naked) OriginalXXXX() 觉得很麻烦, 在网上找了半天也没找到实现代码
所以就自己写了个 自动调用原函数 代码
不知道有没 x虾给我的实现一样
其它的删了,也没人来讨论
所以就自己写了个 自动调用原函数 代码
不知道有没 x虾给我的实现一样
#include "stdafx.h" #include <wininet.h> #include "Packet.h" #include "hookhlp.h" HINTERNET WINAPI __InternetOpenUrlA( IN HINTERNET hInternet, IN LPCSTR lpszUrl, IN LPCSTR lpszHeaders OPTIONAL, IN DWORD dwHeadersLength, IN DWORD dwFlags, IN DWORD dwContext ) { // 过滤之前, 自动调用原函数 // callOriginal 模拟调用原函数 // callOriginal 函数必须内联编译到此函数中 // callOriginal 传入第一个参数地址,和最后一个参数地址 HINTERNET hFile = (HINTERNET)callOriginal(&hInternet, &dwContext); //此时调用的是 InternetOpenUrlA() if (hFile && lpszUrl) MessageBoxA(NULL, lpszUrl, "__InternetOpenUrlA", MB_OK); return hFile; } int WINAPI __MessageBoxA(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType) { if (lpText == NULL) lpText = "lpText"; if (lpCaption == NULL) lpCaption = "lpCaption"; // 过滤之后, 自动调用原函数 // callOriginal 模拟调用原函数 // callOriginal 函数必须内联编译到此函数中 // callOriginal 传入第一个参数地址,和最后一个参数地址 return (int)callOriginal(&hWnd, &uType); //此时调用的是 MessageBoxA() } BOOL APIENTRY DllMain( HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) { FARPROC proc; switch (fdwReason) { case DLL_PROCESS_ATTACH: // // 挂钩 // proc = GetProcAddress(LoadLibraryA("wininet"), "InternetOpenUrlA"); inlineHeadHook( proc, lookupAddr((FARPROC)__InternetOpenUrlA) ); // // 挂钩 // proc = GetProcAddress(LoadLibraryA("user32"), "MessageBoxA"); inlineHeadHook( proc, lookupAddr((FARPROC)__MessageBoxA) ); MessageBoxA(0, 0, 0, 0); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
/******************************************************************** ** ** 此函数是实现的重点 (模拟压入参数,模拟call 函数) ** 只支持 __stdcall 支持 __cdecl 调用自己动手 ** ********************************************************************/ __inline long callOriginal(void *var_begin, void *var_end) { // // 从右往左 压入参数 // u_long *begin = (u_long *)var_begin; u_long *end = (u_long *)var_end; while (end >= begin) {u_long var = *end; __asm {push var} --end; } __asm { push offset Xret ; 压入返回地址 nop nop nop nop nop nop nop nop; 后面的nop 就要看hook yy函数 就模拟什yy函数的前几条指令了 nop nop nop nop nop nop nop nop nop nop Xret: } } #endif
其它的删了,也没人来讨论
赞赏
他的文章
赞赏
雪币:
留言: