十五,调用栈[Call stack]
调用栈窗口(快捷键:Alt+K)根据选定线程的栈,尝试反向跟踪函数调用顺序并将其显示出来,同时包含被调用函数的已知的或隐含的参数。如果调用函数创建了标准的堆栈框架(PUSH EBP; MOV EBP,ESP),则这个任务非常容易完成。现代的优化编译器并不会为栈框架而操心,所以OllyDbg另辟蹊径,采用了一个变通的办法。例如,跟踪代码到下一个返回处,并计算其中全部的入栈、出栈,及 ESP 的修改。如果不成功,则尝试另外一种办法,这个办法风险更大,速度也更慢:移动栈,搜索所有可能的返回地址,并检查这个地址是否被先前的已分析的命令调用。如果还不行,则会采用启发式搜索。栈移动[Stack Walk]可能会非常慢。OllyDbg 仅在调用栈窗口打开时才会使用。
调用栈窗口包含5个栏目:地址[Address]、栈[Stack]、过程[Procedure],调用来自[Called from],框架[Frame]。地址[Adress]栏包含栈地址,栈[Stack]
栏显示了相应的返回地址或参数值。
函数[Procedure](或 函数/参数[Procedure / arguments])显示了被调用函数的地址,在某些情况下,OllyDbg并不能保证该地址是正确的并会添加如下标记之一:
? 找到的入口点不可靠
可能[Maybe] OllyDbg无法找到精确的入口点,报告的地址是用启发式算法猜测的。
包含[Includes] OllyDbg无法找到入口点,仅知道该函数包含显示的地址
通过按例标题栏上的按钮或从菜单中选择“隐藏/显示参数[Hide/Show arguments]”,可以在显示或隐藏函数的参数之间切换。
调用来自[Called from]用于显示调用该函数的命令地址。最后一栏是框架[Frame]这一栏默认是隐藏的,如果框架指针的值(寄存器EBP)已知的话,则该栏用于显示这个值。
当调用函数经过分析[analyzed].后,栈移动会更可靠并且迅速。
|