10.第二阶段x86游戏实战2-反编译自己的程序加深堆栈的理解

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

本次游戏没法给

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

工具下载:

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

提取码:6tw3

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

上一个内容:9.第二阶段x86游戏实战2-初识易语言

上一个内容里使用易语言写了一个Windows窗口程序,本次就来逆向这个程序,看看它的反汇编代码和栈是怎么一个情况。

开始之前要回顾一个东西,在 6.第二阶段x86游戏实战2-理解程序流程 里写过一个流程 寻路到有怪物的位置-》选择怪物-》打怪物-》捡怪物的掉落物 这个流程,还把 寻路到有怪物的位置 拆分成了 上坐骑 -》打开地图 -》寻路 -》确认到达 -》下坐骑 这样的一个流程,然后现在再给寻路拆分一下,寻路可以拆分成 获取鼠标单击的坐标-》检测当前位置,然后OD里的CTRL+F9快捷键可以返回到当前函数的上一层(调用当前函数的位置),然后如果在获取鼠标单击的坐标这里打断点,然后按CTRL + F9,它会返回到 寻路 里,然后在寻路里按CTRL+F9它会回到 寻路到有怪物的位置 里,这句话要记住(记不住起码要有印象,知道有这么个事),逆向的过程就是围绕着这句话进行的。

然后开始

首先打开之前用易语言写的窗口程序

然后使用OD附加,如下图箭头,鼠标左键在拖拽上按住,然后拖到易语言写的窗口里就可以附加了

然后CTRL+G,然后输入MessageBoxA,然后点OK,第一个打开OD需要重复操作多次(直到没反应了为止)

然后点了OK之后就会来到下图红框位置,这里的内存地址是0x7629B160,这个内存地址是会变的,跟下图不一样是正常的

然后这里需要说明一下 MessageBoxA 是Windows系统的函数所以可以使用CTRL+G输入MessageBoxA的方式跳转,正常CTRL+G是通过内存地址跳转的。

然后鼠标左键双击下图红框位置

双玩之后的效果,内存地址会变成红色背景,这说明在这个位置打断点了,当程序运行到这时就会卡主

然后来到易语言写的程序里,点击下图红框里的按钮

下图红框是效果,执行了下图蓝框的代码就会弹出红框里的弹框

然后点击弹框里的确定

然后来到OD,会发现触发断点了,程序写卡主了

然后双击下图红框位置

双击完取消断点

然后就开始围绕刚开始写的那句话了,为了避免晕这里详细说明,下图是易语言写的代码,然后下图红框里的代码执行完是一个弹框,它实际就是调用的MessageBoxA函数,然后上方在MessageBoxA函数里打了断点,然后在MessageBoxA函数里按CTRL+F9就会来到 信息框 (“信息框”, 0, , ) 这个函数里面,注意按了CTRL + F9之后是在 信息框 (“信息框”, 0, , ) 里面不是下图红框位置

然后按CTRL+F9,来到 信息框 (“信息框”, 0, , ) 里面

然后在按CTRL+F9

上图的代码,是下图红框里面的内容,下图红框是一个子程序(函数)名字叫dddd,也就是说上图的代码是dddd函数的汇编代码

然后dddd函数实在下图红框位置调用的

然后下图的代码是 我可是按钮 点击之后执行的代码

然后再按CTRL+F9

上图红框里的代码,是下图红框代码的反汇编代码

这里我为什么会知道?如下图红框 64是一个十六进制数,这里不能读六十四,要读六四,然后14也是一个十六进制数,OD显示的数字一般都是十六进制数,然后64的十进制是100,它对应下图蓝框里的100,14的十进制数是20它对应下图蓝框里的20,通过这样的特征来确认的,后面看多了也就能掌握了

然后开始正文,堆栈

然后先按一下F9让程序运行起来,然后在下图红框位置打断点

然后来到易语言的窗口点击 我可是按钮,然后断点住

然后看下图红框,esp是栈顶(栈里的第一个数据)ebp是栈底(当前栈里最后一个数据)

然后双击下图红框位置

双击完它会出现一个偏移方便观察

然后取消断点,按F7执行call 0x401040,也就是执行dddd函数,如下图按了F7之后进入dddd函数,然后下图红框位置可以看到栈里有添加了一个数据

call这个汇编代码会跳转到指定位置并且把下一行代码的地址放到栈里,如下图红框

然后开始观察栈

然后按F8,它执行了push ebp,这意思是把原本的栈底保存起来

然后再按F8,执行了mov ebp, esp,这意思是切换到新的栈(栈物理上是一大块内存地址,在使用上是一块一块的用,通过下图的代码可以很明显看出来)里

然后再按F8,执行sub esp,0C,这意思是开辟局部变量的内存,注意现在栈里-14、-10、-C位置的数据是乱的

