PE文件输入表获取过程

来源:互联网 发布:程序员学习排名 编辑:程序博客网 时间:2024/05/14 14:36

1.

   首先给出这个PE文件的一些16进制代码


dos头的最后一个变量给出PE头的地址:000000E0,由于import table 的数据目录项相对PE头的偏移为80h,故输入表的数据目录项在文件中的偏移为00000160

查看00000160偏移地址所对应的内容,前四个字节, 0000C7AC为IMAGE_IMPORT_DESCRIPTOR在内存中的RVA,此时,我们需要转换成这个地址对应的文件中的偏移,计算这个,利用RVA-△k就可以算出


C7AC这个RVA在.rdata区段里面,计算.rdata区段的△K= B000-B000=0;所以 刚才的那个需要0000C7AC 地址相对文件的偏移为0000C7AC-0=0000C7AC;定位到文件偏移处


阴影部分是IID的内容,IID的大小为20h,阴影部分存在链各个IID,最后一个为0000000。。。。。说明此PE文件只有一个IID,对应一个dll,现在看IID里面的第四个成员变量


第四个变量的地址为0000CDD8,也是RVA,我们需要转换成对应的文件偏移,0000CDD8同样在.rdata里面,△K为零,所以文件偏移也为0000CDD8

定位到文件偏移为0000CDD8的地方:


查看内容,里面记录的是IMAGE_IMPORT_DESCRIPTOR的第四个成员变量多对应的dll的名字,kernel32.dll,到此,我们已经找到了这个输入的dll。


2.  

  接下来,我们需要做的是获取这个程序所调用dll里面的所有函数,IMAGE_IMPORT_DESCRIPTOR中的第一个参数和最后一个参数,original_first_thunk 和first

_thunk分别指向了INT(输入名称表)IAT(输入地址表),这两个表里面分别记录了指向调用函数名的地址,和此函数在dll中的序号(序号用来快速索引dll中的函数)

给出original_first_thunk 和 first_thunk的值




0000C7D4 和0000B0 是INT 和IAT数组的首地址,下面我们跳到该地址(由于△K=0,故rva=文件偏移)


INT数组




IAT数组


数组里面的值为指向IMAGE_IMPORT_BY_NAME的地址,IMAGE_IMPORT_BY_NAME里面存放的是所调用函数的名字的地址,下来我们选取一个数组里面的

值,跳转到相应的IMAGE_IMPORT_BY_NAME:



可以看到,上面的那个图片中显示了所调用的函数的名字,名字前面的两个字节代表的是函数在dll中的序号,方便以后快速索引到。

3. 需要注意的地方

INT 和IAT数组在一开始的时候,里面存放的地址都是一样的,他们都是指向所调用函数的名字的字符串。而在加载到内存的时候,IAT的值会发生变换,它的值存放的是dll中函数实际被调用的地址,在加载到内存后,就只需要保存IAT就可以了,利用它来调用函数。


原创粉丝点击