(三)利用导入表、导出表和重定位表定位导入函数的地址

来源:互联网 发布:qq人肉搜索软件 编辑:程序博客网 时间:2024/06/05 05:19

经过分析清单文件,我们知道 call  指令其实没有引用正确的地址。下面我们来看第3个步骤。

3.可执行文件

    使用 IDA查看生成的可执行文件,定位到 WinMain 入口函数:


查看调用MessageBoxA 处的字节码:


重定位

    调用语句变成了:

    call [00418340]

    由图片中的分析可知 RVA = 0x11402  处的指令需要重定位。减去程序默认加载的基地址0x400000 ,call 指令间接调用的 RVA = 0x18340。也就是说若可执行文件被加载到基地址 0x500000时,调用指令必须修正为:

    call [0x500000 + 0x18340]

PE 文件中,有重定位表记录哪些地址需要被重定位:



导入表

         解决了重定位的问题后,可以来看看 RVA = 0x18340 中到底是什么内容,为什么 call 指令编码中要把这个地址作为内存间接操作数。

我们在导入表中可以看到,RVA = 0x18340(文件偏移0x5D40 )正好是一个所谓的ThunkRVA,这个结构是IMAGE_THUNK_DATA:


解析这个结构,得到一个 RVA =0x183BE ,转换成文件地址(0x5D80),查看:

我们历经千辛万苦,发现是从 RVA = 0x18340 找到了一个编号0x20E 和字符串MessageBoxA.这其实是 IMAGE_IMPORT_BY_NAME 结构。

导出表
    上面找到的这个编号是什么意思,我们使用 depends 工具查看 User32.dll 的导出函数表:



0x20E 是一个函数地址表的索引

 

    但我们不禁要问,即使经过重定位,我们在程序加载到非默认基地址 0x500000 是,可以正确地找到跟 MessageBoxA 紧密相关的 IMAGE_IMPORT_BY_NAME结构,但是函数的真实地址还是无法找到啊?不妨我们直接运行程序,看看能不能成功调用。


0 0
原创粉丝点击