Winapi 什么参数被传递到PE(可移植可执行文件)文件的入口点?
如果您组装一个PE(.exe,用于Win32的可移植可执行文件),它有一个入口点,您可以调用Winapi 什么参数被传递到PE(可移植可执行文件)文件的入口点?,winapi,assembly,x86,portable-executable,Winapi,Assembly,X86,Portable Executable,如果您组装一个PE(.exe,用于Win32的可移植可执行文件),它有一个入口点,您可以调用\u start,\u main或任何您喜欢的东西 问题是-是否使用一些参数调用此入口点?如果是,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?在哪里可以找到有关此的文档?否进程在入口点的堆栈上没有关于其参数的任何信息。您必须调用GetCommandLine或通过访问PEB中的信息,但这不是一个稳定的API 每个语言支持库(如CRT)都必须做到这一点。从某种意义上讲,FS寄存器的值
\u start
,\u main
或任何您喜欢的东西
问题是-是否使用一些参数调用此入口点?如果是,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?在哪里可以找到有关此的文档?否进程在入口点的堆栈上没有关于其参数的任何信息。您必须调用
GetCommandLine
或通过访问PEB中的信息,但这不是一个稳定的API
每个语言支持库(如CRT)都必须做到这一点。从某种意义上讲,FS寄存器的值……您要问的技术术语是用于windows进程的ABI(应用程序二进制接口)。ABI还告诉您,在新执行的进程中,您可以期望寄存器等的状态。(例如,Unix x86-64 ABI说它们中的大多数是未初始化的。实际上,Linux会将它们归零,以避免泄露内核数据。)@user2214913我认为微软没有在任何地方记录过这些东西。查看可以从入口点安全返回的代码。它将返回到kernel32.dll中的BaseThreadInitThunk,然后该进程立即退出。@user2214913我使用了一个调试器“OllyDbg”,在源代码不可用时,由于良好的程序集分析,该调试器工作良好。类似的软件:x64dbg,IDA。@user2214913:原始入口点签名是
DWORD回调RawEntryPoint(void)
。我相信我在MSDN中看到了记录,但再也找不到了。不过,你可以在网站上找到可靠的信息。它显然与的大不相同,在这里,您的命令行参数和环境变量由\u start
项上的堆栈参数指向。有趣的是,即使在ABI级别,cmdline arg也是二等公民。您必须要求操作系统将它们提供给您,而不是默认情况下让它们存在。同样在Linux中,您不能从\u start
返回。(使用exit()
系统调用)。动态库ABI与内核进程exec ABI是分开的,因此没有与之等价的kernel32.dll。@彼得科德斯:你错了,你所说的几乎都是错的。命令行参数通过传递给新创建的进程。进程不需要查询操作系统。虽然可以从本机Windows可执行文件的入口点返回,但这不会终止进程。你也必须访问Windows。kernel32.dll不是内核模块。我不明白你想说什么。