2021-02-07

初步调试

从最简单的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函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值