sub esp,0C的目的就是为了,下图红框里的三个变量

然后回到OD继续按F8,如下图红框它给局部变量进行了初始化为0,也就是说易语言中的局部变量如果不赋值它默认是0

然后继续按F8

上图里它执行了mov dword ptr [ebp-4], 3E8,也就是下图红框的代码,3E8的十进制是1000

然后继续按F8

上图里它执行了 mov eax, dword ptr [ebp+C],ebp+c是参数,也就是下图红框的代码

它是在下图红框位置call 00401040函数(dddd函数)之前进入栈里的

然后继续按F8

上图里执行了 mov dword ptr [ebp-8], eax这个代码,也就是下图红框里的代码

然后下图红框的两行代码

是下图红框里的代码,与 _接收攻击 = 攻击 一样这里执行F8跳过了

然后下图红框的代码是易语言生成的代码不是我们写的,直接F8跳过就行了

call 00401038最终会通过下图红框位置跳转到下图蓝框位置

然后下图红框位置的代码是 准备执行 信息框 (“信息框”, 0, , ) 这个代码

执行在下图红框位置打断点,按F9然后点击弹框的 确定 按钮跳过就行了

然后点击完确定来到下图红框位置

然后按F8,执行 add esp, 34 意思是函数运行过程中会出现很多局部变量 add esp, 34 就是为了清理局部变量的,也就是还原栈

然后再按F8,执行 mov esp, ebp意思是还原成调用dddd函数之前栈的栈顶(第一个数据位置)

然后再按F8,执行 pop ebp意思是还原调用dddd函数时的栈底

然后在按F8,执行retn 8,retn是把栈里第一个数据当成代码的内存地址并且跳转到这个地址上,并且esp+8,8的意思是当前函数(dddd函数)有两个参数(一个参数是4字节两个是8字节,这里的8就是8字节的意思),就是一个平栈(还原成进入dddd函数之前的栈),如下图

上图可以看出执行了retn 8,下图可以看出retn 8把下图红框位置两次push到栈里的数据给清理了(esp+8)


img


http://www.niftyadmin.cn/n/5664507.html

相关文章

Vue学习记录之一(介绍及脚手架的使用)

一、背景知识介绍 1、构建工具介绍 Vite, Webpack,Rollup, Parce 构建工具优点缺点Vite- 快速启动,秒级热更新,更快的构建速度,更好的开发体验;- 支持 Vue3 和 ES modules 的原生特性,轻松实现按需加载。- 对于单页…

领导友好型数据展示:Java后端到可视化实战汇报

舒一笑的网站:www.shuyixiao.cloud 里面:面试八股文、BAT面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎收藏和转发。 优化数据呈现:打造领导友好的数据库汇报方案 在本次分享中,我将探讨一个完整的数据处理与可视化流程,旨在将复杂的系统日志信息转化为…

如何使用 LangChain 的内置工具和工具包:深入探讨与实践指南

如何使用 LangChain 的内置工具和工具包:深入探讨与实践指南 引言 在人工智能和自然语言处理领域,LangChain 已经成为一个强大而灵活的框架。它提供了丰富的工具和工具包,使开发者能够轻松构建复杂的 AI 应用。本文将深入探讨如何有效地使用…

一文搞懂 Flink JobGraph 的创建过程源码

Flink JobGraph 的创建过程 1 JobGraph创建的起点2 为StreamNode设置Hash值3 Hash值的应用4 设置StreamNode chain5 创建顶点6 创建边和中间结果集 在StreamGraph构建完毕之后会开始构建JobGraph,然后再提交JobGraph。 public JobExecutionResult execute(String jo…

vulnhub靶机:Fristileaks 详细过程

下载 下载地址:https://www.vulnhub.com/entry/fristileaks-13,133/ 修改网卡 网卡设置为nat模式,并修改mac地址为 08:00:27:A5:A6:76 信息收集 主机发现 arp-scan -l 发现靶机 IP 是 192.168.109.178 端口扫描 nmap -p- -A 192.168.109.178 目录…

传输层协议——udp/tcp

目录 再谈端口号 udp 协议 理解报头 udp特点 缓冲区 udp使用的注意事项 tcp协议 TCP的可靠性与提高效率的策略 序号/确认序号 窗口大小 ACK: PSH URG RST 保活机制 重传 三次握手(SYN) 四次挥手(FIN) 流量控制 滑动窗口 拥塞控制 延迟应答 捎带应答 面…

【java】scala ExecutorService停止线程池的简单案例

上代码: import org.scalatest.funsuite.AnyFunSuite import java.util.concurrent.{ExecutorService, Executors, TimeUnit}class ExecutorPoolTest extends AnyFunSuite {val threadPool: ExecutorService Executors.newFixedThreadPool(1)val job: Runnable n…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation)论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比,MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…