2.逆向分析Hello World!程序-上

  1. 先写一个HelloWorld程序(vs2015 / C++)

 

  1. 编译链接生成可执行文件XX.exe,然后用OD[OllyDbg]打开调试:

 

代码窗口:默认用于显示反汇编代码,还用于各种注释、标签,分析代码时显示循环、跳转位置等信息

寄存器窗口:实时显示CPU寄存器的值,可用于修改特定的寄存器

数据窗口:以Hex/ASCII/Unicode值的形式显示进程的内存地址,也可在此修改内存地址

栈窗口:实时显示ESP寄存器指向的进程栈内存,并允许修改

  1. EP(EntryPoint,入口点)

EP是Windows可执行文件(EXE、DLL、SYS等)的代码入口点,是执行应用程序时最先执行的代码的起始位置,它依赖于CPU。用OD调试XX.exe刚开始默认跳转的位置就是EP处。

 

  1. 接下来是尝试找出main()函数中的MessageBox()函数的代码。

先补充几个快捷键:
    Ctrl+F2  重新开始调试(终止正在调试的进城后再次运行)

    F7      单步步入,可以进入到函数里

    F8      单步步过,不进入任何函数,往下走一条指令

    Ctrl+F9  一直执行,知道遇到RETN指令,跳出函数

加载exe到od里,直接来到EP处,然后就是一路F7/F8[这个是刚开始,后期有经验了就不会这么无脑的从头开始找了]call,是函数调用,遇到call想进函数里看看就F7想路过就F8然后是找到这么一个地方(注意你的地址和我的地址可能不同)

 

我的PE文件代码段FOA(400)->RVA(1000)->VA(1341000)这个计算方式以后说。

然后就F7进去看看:

 

红色注释部分就是我们要找的函数。而且在call之前各种把参数push进去,还有就是看到了字符串地址在013420F8处,从栈和内存里也能清楚的看到:


同时现在考虑下,这个调用MessageBox函数的函数不就是main函数吗?执行到这个函数的return处,在F8返回上一层:

 

回来后就准备开始执行add了,那么上面那个call NXYod.00341000就是main函数地址码。这个其实是可以算出来的。还是根据FOA->RVA->VA 最后那个RVA->VA在OD里可以直接Ctrl+G输入RVA他会自动跳转到VA处,比如我的FOA是400,我算出来RVA是1000(我自己写了个计算工具),然后我在OD里直接Ctrl+G

 

OK之后直接跳转到:

 

这直接就是main函数了。

 

 

原文地址:https://www.cnblogs.com/csnd/p/12061889.html