欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

2024/10/23 2:26:03 来源:https://blog.csdn.net/qq_36301061/article/details/142965334  浏览:    关键词:29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

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

本次游戏没法给

内容参考于:微尘网络安全

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:28.第二阶段x86游戏实战2-遍历周围-通过附近NPC怪物血量的方式(初识vm代码)

上一个内容里写了通过打附近怪物找基址,最终到了一个看着像乱码的地方,代码被进行了vm(现在理解为代码混淆,用来让逆向人员无法正常分析),本次就开始写如何看这种被混淆的代码

首先来到下图位置,也就是上一个内容中通过打附近怪物追来的地方

然后给上图红框位置打断点,然后取消断点按CTRL+F9来到下图位置,也就是被混淆代码的位置,这种代码被称为花指令

然后可以看到下图红框,它们的内容是三个问号,这里可以把问号当成开始混淆代码的标记

然后关键点来了,混淆代码只是静态看着混淆,通过断点是可以看到正常的代码的,在下图红框位置打断点,也就是问号的前一行

断点住之后取消断点,然后按F8

通过F8执行了问号之后,会发现代码正常了,如下图红框,正常了之后不能使用鼠标滚轮上下翻不然还会乱,正常了就可以分析代码了

现在回顾一下上一个内容里得到的公式,[ecx+0x10]+0x8 是血量,然后现在找ecx的值,通过恢复的混淆代码可以看出ecx的值来自于esi,所以接下来再找esi

往上翻了很久发现了esi,如下图通过断点确定了它会执行,现在的公式[[ebx+0x148]+0x10]+0x8,然后再找ebx的值哪来的

如下图ebx的值来自于eax,如下图红框,给ebx赋值之前有一个call,所以eax的值来自于这个call的返回值,所以接下来需要进入call dword ptr[eax+0x48]里面

在下图红框位置打断点

它的参数好像是一个序号,然后取消断点按F7进入函数

然后会来到下图位置,通过下图红框可以得出这里是个循环,因为它把代码往上进行了跳转执行,这里应该就是遍历附近怪物的算法了,接下来开始更细致的分析

分析的代码

通过分析代码发现这里是二叉树的数据结构,所以接下来要介绍一下二叉树数据结构,首先现在有如下图1-30个数据,这30个数据(注意是30个数据不是30个数字,数据可以是内存地址、数字、文字等)使用二叉树常用存放法

如下图30个数据使用二叉树数据结构时存放的样子,数字的顺序放在什么位置是基于实现的算法来的,所以有些顺序会跟下图不一样,它也可能是无序的,一般高性能二叉树都会从小到大的顺序来存放数据(这里的高性能是指查询快插入慢)

现在假设要找第30个数据使用常规数据,也就是下图样子的方式来存放数据,那就会从1到30挨个对比要找30次才能找到第30个数据(别说从后往前找)

如果使用二叉树来找第30个数据,如下图只需要查询7次就可以找到第30个数据,如果要是上千上万的数据二叉树查询快的特性就会体现的很明显,下方的排序方式还只是一个简单是用脑子算出来的,如果真正要用的二叉树排序会比下图中的更合理,可能会达到三四次就能找到,然后现在带入代码

带入代码,如下图,这个函数有一个入参(或者说二叉树的序号),这个算法就是根据入参去二叉树里找一个数据,它用来确定找没找的条件是判断eax+0xD位置是不是非0,不是通过入参判断,下图里第一个数据标的有问题,第一个数据应该是下方的mov eax,dword ptr[esi+0x4]这一行才对

然后看它的返回值,如下图它有两个retn,所以现在的公式 [[[eax+0x14]+0x148]+0x10]+0x8

然后eax的值最终来自于esi+0x4,现在的公式[[[[esi+0x4]+0x14]+0x148]+0x10]+0x8,然后再找esi的值

esi的值来自于ecx+0x54,现在的公式[[[[[ecx+0x54]+0x4]+0x14]+0x148]+0x10]+0x8,然后接下来返回到上一层继续找ecx的值来源

然后ecx来自于0xCEEFA4,现在的公式[[[[[[0xCEEFA4]+0x54]+0x4]+0x14]+0x148]+0x10]+0x8

通过公式测试,3F800000就是1.0

使用浮点数的方式显示内存

1.000000这意思是附近某npc是满血的

然后现在找一下基址,现在模块基址是0x750000

代码的位置0x9E0A12,0x9E0A12-0x750000

0x290A12

然后是附近npc列表的偏移,0x59EFA4


img

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com