写了上述代码进行观察首先看看最开始的2个函数调用,
接下来是一个内部的函数直接调用和通过函数指针指针调用,
正如 文中所讲函数TestFunctionPointer 的调用不管是直接的,还是通过函数指针间接调用均使用了ILT。
)也就是说,对于import进来的函数直接调用也好,指针形式调用也好都使用访问了.idata节f5地址如何转转中嘚数据,.idata节相当于一个中转保存对应的真实的函数f5地址如何转转。但.idata节本身的位置显然是模块相关的。
不过还存在第3种调用方式GetProcAddress,繼续分析余下的代码
执行到后面,看一下返回值
可见GetProcAddress得到的是函数的真正f5地址如何转转,而函数直接调用或通过指针调用均为.idata节中转嘚
在整个过程中,还发现一些有趣的事情
也就是说,testC模块自身也实现了这些函数虽然内容是一句简单的jmp指令。
我尝试使用一些命令發现谁在使用它们可惜未果。
后来发现这样做法是徒劳的,因为x86指令的复杂性简单的搜索目的f5地址如何转转不能达到我的目的。使鼡IDA观察了一下结果竟然有了新发现,
编译器为这些函数也做了ILT不过即使从IDA中,也看不到这些ILT被使用的痕迹
最后,做个简单的总结
最最后提下x86的指令相当复杂,如果你仔细观察了仩面的汇编代码的话你会发现,同样call指令机器码是多种多样,从ff15, e8, ff55等jmp指令一样,有ff25, e9等等这篇不错的文章,可以帮助理解。