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

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


http://www.kler.cn/a/354963.html

相关文章:

  • OpenCV学习——图像融合
  • 【知识】cuda检测GPU是否支持P2P通信及一些注意事项
  • 容器技术所涉及Linux内核关键技术
  • 【蓝桥杯——物联网设计与开发】基础模块8 - RTC
  • LeetCode 343.整数拆分
  • 【QSS样式表 - ⑥】:QPushButton控件样式
  • 【微信小程序_7_WXML 模板语法 - 按钮事件和输入框事件绑定】
  • rk3568 , rk3588 , rknpu2 sdk , rknn-toolkit2, rknn-toolkit2-lite 的了解
  • AI 工具大比拼:ChatGPT 与豆包的魅力与未来展望
  • unity 屏幕波动反馈打击效果(附资源下载)
  • 基于matlab处理语音信号
  • C++新手入门指南:从基础概念到实践之路
  • Kafka之消费者组与消费者
  • YOLOv11改进-模块-引入矩形自校准模块RCM有利于复杂场景(小目标、遮挡等)
  • Python解力扣算法题4(基础)
  • linux中通过一个命令启动任何java的jar包
  • Spring Boot + Vue 前后端分离项目总结:解决 CORS 和 404 问题
  • zipkin启动脚本并指定mysql数据存储
  • 探索桂林:使用SpringBoot构建的旅游平台
  • Leetcode 3320. Count The Number of Winning Sequences
  • 基于SSM+微信小程序的无中介租房系统 (房屋1)
  • 穿越沙漠问题
  • 在线白板:为远程课堂注入活力的协作工具
  • javaweb-xml映射文件编写sql语句
  • 实战RAG第二天——xinference部署大模型,全部代码,保姆级教学
  • 软件测试学习笔记丨Linux三剑客-sed