http://bbs.pediy.com/showthread.php?p=1354999
标 题: 【原创】使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 (本文同步更新至我的51blog上,我最初是在那里发布的,由于引用该处的图片,因此带有水印,该贴原始出处如下: 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下: 代码: #include "stdio.h" long add(long a, long b) { long x = a, y = b; return (x + y); } int main(int argc, char* argv[]) { long a = 1, b = 2; printf("%d\n", add(a, b)); return 0; } 使用visual C++ IDE 对该源文件执行编译,汇编,链接一系列的操作后,最终生成的二进制可执行文件(PE格式)名为StackFrame.exe 我们通过上面一系列的IDA PRO截图可以看到,地址 0x00404063处的call指令想要调用EnterCriticalSection函数,后者的地址尝试以call的操作数0x0040A018给出,但是这个地址处的值,即EnterCriticalSection函数的最终地址,需要操作系统加载器加载StackFrame.exe文件时才能确定,因此我们对磁盘上的文件反汇编时,无法确定动态链接库中函数的地址。 我们尝试在原始PE文件中,计算并找出call ds:EnterCriticalSection 指令对应的字节序列,其实这没有想象中困难,而且在这里提出计算方法的原因是,后面会用同样的计算手法来判断Ollydbg中追踪到的EnterCriticalSection函数的实际地址, 首先,回到IDA PRO,打开StackFrame.exe的程序段窗口,如下所示: 前面指出,地址 0x00404063处的call指令想要调用EnterCriticalSection函数,因此计算 404063 - 401000 = 3063 , 3063 + 400 = 3463 接下来,使用Ollydbg打开StackFrame.exe进行动态调试,我们的目标在于定位EnterCriticalSection函数的入口处,并且单步跟进,查看其中的机器码,然后使用PEview工具,以上面的计算方法,验证Ollydbg给出的该函数所属的动态链接库文件信息是否准确,如下截图所示: 上面验证了StackFrame.exe 在运行时调用的共享库函数,与它在磁盘文件上的导入表中描述的行为一致。 最后总结一下: 上面只是抛砖引玉,类似的将IDA PRO,Ollydbg,PEview,甚至WinHex,PEiD等工具结合起来应用,交叉验证的例子不胜枚举,通过熟练使用这些工具,不仅能提高逆向工程的效率与准确度,更重要的是,我们对处理器指令集体系结构,操作系统内存管理,以及动态链接的机制,编译器,链接器的运行原理等等系统底层机理的认识又提升了一个档次。 *转载请注明来自看雪论坛@PEdiy.com |
此帖于 2015-02-12 16:03:59 被 shayi 最后编辑
|
共 8 位会员 感谢 shayi 发表的文章: |
dolphinzhu (2015-03-03), hbcld (2015-02-27), hrpirip (2015-02-26), Lnairan (2015-02-25), springkang[DFCG (2015-03-14), 学gg (2015-02-23), 雪衫 (2015-03-04), 马来 (2015-06-07) |
lihuakx 初级会员 资 料: 注册日期: Feb 2015 帖子: 1 精华: 0 现金: 50 Kx 致谢数: 0 获感谢文章数:0 |
写的很清楚哦。 |
||
[招生]15PB软件安全培训开始接受第009期报名(10.06开课)!
|
shayi 普通会员 资 料: 注册日期: Jul 2012 帖子: 99 精华: 1 现金: 93 Kx 致谢数: 0 获感谢文章数:7 |
补充一下,前面在查看绝大部分使用静态链接的程序中,整个函数的调用拓扑,非常凌乱,我们甚至找不到main函数与最终的DLL函数入口 |
||
此帖于 2015-02-14 00:16:50 被 shayi 最后编辑
|
shayi 普通会员 资 料: 注册日期: Jul 2012 帖子: 99 精华: 1 现金: 93 Kx 致谢数: 0 获感谢文章数:7 |
下面这张图是用于生成上图的函数调用设置: |