图中的 x86 技术/区域称为什么?

逆向工程 艾达 部件 x86
2021-06-30 05:30:02

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

数据部分

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

跳转到函数

这里的问题是,上图的结构/技术是什么?它直接对比了我遇到的“典型”设置,它只是转到 .idata,交叉引用一个函数,并让它显示在代码中直接调用的区域也没有直接引用每个跳转所在的内存地址,例如 14658844h。

我将在此处再添加一个不同文件但类似目击的图,在这种情况下,此实例出现在控制流图上,并且通过您可以在红色箭头正上方看到的“孤立”jmp 非常明显:

在此处输入图片说明

我的假设是,图 2 中显示的这些内存地址(函数 ptrs)以某种方式在代码中间接引用,使用一些偏移量来帮助掩盖这些 API 函数的使用。这是编译器功能还是手动操作?

1个回答

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

根据函数的定义方式,链接器和编译器都可能最终发出一个存根,从而在分析过程中使调用堆栈变得非常深。

正如评论中所述,这个 SO 答案Indirect jumps for DLL function calls 准确地解释了幕后发生的事情。