题目:
- 编写一个采用MessageBox函数显示本组基本信息的程序Hello.exe
- 用IDA Pro分析程序, 从其汇编代码中查看其对数据指针和函数指针的引用方式,以及其IAT的结构及其数据。给出指针引用和IAT的截图。
- 用OD动态查看自己编写的Hello.exe,查看其IAT和EAT的关系,即如何把EAT的函数地址与IAT的函数地址关联,给出截图。同时,确定Hello.exe的哪些位置调用IAT中的函数.
- 结合peview和Winhex(或 Ultraedit),修改Hello.exe的imagebase,看程序是否可以运行?如果不能,如何通过增加重定位节或者其他方式修正该可执行代码,使得该代码可以继续运行。
1. hello程序
#include<windows.h>
char message[50] = "信安4班,组员";
int main(){
MessageBox(NULL, TEXT(message), TEXT("hello"), NULL);
return 0;
}
2. IDA Pro分析程序
- 找到
.text
节。用IDA以PE executable方式打开exe文件,在选项栏选择jump->jump to segment
,可以看到PE文件的各个节的基本信息。.text
节保存的是可执行的机器码;.idata
节保存的是程序引用的dll
函数表,即IAT
表。双击打开.text
节。 - 如何找到main函数入口地址?因为main函数中调用了Messagebox函数,因此在
import
窗口找到Message box。双击跳转到.idata
段。
`.idata`段CODE XREF
后的地址,跳转到main函数处。 - 查看对数据指针的引用方式。由
MessageBox(NULL, TEXT(message), TEXT("hello"), NULL);
知:- 首先压入
hello
双击`offset aHello`,跳转到idata节
在`idata`节中说明是资源文件00404000
,而`.text`中调用地址00404000
,再一次确认。 - 再压入全局变量
message
。双击offset跳转到.data
节,说明这是一个初始化的全局变量。确认步骤同上。
- 首先压入
- 查看对函数指针的引用
双击黄色部分
Messagebox函数.idata
段
同样是资源文件,存的是函数真正的跳转地址,要到程序运行时才能得出,所以是`??`
3.OD动态查看
ctrl+G
,输入要跟进的地址,即是刚才看到在idata
中存Messagebox的地址0x4061d8
。
已经被填上函数真正的地址
call messagebox
处F2键设置断点,在调试选项中选择跳转到用户代码,然后F7单步步入,可看到程序跳转到77D507EA处