【问题标题】:Windows system calls [duplicate]Windows系统调用[重复]
【发布时间】:2014-01-31 04:45:11
【问题描述】:

我对在 Linux 上使用系统调用进行汇编有(非常)基本的了解(我使用 GNU 汇编器as)。 在 Windows 7 上,我使用 GCC 编译器套件的 MinGW(32 位)端口来生成汇编程序。在 Linux 上,我经常在我的汇编程序中使用 C 库进行一些操作系统交互,在我的 Windows 平台上,使用 MinGW 也能完美运行。然而,有时我想使用低级系统调用——主要是为了使我的可执行文件尽可能小。在 Linux 上,我知道该怎么做:

movl        $0, %ebx
movl        $1, %eax
int $0x80   ; exit with code 0

我还使用这些系统调用从终端读取/写入字符(例如,在 EAX 中使用 4 写入系统调用)。我想知道如何在 Windows NT 平台上执行此操作。可能吗?我查看了this table,但我不太了解系统调用的名称。欢迎任何帮助。

【问题讨论】:

  • 内联系统调用而不是 call 库包装函数通常不会节省太多代码大小,特别是如果您缺少 well-known optimizations like xor %ebx,%ebx 而不是 mov $0, %ebx。此外,Linux 上的int 0x80 是调用 32 位 ABI 的缓慢传统方式。推荐的方法是调用 VDSO,以便它可以使用 sysenter 以获得更好的性能。 blog.packagecloud.io/eng/2016/04/05/…
  • 您可以将 0 和 1 放入 6 个字节的 2 个寄存器中,而不是像 xor ebx, ebx; lea eax, [ebx + 1] 那样的 10 个字节。或 xor eax, eax; cdq; inc edx 仅花费 4 个字节(x86_64 中为 5 个)

标签: windows assembly


【解决方案1】:

Nt* 函数集没有记录有充分的理由:它是 Windows 内部的,并且在版本之间会发生变化,这意味着直接针对它的程序在 Windows 版本之间存在中断的高风险。

确实,以公开的、记录在案的函数为目标并没有那么大的开销,并且您得到 Microsoft 的保证,只要您正确使用 API,您的程序适用于未来版本的 Windows。 p>

因此,我不会为您提供您想要的答案。我强烈建议您使用公共控制台 API:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

更新

我认为这是为了实验或娱乐,确实 OP 写道:

不过,有时我想使用低级系统调用——主要是为了让我的可执行文件尽可能小。

...我发现这种推理方式有问题,我不想充当这类开发实践的推动者,特别是因为使用系统调用来执行控制台任务没有实际好处。

如果有人想知道如何在 Windows 中使用低级系统调用,那么请发布一个新的问题,适当的框架,我很乐意回答。

但作为起点,请参阅https://j00ru.vexillium.org/syscalls/nt/64/ 以获取按 Windows 内核版本细分的 x64 NT 系统调用号的逆向工程表。 (不要在可移植代码中使用,仅用于满足您对 Windows 和/或 asm 工作原理的好奇心的实验。)

【讨论】:

  • 我只是在玩汇编代码,仅此而已-对于这些小型实验,可移植性对我来说并不重要;)但是谢谢,您的建议非常有用,我一定会注意+1 编辑:我假设使用 C 库和我正在使用的 MinGW 端口是公共控制台 API 的有效替代方案?
  • @DiscobarMolokai:上次我检查时,MinGW GCC 使用了微软的 C 库,msvcrt.dll。严格来说,不支持以这种方式使用该库(据我所知),但这是一种普遍的做法。对于您的场景,它当然应该足够好。
  • -1,许多玩内部结构的人只是为了好玩/研究/学习,而不是因为他们打算开发可发布的软件。
  • 我应该强调,这绝对是我发布问题时需要的答案,即使它只是为了好玩,我支持戴对此事的立场。我的问题当然可以更清楚——我在 14 年是这里的新手,不理解简洁明了的问题的价值——所以也许可以编辑问题以更清楚地反映这一点?人们似乎仍然时不时地偶然发现这个问题,我可以看到当前的事态如何引起混乱。
  • @DiscobarMolokai:我认为当前的问题很好,尤其是戴最近对答案的编辑。如果问题或答案中有一个链接到如何直接进行 Windows 内核系统调用(使用 x86-64 syscall 或他们在 32 位模式下所做的任何事情),在适当的警告标签之后它会赢'不便携。
猜你喜欢
  • 2015-01-11
  • 2014-09-22
  • 2018-07-20
  • 2011-10-03
  • 2011-02-15
  • 2011-07-20
  • 1970-01-01
  • 2018-07-28
  • 2014-07-25
相关资源
最近更新 更多