Hook程序(植物大战僵尸为例,未涉及提权)

// hookCode.cpp : 定义 DLL 应用程序的导出函数。
//利用push retn hook 占用8个字节 可以达到jmp的效果

#include "stdafx.h"
#include "hookCode.h"
#include

//CE分析出以下代码
//0044BA45 - 01 87 78550000 - add[edi + 00005578], eax << 阳光增加地址 初始值为19
//0044BA4B - 8B 87 78550000 - mov eax, [edi + 00005578]
//0044BA51 - 3D 06270000 cmp eax, 2706//这里返回执行



//__declspec(naked)代表纯汇编 不影响堆栈且不增加额外汇编代码
DWORD Base_hook = 0;//需要赋初始值 否则注入失败
DWORD Base_hookAddr = 0x44BA45;//存放需要hook的地址
DWORD Base_oldAddr = 0x44BA51;//存放hook执行完后要跳转到的地址

void __declspec(naked) myCode(void){
__asm{
add eax,0x50
add[edi + 0x005578], eax
mov eax, [edi + 0x005578]
mov Base_hook,eax//把想要对象地址保存到全局变量里 这个全局变量就是人造基址
jmp Base_oldAddr
}
}

//修改hook后的代码内容
void __declspec(naked)hookCode(void){
__asm{
push myCode
retn
int 3
int 3
}
}


//安装hook
//push 地址 retn
bool setHook(bool isHook){
//去掉相应代码地址的 页面保护

//保存之前的页面保护属性
DWORD oldProtect = 0;
// 需要去保护的地址 字节数 可读可写 保存hook前的页面保护属性
VirtualProtect((LPVOID)Base_hook, 12, PAGE_EXECUTE_READWRITE, &oldProtect);

//写入Hook代码 对程序代码进行更改
__asm{
//将hook的代码写到需要hook的代码段中
lea edx, hookCode
mov ebx, Base_hookAddr
mov ecx, [edx]
mov[ebx],ecx//写入的第1个4字节
mov ecx, [edx+ 4]
mov[ebx+4], ecx//写入的第2个4字节
mov ecx, [edx+ 8]
mov[ebx+8], ecx//写入的第3个4字节
}

//还原之前的页面保护属性
VirtualProtect((LPVOID)Base_hook, 12, oldProtect, &oldProtect);

return TRUE;
}



你可能感兴趣的:(C++)