-
-
inline hook 自动调用原函数实现
-
发表于: 2011-10-12 16:21 3854
-
每次都要写个 __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
其它的删了,也没人来讨论
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!
赞赏
他的文章
赞赏
雪币:
留言: