我一直在对Windows PE文件进行逆向工程,并且发现这种模式经常使用,这使得遵循API调用变得更加困难。首先,我将转到文件的导入,然后在如图所示的PE文件的.idata部分中找到一个特定的导入,例如WSAStartup:



点击xCtrl-x键以交叉引用此函数被调用时,它仅在IDA识别的位置被“调用”,如下所示:



这里的问题是,上面显示的结构/技术是什么?它直接与我遇到的“典型”设置形成对比,后者只是进入.idata,交叉引用一个函数,并向我展示直接在代码中调用的区域。也没有直接引用这些跳转所驻留的内存地址,例如14658844h。情况下,此实例出现在控制流程图上,并且在红色箭头上方可以看到“孤立的” jmp,这很明显:
就是图2中所示跳转所在的内存地址(函数ptrs)以某种方式在代码中使用一些偏移量间接引用,以帮助掩盖这些API函数的用法。这是编译器功能还是手册?

评论

Igor在Stack Overflow上回答了几乎相同的问题,所以我只能为您指出他的答案,然后让他自己在这里回答! stackoverflow.com/a/22688670

@IanCook很棒,谢谢。您是否有任何技巧或最佳实践来跟踪代码中的这些调用?另外,是否有一个专门的研究领域涵盖此问题?例如,诸如x86汇编文本中的内容还是完全针对编译器的内容?

这是特定于msvc(和vb6?)的。原因是它节省了重定位的次数,因为可以使用相对调用(E8xxxxxxxx)指令来完成对这些api的调用。

#1 楼

这些是由编译器或/和链接器为了定位外部函数引起的间接跳转。

根据函数的定义方式,链接器和编译器都可能最终会发出存根。 ,因此使分析过程中的调用栈变得异常疯狂。