首页 > 代码库 > 逆向入门之路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 (论装逼准备工作的重要性)