免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接: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)