【问题标题】:Windows VC++ 2010 code before my main() function executes我的 main() 函数执行之前的 Windows VC++ 2010 代码
【发布时间】:2010-10-29 12:46:19
【问题描述】:

我一直在使用 C++ 编译器(Win32 是目标)在 Visual Studio 2010 中编译简单的 Hello World 应用程序,以查看使用 Immunity 调试器运行产品时在显微镜下的样子。然而,我注意到有一些代码(实际上是相当多的代码)在我的 main 函数到达之前运行。很多这些东西看起来与安全相关,或者可能让系统准备好管理流程或其他什么,但那里只有一吨。此外,PE 文件头的 EntryPoint 部分似乎指向我的 .text 段的内部,而我的 main() 函数似乎停留在 .text 段的最开头。我的问题是:是否有一些关于这个前奏的好文档被拍到我的代码前面和/或 main() 函数通常由 VC++ 编译器放在 .text 段的开头?感谢您提供的任何见解!

【问题讨论】:

    标签: visual-studio visual-c++ reverse-engineering portable-executable


    【解决方案1】:

    编译器将您的用户代码放在.text 段的开头,因为您希望在此处找到您的代码。所有其他非用户代码都放在最后,这是程序按预期工作所必需的,但您无需担心。编写 C 程序时,您希望某些东西可用,例如本地数组中的命令行参数initializing global variables,确保标准 I/O 可用以及 C 运行时所需的重要其他东西初始化。

    如果您查看例程的源代码,cmets 会解释为什么需要它。

    这些例程做 C 运行时初始化,调用适当的 用户输入功能,并处理终止清理。对于托管 应用程序,然后他们将退出代码返回给调用例程,调用例程 是托管启动代码。对于非托管应用程序,他们调用 exit 和 永远不会回来。

    【讨论】:

    • 谢谢!那肯定把事情弄清楚了。我不清楚我到底在寻找什么,但这很清楚。我打开了一些 vcrt 文件,它们的文档很好……很有意义。再次感谢!
    【解决方案2】:

    不确定 2010 年的情况,但旧的 VC6 曾经附带其 CRT 的源代码,包括包含此初始化代码的文件(称为 crtexe.c)。

    命令行应用程序中的默认入口点称为 mainCRTStartup。

    【讨论】:

    • 对于静态链接的程序,代码在crt0.ccrtexe.c 用于动态链接。
    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2021-03-31
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多