是否可以在不链接到c库和不使用ExitProcess()的情况下从汇编代码创建Windows exe?

是否可以在不链接到c库和不使用ExitProcess()的情况下从汇编代码创建Windows exe?,windows,assembly,system-calls,static-linking,portable-executable,Windows,Assembly,System Calls,Static Linking,Portable Executable,出于教育目的,我正在尝试使用不依赖于标准C库或Windows DLL的汇编代码在Windows上创建一个(32位)exe 我可以创建一个开始运行的程序(并且我可以用gdb进行调试),但是我不知道如何干净地退出该程序。所有教程要么链接到标准C库并定义一个main函数,要么使用在DLL中定义的ExitProcessWinAPI调用 在32位Linux上,我将使用int0x80指令和exitsyscall。显然,Windows并没有真正实现这些中断 那么,有没有办法从我的程序中干净地返回呢?Windo

出于教育目的,我正在尝试使用不依赖于标准C库或Windows DLL的汇编代码在Windows上创建一个(32位)exe

我可以创建一个开始运行的程序(并且我可以用gdb进行调试),但是我不知道如何干净地退出该程序。所有教程要么链接到标准C库并定义一个
main
函数,要么使用在DLL中定义的
ExitProcess
WinAPI调用

在32位Linux上,我将使用
int0x80
指令和
exit
syscall。显然,Windows并没有真正实现这些中断

那么,有没有办法从我的程序中干净地返回呢?

Windows有一些类似的(传统的)。阅读以了解有关操作系统的更多信息

但微软Windows是专有软件。系统调用接口未被Microsoft记录,可能是特定于特定版本的,您需要花费大量时间对其进行反向工程。另见

人们已经做了逆向工程,并在上发表了结果

因此,直接进行系统调用是可能的,但除了在您自己的桌面上进行学习实验(不是针对您分发的可执行文件)之外,这是非常不实际的


您想要的另一部分,即避免将任何dll加载/映射到进程的虚拟地址空间,实际上可能是不可能的。

ExitProcess
Kernel32.dll
中定义,它始终加载到进程中。如果没有
Kernel32.dll
,则不能使用Win32进程。该进程不可移植。Windows没有稳定的
int 0x???
syscenter
ABI。提供稳定ABI的DLL确实在内部使用它,但调用号码和函数签名可能会随着Windows版本的不同而变化,甚至会随修补程序而变化。@RbMm好的,我应该说是用户进程,。内核有不同规则的“进程”(例如,
ssm
不加载任何映像…但显然有代码)。@Richard-更正确的说法是gui(
IMAGE\u SUBSYSTEM\u WINDOWS\u gui
)和控制台(
IMAGE\u SUBSYSTEM\u WINDOWS\u CUI
)子系统总是加载kernel32.dll,但
IMAGE\u SUBSYSTEM\u NATIVE
不加载。smss.exe示例-此处仅加载ntdll.dll。存在使用此子系统的所谓启动执行应用程序。例如chkdsk。exe@PeterCordes-在windows中,不难(对我来说)构建完全没有导入的可执行文件。可能需要解析导入函数。有不同的方法可以做到这一点。甚至可能使用延迟加载导入(为此需要少量补丁标准link.exe)。但这里有个问题-不要在exe中使用导入表,或者根本不要从windows DLL调用任何api。第二是更多的限制和不可移植性人们已经公布了这种逆向工程的结果。我认为在一个关于直接调用Windows系统调用的问答中有一个链接。因此,在实践中很容易做到这一点,但前提是您希望使可执行文件只在您的桌面上工作,而不一定在其他人的桌面上工作。这个问题中关于尝试创建一个甚至不链接DLL的静态可执行文件的部分很有趣。IDK,如果Windows可执行文件可以做到这一点,或者DLL仍然会映射到它们的虚拟地址空间,即使它们避免从中调用任何函数。