#include <stdio.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "ApiHooks.h"
int (WINAPI *pFunction)(long p1,long p2,long p3, long p4);
typedef int (WINAPI Function)(long p1,long p2,long p3, long p4);
int WINAPI MyMessageBoxA(long p1,long p2,long p3, long p4)
{
const nCountParam = 4;
long pp[nCountParam];
pp[0] = p1,pp = p2,pp = p3,pp = p4;
FILE *fp = fopen("c:\1.txt","w");
char szBuf[1024];
sprintf(szBuf, "参数内容的列表,很容易判断是否是字符串,或者为NULL");
fputs(szBuf, fp);
for(long i = 0; i < nCountParam; i++)
{
sprintf(szBuf,"[p%d] = 0x00000000(0)",i);
_try {
if(pp[i])
sprintf(szBuf,"[p%d] = 0x%08x(%d) "%s"",i,pp[i],pp[i],pp[i]);
}_except(1,1)
{
sprintf(szBuf,"[p%d] = 0x%08x(%d)",i,pp[i],pp[i]);
}
fputs(szBuf,fp);
}
fclose(fp);
return(pFunction(p1, p2, p3,p4));
}
extern "C"__declspec(dllexport) API_HOOK ApiHookChain = {
{"USER32.DLL","MessageBoxA",HOOK_EXACT, NULL, NULL, MyMessageBoxA},
{HOOKS_END}
};
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
HMODULE hDLL = LoadLibrary("USER32.DLL");
if(hDLL)
{
pFunction = (Function *)GetProcAddress(hDLL,"MessageBoxA");
FreeLibrary(hDLL);
}
return TRUE;
}
//--------------------------------MyApiHook.cpp文件结束-----------------------------------------
上面的这个例子分析了大家都熟悉的MessageBox,假设你不知道该函数的参数,通过上面讲的方法,可以很容易的知道该
函数共有4个参数,有返回数。
于是我们可以把该函数定义为:
int WINAPI MessageBox(long p1,long p2,long p3, long p4);
然后自己定义一个MyMessageBoxA的函数(此函数可以很方便的判断该参数是否为字符串)
int WINAPI MyMessageBoxA(long p1,long p2,long p3, long p4)
通过该函数可以生成的该函数的调用的实际内容,
//------------以下为笔者机器上所得到的信息-----------
参数内容的列表,很容易判断是否是字符串,或者为NULL
[p0] = 0x00000000(0)
[p1] = 0x00416698(4286104) "测试对话框"
[p2] = 0x004166a0(4286112) "信息"
[p3] = 0x00000040(64)
//-------------------------------
根据以上信息,可以很容易的知道第2,3个参数为字符串。然后根据里面的内容可以很容易的知道该参数的实际用途。