【发布时间】:2017-08-27 08:59:25
【问题描述】:
我想创建一个最小的 Windows 可执行文件,什么都不做 - 并且尺寸最小。
我只关心在任务管理器中保留一个进程条目。
在 Linux 上,这非常简单(只需 2 条汇编指令即可使用 pause
系统调用)。如何在 Windows 上获得类似的结果?
我试图将可执行文件的大小保持在最低限度,我不想让 10kB 的可执行文件实际上什么都不做。
有没有办法在汇编中实现这一点?正如我所提到的,我不想仅仅为了让进程“挂起”而包含庞大的库。
【问题讨论】:
-
foo: jmp foo? -
@melpomene 等待很忙。
pause()是一个系统调用,它会暂停进程直到信号到达。 -
Sleep(INFINITE)也不需要太多代码。 -
不幸的是,WinAPI 在很大程度上被定义为用户模式库函数。例如,
sleep是一个使用ZwDelayExecution(又名NtDelayExecution)的Kernel32 函数,在我的系统上实现为mov r10, ... / mov eax, 31 / syscall。后者最接近 Linux 对应物,但它并不等同(不可移植)。正如 Anders 在其回答中所说,您可以简单地使用任何编译器来调用sleep并依靠构建后工具来去除未使用的元数据和/或缩小 PE 部分。 -
这种练习并不是特别值得。在现实世界中,没有人创建什么都不做的可执行文件,因此工具并未针对它进行优化。没有人关心使无操作可执行文件变小,因为没有人关心无操作可执行文件。您包含库是因为您需要它们多次提供的功能,并且它们比您自己编写所有函数更方便使用。当然,有一些方法可以编写一些可以做某事的小型可执行文件,但是不值得花时间为什么都不做的人写答案。
pause有自己的问题。
标签: windows assembly system-calls