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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VmWare下的linux虚拟机磁盘空间扩展

我用vmware开启了一个虚拟机,虚拟机操作系统是centos7。今天发现磁盘空间不够了,导数据到里面的mysql,提示没有空间,之后mysql也连不上了。这个mysql部署在docker里,结果停止都停止不了,强制停止也不行。无…

10-Python基础编程之函数

Python基础编程之函数 概念基本使用参数单个参数多个参数不定长参数缺省参数注意事项 返回值使用描述偏函数高阶函数返回函数匿名函数闭包装饰器生成器递归函数函数的作用域 概念 写了一段代码实现了某个小功能:然后把这些代码集中到一块,起一个名字&am…

五、Spring Boot集成Spring Security之认证流程2

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口,并允许用户使用鼠标来选择多个 ROI。控制方式:使用空格键或…

如何用示波器检测次级点火系统(一)

写在最前面: 单看标题可能会让你觉得这篇文章的主题是关于检测线圈,火花塞和火花塞插头电线。但我们指的是分析燃烧室内电子的行为。目标是看燃料混合物,阀座,压缩,积碳和其它影响这种特性的症状。最终目的是要学会分…

基于springboot vue的音乐播放系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本

🔥🎉 全新RiPro9.0开源版发布 —— 探索无限可能🚀🌐 今天,我很高兴能与大家分享一个重磅资源——RiPro9.0开源版!这不是一个普通的版本,而是一个经过精心打磨、全面解密的力作。🔍…

【顺序表的模拟实现Java】

【顺序表的模拟实现Java】 顺序表的介绍Java代码实现检验代码功能 顺序表的介绍 由于之前在c语言板块写过详细的顺序表介绍,所以这一篇文章主要为Java代码的实现 下面为顺序表介绍的链接,如有需要点击下方链接跳转 c语言顺序表讲解 Java代码实现 pub…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP

有nas的相信对公网都不模式,在现在基础上传带宽能有100兆的时代,有公网代表着家里有一个小服务器,像百度网盘,优酷这种在线服务都能部署为私有化服务。但现在运营商几乎不可能提供公网ip,要么自己买个云服务器做内网穿…

可编辑73页PPT | 企业智慧能源管控平台建设方案

荐言分享:随着全球能源形势的日益紧张和智能化技术的快速发展,企业对于能源的高效利用和精细化管理需求愈发迫切。智慧能源管控平台作为一种集成了物联网、大数据、云计算、人工智能等先进技术的综合管理系统,旨在帮助企业实现能源数据的实时…

Qt学习(一)——win10系统下Qt安装(Qt5.15.2+QtCreator5.0.3+MSVC2019)

win10平台下,Qt Creator 5.0.3 软件About Qt Creator界面如下: 其基于Qt 5.15.2 MSVC2019,64bit,故在用Qt4 设计师自定义控件所设计的控件能够被Qt Creator加载到,就要安装相应版本的Qt和MSVC。此安装便可支持win10系统下的自定义…

数据结构(8.2_1)——插入排序

插入排序 算法思想&#xff1a;每次将一个待排序的记录按其关键字大小插入到前面已排序好的子序列中&#xff0c;直到全部记录插入完成。 代码实现 #include <stdio.h>void InsertSort(int A[], int n) {int i, j.temp;for (i 1; i < n; i) {//将各元素插入已排好…

集成电路公司进销存系统生成合同——未来之窗行业应用跨平台架构

一、进销存生成合同优势 1. 提高效率&#xff1a;节省了手动起草和编辑合同的时间&#xff0c;能够快速生成合同&#xff0c;加快业务流程。 2. 减少错误&#xff1a;避免了人工输入可能导致的拼写、数据错误等&#xff0c;提高合同的准确性和规范性。 3. 数据一致性&#xff…

【从零开始的LeetCode-算法】504. 七进制数

给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; -107 < num < 107 我的解答 class Solution {public String convertT…

排序---java---黑马

排序算法 名称平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) N N …

【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。 你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3&#xff0c;并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] a[1] * b[i1] a[2] * b[i2] a[3] * b[i3] 的值。 返回你能够获得的 最大…

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…

如何使用FastAPI开发Serverless应用?

使用FastAPI开发Serverless应用是一种现代且高效的方法&#xff0c;它结合了FastAPI的高性能和Serverless架构的灵活性、可扩展性以及低成本。下面是一个基本指南&#xff0c;帮助你从零开始创建并部署一个FastAPI应用到Serverless环境。 1. 安装FastAPI和Uvicorn 首首先&…