嗨玩手游网

游戏外挂之利用CE和OD查找被选中怪物和怪物列表

这一节我们利用CE和OD去找到被选中的怪物对象,和怪物列表。从而为后面自动遍历怪物实现自动打怪的外挂做铺垫。当然在这之前我们得了解汇编中数组和列表是怎么定位的。一般是[eax*4+0x0063fedd],这样通过自增通用寄存器eax去实现数组下标。0x0063fedd在这里就是一个基址。因为32位系统的地址是4字节我想这个大家都非常清楚,所以乘以4.废话不多说了,现在开始打开游戏盒CE。并且将游戏进程附加到CE中去。

选中两者之间的值。输入值1和值0xFFFFFFFF。这是为了过滤掉0值。否则多查询出很多值。同时为了更快速的查询,我将内存扫描选项设置成00010000和7FFEFFFF之间的内存中进程查找。那么大家肯定会问,那如下的内存呢?如果我们要找的值在余下的内存中怎么办??这个绝不用当心,如果对windows操作系统内存比较了解很容易知道,我设置的这个区间真好是windows的用户模式区间。我们的程序都是在这个区间中的。0x00000000至0x0000FFFF是空指针赋值区。主要是用来辅助程序员捕捉空指针赋值。0x80000000至0xFFFFFFFF是内核模式分区,这个空间是2G。在内核模式分区和用户模式分区之间的是64k禁入分区。所以大家毫无当心的在这个内存区间中去查找,肯定能查到我们想要的值。

第一次查询出的是一个庞大的数字。然后我们将扫描类型改成“未改变的”,然后查询,这样重复几次。然后我们在游戏中去选中一个怪。

然后将将扫描类型改成“改变的”,在次查询。再选中其它的怪去查询改变的值,这样不停的改变选中的怪去查询,直到查询出几个值,我这里查询出一个值。

可以看出它的值是65535。当时我没选中任何怪,说明未选中怪的时候这个内存中的值是0000FFFFh(16进制)

我们已经找出这个被选中怪id存放的地址。

然后将这个值选中到被选取,右击被选取数据\"找出什么访问了这个地址\"。弹出一个对话框,可以看到这样一行汇编指令:“004adb43 mov eax,[edi+00001478]”

我们将这行代码记录下来。这个时候关闭CE,我们需要打开另一个外挂人员和破解人员必备动态调试工具OD。首先来了解下OD工作区:

1区反汇编代码区,这个区是程序被反汇编器放汇编出的汇编指令。

2区是寄存器区。这里显示了CPU中的寄存器,我们可以在动态调试的时候查看下寄存器的变化。

3区是内存注释区

4区是内存区,这里显示了内存状态。

5区是栈区,这里会显示程序在调用过程中堆栈的变化。

打开OD并且附加游戏进程。

然后

右击转的表达式,然后输入我们记录的那个地址004adb43。跳到访问被选中怪物id存放的地址的汇编指令那个地方。MOV EAX,DWORD PTR DS:[EDI+1478]这样一行代码。就是将被选中怪物的ID放到EAX寄存器。CMP EAX,0FFFF紧接着这行代码。0000FFFF是没有怪物被选中时DS:[EDI+1478]中的值。

MOV ECX,DWORD PTR DS:[EAX*4+312DF20] 后面的DS:[EAX*4+312DF20]就是汇编中集合的访问方式。312DF20是基址,那么312DF20+0就是这个数组的第一个元素。我们猜测这个数组存放的就是怪物数组。

我们在OD的命令行中输入dd 0312DF20以堆栈形式转储。我们可以看到一个一个对象地址在这个数组中,这个就是怪物包括玩家的数组。当然有一个熟悉区别它是怪物还是其它对象。

我们进入这个数组中的第二个对象。右击第二个数组-》数据窗口跟随进入的第二个对象,可以看到+c这个位置就是对象数组下标是1.恭喜我们已经找到对象数组了。同时我们知道只要是放入[eax+00001478]中的id就是被选中怪物。这个就到这里,下一节分析对象属性。

作者:egojit

原文:https://wwwblogs/egojit/p/3150097.html

ce轻松使用入门

精确数值的搜索

按照确定的数字搜索内存值的地址。

模糊搜索

根据指定条件,例如减少了,增加了搜索内存单元的地址。

不同数据类型的搜索

根据内存单元值的数据类型配合精确或模糊搜索内存单元的值。

基址和偏移指针

基址:不变的基础段地址。

偏移:此内存单元距离基址的距离。

指针:基址+[偏移量1+[偏移量2]]。

指针扫描

指针扫描的目的是找到内存单元的地址,用于下次启动应用是,本次修改仍然有效。这个地址不是具体的地址,而是指针(基内存地址+偏移量1[+偏移量N])。

操作步骤

通过精确、模糊或数据类型等条件找出目标内存单元地址。右键点击内存单元地址,点击“对这个地址进行指针扫描”,打开指针扫描页面。

修改最大偏移量或最大级别,设置保存的文件,进行扫描。

重启角色或游戏,在扫描结果中再次扫描目标内存值,过滤掉不需要的指针记录,剩下的就是找到的到这个内存单元的指针(应用基址+偏移量)。用新的游戏进程,在老的找到的内存单元中进行多次匹配,会自动去掉匹配不成功的,剩余的就是指向目标内存地址的指针。

简单的代码修改

步骤

找到目标内存地址右键 > 是什么修改了此地址

应用中操作修改。在上面修改了此地址页面会显示修改的汇编代码。

点击代码,点击显示反汇编代码。

双击修改代码保存。

代码注入

步骤

1、找到目标内存地址

2、右键 > 是什么修改了此地址

3、应用中操作修改。在上面修改了此地址页面会显示修改的汇编代码。

4、点击代码,点击显示反汇编代码。以上4步同上。

5、在汇编代码中,点击菜单栏的工具,自动汇编,进入自动汇编代码编辑窗口。

在自动汇编窗口中,点击菜单下的模板,下的代码注入,写入基础代码。

改写里面的代码,然后点击菜单 > 分配到CT表,加入到ce下面的窗格中,勾选使之生效。

AOB脚本

同上代码注入,不同点是注入方式模板代码选择AOB,意思是通过内存指令特征码实现改写。

更多攻略
游戏推荐
更多+