首页 > 代码库 > 逆向入门之路2 Hello World (论装逼准备工作的重要性)
逆向入门之路2 Hello World (论装逼准备工作的重要性)
大部分的编程语言都是从hello world开始,我们的逆向学习也从Hello World开始!
先写一个程序:
#include <windows.h>
int main() {
MessageBoxA(0, "world", "tip", 0);
}
没错,就是这么短小~~~~
编译运行后的结果是这样的:
然后我们删掉源代码,没错,就是删掉源代码~~~
我们要在只有二进制文件的情况下把他改造成一个hello world程序。
打开萌萌的OD,载入程序(这段不懂没关系,反正就没打算让这么早懂~~~)
然后,我们使用F8单步运行,直到弹出消息框。
当执行到这一句的时候,消息框弹出了,然后我们在这一句使用F2下个断点,Ctrl+F2重新运行程序,F9直接运行到断点处,然后F7跟进调用内部:
于是,我们找到消息框弹出的位置了,记录下这个地址01061000,然后我们双击调用MessageBoxA的语句,复制下语句:call dword ptr ds:[0x1062034],存下来。
然后我们找一段程序未用到的内存区域,一般是到程序的末尾处寻找:
我们找到01061BE0这个空闲区域,然后,我们写一些数据:
转到内存窗口:
选定一段区域,按下Ctrl+E编辑:
我们在这里填充"SkyFire Add This MessageBox"
确定。然后我们用相同的方法在下面一块空闲区域填写"Hello World",这时,我们的汇编窗口也会跟着改变:
我们在汇编窗口选择一块空闲区域,这里选择01061C1D:
我们在这里编写我们的汇编代码,我们也要写一个MessageBox,首先将四个参数入栈:
‘
参数从右向左入栈,所以依次进入的是,MB_OK(按钮类型),title(标题),message(消息内容),ParentWnd(父窗口)。
然后调用MessageBoxA,使用前面记录的语句。
我们只是在这里实现了窗口,但是却无法调用,所以我们得回到调用原窗口的地方:010611DA,将此处的语句call 01061000改为call 01061C1D,这样程序就能成功跳转到我们写的函数中,我们对我们的程序改写一下,让他依然能回到正常轨道:
然后我们将程序保存一下:
然后保存文件:
保存为TestHelloWorld2.exe,运行一下试试:
OMGD,装逼失败~~~~
在过程上是没有问题的,猜想应该是这个原因:VS2015在编译时默认开启了DEP(数据执行保护)和ASLR(随机地址加载,导致我们写的地址都无效了,心塞塞……)
关于如何分析开了DEP和ASLR的程序,等学到再说~~~~
逆向入门之路2 Hello World (论装逼准备工作的重要性)