【问题标题】:What arguments are passed to entry point of a PE (Portable Executable) file?将哪些参数传递到 PE(便携式可执行文件)文件的入口点?
【发布时间】:2015-10-01 20:39:05
【问题描述】:

如果你组装一个 PE(.exe,Win32 的可移植可执行文件)文件,它有一个入口点,你可以调用 _start_main 或任何你喜欢的名称。

问题是 - 这个入口点是用一些参数调用的吗?如果是这样,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?我在哪里可以找到有关这方面的一些文档?

【问题讨论】:

  • FS寄存器的值,某种意义上...
  • 您所询问的技术术语是 Windows 进程的 ABI(应用程序二进制接口)。 ABI 还告诉您在新执行的进程中您对寄存器状态等的期望。 (例如,Unix x86-64 ABI 说它们中的大多数都未初始化。实际上,Linux 会将它们归零,以免泄漏内核数据。)

标签: winapi assembly x86 portable-executable


【解决方案1】:

不,进程在入口点的堆栈上没有任何关于它的参数的信息。您必须调用GetCommandLine 或通过RTL_USER_PROCESS_PARAMETERS 访问PEB 中的信息,但这不是一个稳定的API。

每个语言支持库(如 CRT)也必须这样做。

【讨论】:

  • @user2214913 我认为微软没有在任何地方记录过这些东西。查看代码,您可以安全地从入口点返回。它将返回到 kernel32.dll 中的 BaseThreadInitThunk,然后立即退出进程。
  • @user2214913 我使用了一个调试器“OllyDbg”,它在源代码不可用时运行良好,因为它具有良好的汇编分析。类似软件:x64dbg、IDA。
  • @user2214913:原始入口点签名是DWORD CALLBACK RawEntryPoint(void)。我相信我在 MSDN 中看到了该文件,但再也找不到了。不过,您可以在 WinMain is just the conventional name for the Win32 process entry point 找到可靠的信息。
  • 有趣。它显然与Linux x86-64 ABI 有很多不同,在Linux x86-64 ABI 中,您的命令行参数和环境变量由堆栈上的参数指向_start。有趣的是,即使在 ABI 级别,cmdline args 也是二等公民。您必须要求操作系统将它们提供给您,而不是默认将它们放在那里。同样在 Linux 中,您不能从 _start 返回。 (您使用exit() 系统调用)。动态库 ABI 与内核进程 exec ABI 是分开的,因此没有 kernel32.dll 等价物。
  • @PeterCordes:你错了,你说的几乎都是错的。命令行参数通过PEB 传递给新创建的进程。进程不需要查询操作系统。虽然您可以从本机 Windows 可执行文件的入口点返回,但这并不会终止进程。您还必须在 Windows 上调用 ExitProcesskernel32.dll 不是内核模块。我不知道你想表达什么观点。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2016-07-07
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多