:00496818 5A pop edx;恢复各寄存器
:00496819 59 pop ecx
:0049681A 5B pop ebx
:0049681B 58 pop eax
:0049681C 8938 mov dword ptr [eax], edi;调用原来的操作,因为我们打补丁的时候跳过了部分操作,因此在这里进行原来的操作。
:0049681E 5F pop edi
:0049681F 5E pop esi
:00496820 5D pop ebp
:00496821 E9CC35FBFF jmp 00449DF2;跳回原来的地址之后接着执行
以上就是拦截补丁的完整代码。在使用的时候,必须先将大话程序的[004966d0]中填充上外挂的窗口句柄,要不然是没办法弄得。
使用W32dasm做补丁的时候好处在于我们看到的就是程序执行时用的虚拟地址,并且,W32dasm在给出汇编代码的同时给出了代码的16进制表示。补丁做完之后,剩下的就是如何将补丁程序放入到目标程序中了。
当外挂窗口创建之后,我们通过向外挂窗口发送WM_USER 2来命令外挂窗口执行修改大话程序的操作。
下面是具体的修改操作:
void TwgHookForm::ModifyXy2(TMessage Message)
{
DWORD dwIdOld1, dwIdOld2, dwIdOld3, dwIdOld4, dwIdOld5;
DWORD id=GetCurrentProcessId();
HANDLE handle1 = OpenProcess(PROCESS_ALL_ACCESS, FALSE,id);
if (wghandle)
{
Byte getrecv1 =
{
0xE9, 0x0E, 0xCa, 0x04, 0x00
}; //5
Byte getrecv2 =
{
0x50, 0x53, 0x51, 0x52, 0x55, 0x57, 0x68, 0x04, 0x04, 0x00,
0x00, 0xA1, 0xd0, 0x66, 0x49, 0x00, 0x50, 0x3E, 0xFF, 0x15,
0x74, 0x92, 0x47, 0x00, 0x5A, 0x59, 0x5B, 0x58, 0x89, 0x38,
0x5F, 0x5E, 0x5D, 0xE9, 0xcc, 0x35, 0xFB, 0xFF
}; //38
VirtualProtectEx(handle1, (void*)(0x004966d0), 4, PAGE_READWRITE,&dwIdOld1);
if ((WriteProcessMemory(handle1, (void*)(0x004966d0), &wghandle, 4,NULL)) == false)
{
ShowMessage("写句柄错误!");
return ;
}
VirtualProtectEx(handle1, (void*)(0x004966d0), 4, dwIdOld1, &dwIdOld1);
VirtualProtectEx(handle1, (void*)(0x00449DED), 5, PAGE_READWRITE,&dwIdOld4);
if ((WriteProcessMemory(handle1, (void*)(0x00449DED), getrecv1, 5, NULL)
) == false)
{
ShowMessage("拦截接收修正补丁错误!");
}
VirtualProtectEx(handle1, (void*)(0x00449DED), 5, dwIdOld4, &dwIdOld4);
VirtualProtectEx(handle1, (void*)(0x00496800), 38, PAGE_READWRITE,&dwIdOld5);
if ((WriteProcessMemory(handle1, (void*)(0x00496800), getrecv2, 38,NULL)) == false)
{
ShowMessage("拦截接收补丁错误!");
}
VirtualProtectEx(handle1, (void*)(0x00496800), 38, dwIdOld5, &dwIdOld5);
}
}
在CB中使用自定义消息,需要在头文件中加入:
#define WM_USER_MODIF (WM_USER 2) //修改大话程序的消息
#define WM_USER_GETSEND (WM_USER 1) //拦截到发送数据接收到的消息
#define WM_USER_APIHOOK (WM_USER 5) //APIHOOK拦截到接收到的消息
#define WM_USER_GETRECV (WM_USER 4) //修改后的程序会向外挂窗口发送该消息。
在外挂窗口类里面(我这里是TwgHookForm),添加函数void ModifyXy2(TMessage Message);
void GetRecv(TMessage Message);
在protected:关键字下面添加消息映射声明:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_