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

news/2024/10/22 6:54:52/

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

本次游戏没法给

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

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

工具下载:

链接: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


http://www.ppmy.cn/news/1541001.html

相关文章

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量: index:含义:它表示 Series 对象的索引,也就是每个数据点对…

百度智能云千帆 ModelBuilder 大模型服务及开发解读

本文整理自百度云智峰会 2024 —— 大模型平台技术实践论坛的同名演讲。 更多大会演讲内容,请访问: https://cloud.baidu.com/summit/AIcloudsummit_2024/index.html 最近大模型产业应用圈子里有一句非常流行的话,叫做度日如年。不是说这件…

08_实现 reactive

目录 编写 reactive 的函数签名处理对象的其他行为拦截 in 操作符拦截 for...in 循环delete 操作符 处理边界新旧值发生变化时才触发依赖的情况处理从原型上继承属性的情况处理一个对象已经是代理对象的情况处理一个原始对象已经被代理过一次之后的情况 浅响应与深响应代理数组…

Java密封类(Sealed Classes)增强详解

Java密封类(Sealed Classes)增强详解 Java 17引入了一个重要的新特性——密封类(Sealed Classes),这一特性旨在增强Java编程语言的能力,提供了一种机制来限制哪些类可以继承一个给定的类或者实现一个给定的…

MacOS安装BurpSuite

文章目录 一、下载地址二、下载注册机三、安装教程四、启动burpsuit五、免责声明 一、下载地址 https://portswigger-cdn.net/burp/releases/download?productpro&version2024.7.1&typeMacOsx二、下载注册机 https://github.com/NepoloHebo/BurpSuite-BurpLoaderKey…

Lua脚本的原子性

Lua脚本之所以被认为是原子性的,主要源于Redis的内部实现机制和Lua脚本的执行方式。以下是对Lua脚本原子性的详细解释: 一、Redis的单线程模型 Redis是一个基于内存、可基于Key-Value等多种数据结构的存储系统,它使用单线程模型来处理客户端的请求。这意味着在任何给定的时…

TypeScript基础(一): 初识TypeScript

TS是什么? TypeScript是微软公司开发的一种基于JavaScript语言的编程语言, 可以看做是JavaScript的超集, 即它继承了后者的全部语法, 所有JavaScript脚本都可以当作TypeScript脚本(但是可能会报错), 此外它增加了一些自己的语法。 TypeScript对JavaScript添加的最…

git禁用 SSL 证书验证

命令 git config --global http.sslVerify false注意:禁用 SSL 证书验证是不安全的,可能会使你的 Git 操作面临中间人攻击的风险。因此,只有在你确信网络环境是安全的,且了解禁用 SSL 验证的后果时,才应该使用这个配置…