【问题标题】:What are the values in intel x86 CPU stack before running (on Windows)?运行之前(在 Windows 上)英特尔 x86 CPU 堆栈中的值是多少?
【发布时间】:2010-01-18 20:06:16
【问题描述】:

我一直在调试一些.exe,注意到在我一步步调试之前,在程序的最开始,堆栈中已经加载了一些值?这些是什么?

我正在使用 OllyDbg,这些值的一些“标签”是:

  • 返回kernel32.7C8...
  • ntdll.7C9...
  • SEH 链的末端
  • SE 处理程序

谢谢。

【问题讨论】:

    标签: windows debugging winapi assembly


    【解决方案1】:

    内核对“系统 DLL”(也称为 ntdll)给予特殊处理。无论如何,这个 DLL 都映射到每个进程中。当系统启动时,内核会在 ntdll 中查找 RtlUserThreadStart 的地址,这将作为新线程的最低级别的用户模式入口点。然后该函数初始化“Win32”子系统。程序主函数的地址存储在可执行文件头中,并被检索和调用。请注意,您可能将 C 运行时代码作为入口点。

    如果有 C 或 C++ 运行时,您将获得常用的“CRTStartup”函数,该函数最终会调用main

    【讨论】:

    • 我比我更喜欢你的回答。
    【解决方案2】:

    不确定 OllyDebug,但如果您使用 Windows debugging tools(windbg 或 ntsd),您可以使用公共 Microsoft Symbol Server,您应该能够获取整个用户模式堆栈的符号。

    SEH 代表Structured Exception Handling,因此在底部有 SEH 链的末端和结构化异常的全局处理程序。我并不完全熟悉它的工作原理,因为(即使我在 MSFT 工作时)我从未使用过结构化异常。然而,如果你仔细想想,这些东西应该在堆栈的末尾是有道理的。

    为了获得额外的乐趣,请使用内核调试器(上面链接的包中的 kd),您还可以看到内核模式堆栈。好时光。

    【讨论】:

      【解决方案3】:

      就像其他cmets说的,在调用应用的入口点的时候,已经有很多代码在这个过程中执行了。加载程序已解析导入并执行其他维护任务来设置进程,以便入口点可以运行。

      在调用入口点时,堆栈将包含系统库中最终调用入口点的代码的返回地址(这是“返回到..”的东西)。

      SEH 处理程序链也在堆栈中初始化。它被设置为结构的链表,如下所示:

      _EXCEPTION_REGISTRATION 结构

       prev    dd      ?
       handler dd      ?
      

      _EXCEPTION_REGISTRATION 结束

      这里,prev 是指向前一条记录的指针,handler 是指向异常处理函数的指针。如前所述,堆栈包含形成链表的此类条目,最后一个条目在 prev 指针中具有值 0xFFFFFFFF。那是在入口点之前设置的,它就是你在 OllyDbg 中看到的入口。

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 2022-01-27
        • 2018-10-15
        • 2013-01-30
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        • 2012-02-25
        • 2014-04-02
        相关资源
        最近更新 更多