初步调试
从最简单的helloworld开始学习逆向分析,首先用vs c++生成win32位的程序。
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR* argv[])
{
MessageBox(
NULL,
L"Hello World!",
L"www.reversecore.com",
MB_OK);
return 0;
}
选择release模式生成可执行文件。helloworld.cpp源码文件是由c语言编写的,而helloworld。exe可执行文件是二进制文件,分析二进制文件通常使用调试器实用工具。通过其将二进制代码转换为汇编代码。
调试器停止的地点为helloworld的起始地址,是一段EP代码。EP代码是windows可执行文件的代码入口点。我们的目标是再mian函数中找到MessageBox()函数的代码。图中最右侧区域中是od的注释,其中红字的部分是代码中调用的API函数名称,注释部分只需要看调用的API函数名称,API函数并不是在源代码中调用的函数。这些函数是vs为了保证系统正常运行而自动添加的启动函数。根据不同的编译器类型与版本,启动函数也会有所不同。
1.先通过call指令,F7进入A91638函数。
可以看到在A91682处有RETN指令,它用于返回到函数调用者的下一条指令,一般是被调用函数的最后一句。即返回A91274。
2.执行A91682处RETN指令后,返回A91274。执行jmp指令
代码看上去比较复杂,这就是vs++的启动函数。初次调试不太能区分用户函数以及启动函数的区别。但在反复调试是过程中会发现由vs编写的执行文件大多与上述形式相同。
3.查找main函数
从A910ED地址开始逐步执行F7指令(F8不会进入call函数指向的地址)
移动到A910F4地址处的call 00A91930函数的调用指令,执行F7,进入A91930函数
因为没有在代码中发现MessageBox()API的代码所以应该不是。执行ctrl+F9跳转至A91973的RETN,跳出函数。继续调试,遇到函数就进入函数查看代码,确认是否为main函数,若不是则跳出,以相同方式继续调试。
若调试正常,则会发现
出现调用MessageBox()API的代码,该函数的参数为"Hello World!“和"www.reversecore.com”,与helloworld的cpp源码相同,由此确定这是main函数。