这个是我写的一个简单的HOOK MessageBox的代码,思路是改变MessageBox的开头的几个字节写入我自己的函数地址,程序执行到MessageBox的时候转入我自己的函数中执行.
我自己的函数就是先把MessageBox还原,然后调用
MessageBoxA(hWnd,"你被Hook",lpCaption,uType);
显示消息.
代码很简单,但是出了点问题,请大家帮忙看看,我这里没给注入的代码,我是用工具注入到某个进程中的.程序我都注释了很多,力求大家很容易就看明白...
我想了很长时间也不知道错在哪里...麻烦大家帮忙解决一下
先谢谢了...
//这是一个名字为MyHook.dll 的DLL文件
#include "stdafx.h"
int MyMessageBox( HWND hWnd,LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
//=========================================
void Write_Process();//HOOK的主要函数
//=========================================
#pragma data_seg ( ".Shared" )
char old[5] = {0};
char Jmp[5] = {(char)0xE9}; //这里是放跳转的地方,我要把这个值写入MessageBox的入口点让它执行我的函数
DWORD offset = 0; //存放偏移
DWORD g_Addr = 0;
#pragma data_seg ()
//=========================================
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if( DLL_PROCESS_ATTACH == ul_reason_for_call )
{
Write_Process();
}
return TRUE;
}
//=========================================
//这是我写入MessageBox入口地址的函数,也就是HOOK的实现
void Write_Process()
{
DWORD dwOldProtect,temp;
HMODULE hmod = ::LoadLibrary("User32");
DWORD Addr = (DWORD)::GetProcAddress(hmod,"MessageBoxA");
g_Addr = Addr; //把MessageBoxA的地址给全局的g_Addr
::VirtualProtect((PVOID)Addr,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);//
if(!::ReadProcessMemory((void*)-1,(PVOID)Addr,old,5,NULL))
MessageBox(NULL,"读取失败!","Warn!",MB_OK);
offset = (DWORD)MyMessageBox - Addr-5;
memcpy(Jmp + 1, &offset, 4);
if(!::WriteProcessMemory((void*)-1,(PVOID)Addr,Jmp,5,NULL))
MessageBox(NULL,"写入失败!","Warn!",MB_OK);
::VirtualProtect((PVOID)g_Addr,5,dwOldProtect,&temp);//还原内存属性
FreeLibrary(hmod);
}
//=========================================
//=========================================================
//这个是我的替换函数
//我的目的是让程序执行MessageBox的时候先到我函数中来,我改变MessageBox显示的内容,然后还原MessageBox,再调用MessageBox
int MyMessageBox( HWND hWnd,LPCTSTR lpText, LPCTSTR lpCaption, UINT uType )
{
DWORD dwOldProtect,temp;
::VirtualProtect((PVOID)g_Addr,5,PAGE_EXECUTE_READWRITE,&dwOldProtect);
::WriteProcessMemory((void*)-1,(PVOID)g_Addr,old,5,NULL);
::VirtualProtect((PVOID)g_Addr,5,dwOldProtect,&temp);
//再次调用MessageBox
return MessageBoxA(hWnd,"你被Hook了",lpCaption,uType);
}
//=========================================================
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)