免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
上一个内容:46.修复HOOK对代码造成的破坏
以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改
优化的是让引擎支持从短跳JMP(E9)与call(E8)的位置上支持hook
完整代码地址:下载名为: htdHook1.0.zip 的文件
链接:https://pan.baidu.com/s/17_aXbMCyexGIlP3Yz_ajIA
提取码:ilbw
--来自百度网盘超级会员V4的分享
Ollydbg.exe编写硬编码的方式:
首先在想要写硬编码的地址上右击选择下图 数据窗口中跟随
然后双击下图黄色框框位置会弹出 编辑此处数据这个窗口,然后在HEX +6这个输入框写硬编码就可以了,写完点确定就完成了
效果图:
优化后的效果图:
HOOKPOINT.cpp文件也进行了修改
HOOKPOINT::HOOKPOINT(LPVOID _adr, LPVOID _adrRet, HOOKBACK _hbk, uchar lenth, HOOKPOINT* _BackP, HOOKPOINT* _NextPoint):
Address(_adr), AddressRet(_adrRet), DestCall(_hbk), BackPoint{ _BackP }, NextPoint{ _NextPoint }
{
DWORD offcount;
/**
下面是修复 call(硬编码是E8) JMP(硬编码是E9)
_adr是要做hook的地方, 假设做hook的地方是call xxxx
call 后面的地址是通过
它是有一个公式要跳转到的目标地址 - 执行jmp指令的内存地址(eip) - 5 这个公式算出来的
只单纯的对它修复,地址是原来的,但是这个代码被我们的辅助代码进行了修复也就是它的内存地址
进入了辅助代码的内存空间里,这就导致要跳转的位置不正确,所以对call或者jmp这种跳转做修复时
它们后面跟的地址也要使用 要跳转到的目标地址 - 执行jmp指令的内存地址(eip) - 5 这个公式计算
公式里的值全都要用辅助代码给它的哪个地址才可以
下面只实现了长跳的jmp与call
*/
char* code = (char*)(_adr);
unsigned* u = (unsigned*)(code + 1);
unsigned dest = u[0] + (unsigned)_adr + 5;
bool fix{};
/**
switch的case用的是int类型,然后code[0]是一个char类型然后switch会做一个隐形的类型转换
所以要把code[0]的值当做int类型来写
*/
switch (code[0])
{
case 0xFFFFFFE8: {
}
case 0xFFFFFFE9:{
fix = true;
break;
}
default:
break;
}
CodeFix = new char[lenth + 0x5];
memcpy(CodeFix, _adr, lenth);
if (fix) {
AfxMessageBox(L"非借壳是否会卡拉和监考老师");
u = (unsigned*)(CodeFix + 1);
u[0] = GetJMPCode(dest, (unsigned)CodeFix);
}
/**
下面是之前分析剑侠情缘用来无敌的代码
mov [esi + 10], edi
mov eax, [esi+10]
jmp Address+lenth // 这个是执行完剑侠情缘原有代码让它再跳回去
CodeFix长度是 lenth+0x5,lenth是要进行hook位置的指令长度,0x5是执行完指令之后让他跳回去
*/
DWORD dOld;
CodeFix[lenth] = 0xE9;
unsigned* adr = (unsigned*)(CodeFix + lenth + 1);
adr[0] = GetJMPCode((unsigned)_adr + lenth, (unsigned)&CodeFix[lenth]);
VirtualProtect(CodeFix, lenth+0x5, PAGE_EXECUTE_READWRITE, &dOld);
}
CWndMain.cpp文件修改,修改了OnBnClickedButton2函数
hook.SetHook((LPVOID)0x41FD2C, NewWudi, 5, (LPVOID)0x41FE40);