-
-
inline hook 自动调用原函数实现
-
发表于: 2011-10-12 16:21 3832
-
每次都要写个 __declspec (naked) OriginalXXXX() 觉得很麻烦, 在网上找了半天也没找到实现代码
所以就自己写了个 自动调用原函数 代码
不知道有没 x虾给我的实现一样
其它的删了,也没人来讨论
所以就自己写了个 自动调用原函数 代码
不知道有没 x虾给我的实现一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /******************************************************************** ** ** 此函数是实现的重点 (模拟压入参数,模拟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 |
其它的删了,也没人来讨论
赞赏
他的文章
赞赏
雪币:
留言: