PE结构学习笔记(七)
Chinese:
1、一个区块的数据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。比如输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为它们的属性都是可读不可写的。
2、导入函数就是被程序调用但其执行代码又不在程序中得函数,这些函数的代码位于相关的dll文件中,在调用者程序中只保留相关的函数信息(如函数名、dll文件名等)即可。
3、通过一系列图文解说来简单看看什么是导入表
(1)先写一个简单的程序
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello, I'm Maple~"), TEXT("Hello!"), MB_OKCANCEL | MB_OK); return 0; }
(2)这里使用一个强大的反汇编工具W32Dasm,我们用W32Dasm打开反汇编这个程序:
我们找到比较靠前的IMPORTED FUNCTIONS和IMPORT MODULE,里面记载了该程序调用的动态链接库和导入的函数名。
(3)然后我们右键点击查找,输入MessageBox点击查找,查找到了MessageBox的指令:
(4) 这里先不管指令,我们看到了Call 00401BC0这条指令,这个0x401BC0就是MessageBox去调用的虚拟地址,继续找到0x401BC0这个地址,发现了跳转到了0x00406158这个地址
(5)我们用虚拟地址减去基地址00400000得到RVA为0x6158。我在上篇文章介绍过如何通过RVA查找物理地址,这里用一个PEInfo工具去查找该文件的区块信息。打开PEInfo解析该程序,并看到区块表信息,由RVA得出该地址落在.idata(VOffset为0x6000)区块中。一般输入表的地址都是落在.idata区块中。
(6)由LoarPE可以看到物理地址为0x1A00(ROffset), 用物理地址+RVA-区块的虚拟地址,既是PE文件的地址。0x1A00+0x0158=0x1B58,我们用16进制编辑器打开exe文件找到这个地址
(7) 这里其实就是输入表的地址,但是这里貌似什么都没有,其实这是一个指向函数名的指针,我们记录一下这个虚拟地址0x6330,然后去计算物理地址为0x1A00+0x0330=0x1D30,然后再去16进制编辑器里面找到这个地址
(8) 呵呵 是否看到了我们要寻找的函数名呢?至于细节 请看之后的学习笔记了