当前位置: 首页 > news >正文

47.HOOK引擎优化支持CALL与JMP位置做HOOK

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

上一个内容: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 xxxxcall 后面的地址是通过它是有一个公式要跳转到的目标地址 - 执行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);

http://www.lryc.cn/news/393411.html

相关文章:

  • liunx上修改Firefox版本号
  • bug——多重定义
  • 将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小
  • 安装 tesseract
  • 为适配kubelet:v0.4 安装指定版本的docker
  • vivado CLOCK_REGION、CLOCK_ROOT
  • alphazero学习
  • 剖析DeFi交易产品之UniswapV3:交易路由合约
  • Agent下载安装步骤
  • 2024年AI技术深入研究
  • Apache Seata分布式事务启用Nacos做配置中心
  • Emacs之解决:java-mode占用C-c C-c问题(一百四十六)
  • go语言day10 接口interface 类型断言 type关键字
  • Java实现登录验证 -- JWT令牌实现
  • liunx文件系统,日志分析
  • Apipost接口测试工具的原理及应用详解(二)
  • 「AIGC」大数据开发语言Scala入门
  • 2.1 tmux和vim
  • 运行vue : 无法加载文件 C:\Program Files\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本。
  • Lambda架构
  • 数据库作业day3
  • 计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)
  • Nuxt 项目集成第三方UI组件库(九)
  • vulnhub靶场之Jarbas
  • 解决onlyoffice警告的一些思路
  • 快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群
  • 【C语言】指针(1):入门理解篇
  • 经典双运算放大器LM358
  • adb不插usb线通过wifi调试
  • vulnhub--IMF