Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 什么参数被传递到PE(可移植可执行文件)文件的入口点?_Winapi_Assembly_X86_Portable Executable - Fatal编程技术网

Winapi 什么参数被传递到PE(可移植可执行文件)文件的入口点?

Winapi 什么参数被传递到PE(可移植可执行文件)文件的入口点?,winapi,assembly,x86,portable-executable,Winapi,Assembly,X86,Portable Executable,如果您组装一个PE(.exe,用于Win32的可移植可执行文件),它有一个入口点,您可以调用\u start,\u main或任何您喜欢的东西 问题是-是否使用一些参数调用此入口点?如果是,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?在哪里可以找到有关此的文档?否进程在入口点的堆栈上没有关于其参数的任何信息。您必须调用GetCommandLine或通过访问PEB中的信息,但这不是一个稳定的API 每个语言支持库(如CRT)都必须做到这一点。从某种意义上讲,FS寄存器的值

如果您组装一个PE(.exe,用于Win32的可移植可执行文件),它有一个入口点,您可以调用
\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不是内核模块。我不明白你想说什么。