ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

植物大战僵尸:学会使用人造指针

2022-01-22 09:34:54  阅读:276  来源: 互联网

标签:汇编 僵尸 人造 mov eax 地址 内存 esi 指针


通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址。

1.打开CE工具并附加游戏进程,首先通过遍历的方式找到阳光的动态地址,然后在地址栏上右键选择【找出是什么改写了这个地址】如下所示我们选择【mov eax,[esi+5560]】这条汇编代码。

2.上图可以看到有两条汇编指令,而前面的计数器一直在增加,说明有时钟一直在访问这个地址,我们以第2条汇编指令为例,点击【反汇编当前地址】在XOR指令上按下【F5】下断点,其中【mov eax,[esi+5560]】则表示将当前阳光数量赋值给EAX寄存器,我们可以看到右侧寄存器窗口【eax=32】,其中的32正好就是阳光的十六进制表示形式,注意【mov eax,[esi+5560]】这条指令,观察该指令在注入前与注入后会有什么变化?

3.直接点击【工具列表】-> 【选择自动汇编】 ->【模版】->【代码注入】-> 【确定按钮】,如下图所示:

4.我们需要在【mov eax,[esi+00005560]】这条汇编指令执行之前获取到里面的阳光数据,此时可以在【originalcode】之前写入以下汇编代码,其中【push eax,pop eax】分别是压栈与出栈,因为我们要使用EAX寄存器暂存数据,此时必须要将原始的EAX寄存器里面的内容进行保存,在代码执行完毕以后必须通过POP指令归位,否则会导致程序异常或堆栈失衡,【mov eax,[esi+5560]】则表示将【[esi+5560]】中的数据取出来,此处就是阳光的数量。

5.接着我们需要找一个相对固定的内存地址,并将其填充到【mov [xxxx],eax】方框中,此时我们回到CE中(自动汇编窗口不要关闭),在内存查看器窗口选择【视图】->【内存区域】

我们需要浏览内存区域,找出一个具有读写权限的空地址,并且类型为映像的,这里还需要看后面的模块一定要是植物大战僵尸文件里的模块,此处我找到了一个内存地址 【0B4CF000】,双击即可跳转到相应的位置,这里我们不能选择【02CA9000】这个内存地址,因为这个地址是QQ拼音的模块。

6.通过双击【0B4CF000】地址,即跳转到相应的内存区域,如下在内存查看器中,标红处。

我们直接将【0b4cf000】这个内存地址填入到我们的汇编代码中,此时只要程序获取到阳光,会默认将阳光的数量放入0B4CF000这个内存中进行保存。

完成获取以后,我们直接在CE中添加这个内存地址,并开启自动汇编CT脚本,此时阳光的数量就可以获取到了。

我们再次来到反汇编窗口观察注入后的变化,可以看到CE是直接在【D6679600】处写入了 jmp 指令直接跳转到了我们自己写的代码中去执行了。

跟随【00DF0000】这个地址即可看到如下代码,没错!这些代码正是我们在CT表中分配的,当执行完获取数据以后则会自动跳转到原始地址【0048982B】继续执行原始代码。

总结:上方的的人造指针有一个小问题,那就是我们无法修改阳光的数量,其实这个问题很简单,在开头我们说过该地址有一个时钟一直在给这个地址赋值,而我们在开头查找的是内存访问,如果要修改数据,应该要找内存写入相关的地址。

标签:汇编,僵尸,人造,mov,eax,地址,内存,esi,指针
来源: https://www.cnblogs.com/LyShark/p/15832371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有