// hook.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#ifndef ASSERT
#include <crtdbg.h>
#define ASSERT(X) _ASSERT(X);
#endif
typedef int (WINAPI* pDefaultAPI)(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
pDefaultAPI pOldAPI = NULL; //此指针pOldAPI保存原来API函数的地址(通过GetProcAddress获取)
char szOldAPI[12] = {0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xC3}; //存放原来API函数在内存中的前12个字节
char szNewAPI[12] = {0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xC3}; //存放我们处理后的5个字节,JMP指令(1个字节)+新函数地址(4个字节)
HMODULE g_hThisModule = NULL;
//*********************停止HOOK的函数************************//
void UnHook()
{
WriteProcessMemory((PVOID)-1, pOldAPI, szOldAPI, 12, NULL);//还原原函数
}
//*********************重新HOOK API 的函数********************//
void ReHook()
{
WriteProcessMemory((void*)-1, pOldAPI, szNewAPI, 12, NULL);//原函数执行完,重新hook之!
}
int WINAPI NewAPI(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
)
{
//为所欲为
UnHook();
MessageBoxA(NULL,"被我HOOK了...","提示",0);
int A = MessageBox(hWnd,lpText,lpCaption,uType); //调用还原后的原函数
ReHook();
//为所欲为
return A;
}
//*********************HOOK API的函数*************************//
bool HookAPI()
{
//找到API函数在内存中的地址
pOldAPI = 0;
HMODULE hModule = LoadLibrary(_T("user32.dll"));
pOldAPI = (pDefaultAPI)GetProcAddress(hModule, "MessageBoxA");
memcpy(szNewAPI + 2, &pOldAPI, 8);
ASSERT(pOldAPI);//加上断言,如果此地址为空则程序退出
DWORD64 dwJmpAddr = 0;
dwJmpAddr = (DWORD64)NewAPI;
memcpy(szNewAPI + 2, &dwJmpAddr, 8);
FreeLibrary(hModule);
ReadProcessMemory ((void*)-1, pOldAPI, szOldAPI, 12, NULL); //读出原来的前12个字节
WriteProcessMemory((void*)-1, pOldAPI, szNewAPI, 12, NULL); //写入我们处理后的12个字节
return true;
}
bool UnHookAPI()
{
return true;
}
BOOL APIENTRY DllMain(HANDLE handle, DWORD dwReason, LPVOID reserved)
{
g_hThisModule = (HMODULE)handle;
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
HookAPI();
break;
}
case DLL_PROCESS_DETACH:
{
UnHookAPI();
break;
}
}
return TRUE;
}
/*
*用来测试可以自己hook自己,如果执行下面的main,
*这个代码就要放在控制台程序里,而不是dll工程里
*/
int main()
{
HookAPI();
MessageBox(GetForegroundWindow(),"hook Messagebox", "Test", MB_OK);
}
- 1
- 2
前往页