免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:16.x86游戏实战-汇编指令push pop pushad popad
到这就把逆向中常用的汇编指令写完了,接下来写一个c++程序,然后通过OD调试这个C++程序
本次目的是为了后面逆向的时候知道怎么找参数、返回值、栈怎么用栈是怎么回事,下方的例子很重要,也很简单,应该跟着看一遍就能懂,如果不懂看后面的逆向实战,看多了就懂了
c++代码,如下,下图中调用了一个MessageBoxA函数,这是为了定位我们main函数
鼠标放到项目上右击然后选属性然后设置一下优化禁用,上图add函数太简单,编译器的优化会把add函数删除
使用OD附加程序,如果先运行程序不能附加,那就把exe文件拖到OD里通过这样的方式来附加
如下图跳转到MessageBoxA函数中
然后在OD的弹框里点了确定之后,会来到下图位置,下图红框是一个jmp指令,它会调转到MessageBoxA函数里,直接双击下图红框位置就可以跳过去
OD跳转到MessageBoxA函数中之后在下图红框位置打断点
MessageBoxA函数就是弹个框,如下图红框里的东西
如下图打了断点之后点确定
点了确定就会断点住
然后选取消断点,然后单步步过,这里它与上方的地址不一样,是因为程序重启了
然后就能看到add函数了,如下图红框,怎么就确认下图红框是add函数?
双击点call就能跳转到函数位置,如下图可以看到函数的名字,很显然不是add函数,它是一个检查ESP的函数
然后双击到了上图位置,再单机下图红框位置的C就能回去
add函数有两个参数a、b,如下图红框,参数会给push到栈里
执行完push
然后如下图红框,当前断点的下一行是0x141D17,也就是下图红框的位置
在调用add函数进入add函数之前栈的情况
然后按F7,单步步入进add函数中,这里直接按F8,让它jmp(跳转)过去
F8之后来到了add函数中
现在栈的情况
然后如下图,执行了push ebp 和 mov ebp,esp,ebp它的值永远指向栈底(栈里第一个数据),esp永远指向栈顶(栈里最后一个数据),下图的操作是把栈底改了,一个函数一个栈底
然后执行sub esp,0C0 这个栈它的内存地址是从大到小的使用,减就是加,加就是减,它是反着的
现在栈的情况
然后继续往下走,有三个push
然后下图红框的俩函数都是检查用的,编译器给加的,不用管它
然后来到下图红框位置,ebp是栈底,栈底的附近是上一个函数的栈里的数据,也就是main函数里的数据
右击栈选择转到ebp
然后下图红框的代码,ebp+8和ebp+c它们的值,也就是给add函数传入的4和6
然后执行
然后执行add指令
然后add函数就结束了,接下来就是恢复栈的操作
然后add函数的返回值,如下图红框,放在eax寄存器中,一般返回值都会放在eax寄存器中
然后add函数结束返回,看到还有个add esp, 8这样的代码,这是为了给参数平栈,调用add函数是push了两个值,add esp,8就是为了把这两个值从栈里删除
然后执行add esp, 8,这里的删除并不是真的删除,只是修改了栈顶,通过把修改最后一个数据的指向来实现的删除栈里的数据(后面往栈里添加数据直接覆盖),然后这里的add esp,8叫外平栈,还有内平栈,内平栈是在add函数中做从栈里删除参数的操作,后面遇到了会写
c++代码
#include <iostream>
#include "Windows.h"
int add(int a, int b) {
return a + b;
}
int main()
{
MessageBoxA(0,0,0,0);
int a = add(4, 6);
printf("%d", a);
}
文章评论