【发布时间】:2010-01-18 20:06:16
【问题描述】:
我一直在调试一些.exe,注意到在我一步步调试之前,在程序的最开始,堆栈中已经加载了一些值?这些是什么?
我正在使用 OllyDbg,这些值的一些“标签”是:
- 返回kernel32.7C8...
- ntdll.7C9...
- SEH 链的末端
- SE 处理程序
谢谢。
【问题讨论】:
标签: windows debugging winapi assembly
我一直在调试一些.exe,注意到在我一步步调试之前,在程序的最开始,堆栈中已经加载了一些值?这些是什么?
我正在使用 OllyDbg,这些值的一些“标签”是:
谢谢。
【问题讨论】:
标签: windows debugging winapi assembly
内核对“系统 DLL”(也称为 ntdll)给予特殊处理。无论如何,这个 DLL 都映射到每个进程中。当系统启动时,内核会在 ntdll 中查找 RtlUserThreadStart 的地址,这将作为新线程的最低级别的用户模式入口点。然后该函数初始化“Win32”子系统。程序主函数的地址存储在可执行文件头中,并被检索和调用。请注意,您可能将 C 运行时代码作为入口点。
如果有 C 或 C++ 运行时,您将获得常用的“CRTStartup”函数,该函数最终会调用main。
【讨论】:
不确定 OllyDebug,但如果您使用 Windows debugging tools(windbg 或 ntsd),您可以使用公共 Microsoft Symbol Server,您应该能够获取整个用户模式堆栈的符号。
SEH 代表Structured Exception Handling,因此在底部有 SEH 链的末端和结构化异常的全局处理程序。我并不完全熟悉它的工作原理,因为(即使我在 MSFT 工作时)我从未使用过结构化异常。然而,如果你仔细想想,这些东西应该在堆栈的末尾是有道理的。
为了获得额外的乐趣,请使用内核调试器(上面链接的包中的 kd),您还可以看到内核模式堆栈。好时光。
【讨论】:
就像其他cmets说的,在调用应用的入口点的时候,已经有很多代码在这个过程中执行了。加载程序已解析导入并执行其他维护任务来设置进程,以便入口点可以运行。
在调用入口点时,堆栈将包含系统库中最终调用入口点的代码的返回地址(这是“返回到..”的东西)。
SEH 处理程序链也在堆栈中初始化。它被设置为结构的链表,如下所示:
_EXCEPTION_REGISTRATION 结构
prev dd ?
handler dd ?
_EXCEPTION_REGISTRATION 结束
这里,prev 是指向前一条记录的指针,handler 是指向异常处理函数的指针。如前所述,堆栈包含形成链表的此类条目,最后一个条目在 prev 指针中具有值 0xFFFFFFFF。那是在入口点之前设置的,它就是你在 OllyDbg 中看到的入口。
【讨论】: