【问题标题】:Windows equivalent to pause() syscall?Windows 相当于 pause() 系统调用?
【发布时间】: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


【解决方案1】:

正如 Hans 在 cmets 中建议的那样,Sleep(INFINITE) 可能是最简单的非忙等待。但是,这确实意味着您必须使用任务管理器终止该进程才能停止它。

如果您需要多次启动/停止此过程,则调用 MessageBox 后跟 ExitProcess 可能不那么烦人。

如果您不使用 CRT(WinMainCRTStartup 并使用 /Zlsmaller alignment 编译),您可能可以使用 Visual C++ 将其降低到 1 KiB

你可以通过组装让它稍微小一点,但它可能不值得。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2014-01-31
    • 2023-03-05
    相关资源
    最近更新 更多