Windows和Native API中的系统调用?

cla*_*aws 24 linux windows assembly kernel nt-native-api

最近我在*NIX操作系统中使用了很多汇编语言.我想知道Windows域名.


在linux中调用约定:

mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
Run Code Online (Sandbox Code Playgroud)

而已.这就是我们应该如何在linux中进行系统调用.

在linux中引用所有系统调用:

关于哪个$ SYS_Call_NUM以及哪些参数我们可以使用这个参考:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

官方参考:http://kernel.org/doc/man-pages/online/dir_section_2.html


在Windows中调用约定:

???

Windows中所有系统调用的引用:

???

非官方:http://www.metasploit.com/users/opcode/syscalls.html,但除非我知道调用约定,否则如何在汇编中使用它们.

官方:???

  • 如果你说,他们没有记录它.那么如何在不知道系统调用的情况下为windows编写libc?如何进行Windows程序集编程?至少在驱动程序编程中需要了解这些.对?

现在,与所谓的Native API有什么关系?是Native APISystem calls for windows两者都是指同一件事的不同术语吗?为了证实我将这些来自两个非官方来源进行了比较

系统调用:http://www.metasploit.com/users/opcode/syscalls.html

Native API:http://undocumented.ntinternals.net/aindex.html

我的观察:

  1. 所有系统调用都以字母开头,Nt其中Native API由许多不以字母开头的函数组成Nt.
  2. System Call of windows是.的子集Native API.系统调用只是Native API的一部分.

任何人都可以证实并解释.

编辑:

还有另一个答案.这是第二个答案.我真的很喜欢它,但我不知道为什么回答者已删除它.我请他转发他的答案.

Rap*_*tor 25

如果您在Windows下进行汇编编程,则不要进行手动系统调用.您可以使用NTDLL和Native API为您执行此操作.

Native API只是内核模式方面的包装器.它所做的就是为正确的API执行系统调用.

您永远不需要手动系统调用,因此您的整个问题都是多余的.

Linux系统调用代码不会改变,Windows会这样做,这就是为什么你需要通过一个额外的抽象层(又名NTDLL).

编辑:

此外,即使您在程序集级别工作,您仍然可以完全访问Win32 API,因此没有理由使用NT API开始!进口,出口等都可以在装配程序中正常工作.

EDIT2:

如果您真的想要进行手动系统调用,则需要为每个相关的Windows版本反转NTDLL,添加版本检测(通过PEB),并为每个调用执行系统调用查找.

然而,这将是愚蠢的.NTDLL是有原因的.

  • 这篇简短而简洁的文章是对这个答案的一个很好的补充:http://www.codeproject.com/KB/system/Win32.aspx (5认同)
  • 那篇文章不是你想要的.它显示了如何执行手动系统调用,您不应该这样做,因为Windows版本和Service Pack中的数字会发生变化.正如我已经说过的那样,您应该使用Windows API为您执行调度.NTDLL自动映射到所有进程.因此,即使由于某种原因你不能使用导入(我想不出任何合理的时间会出现这种情况)你仍然可以获得NTDLL的句柄并手动枚举EAT以获得必要的函数指针(尽管你永远不应该). (5认同)
  • 这并不是真正针对这个答案的作者,但我不明白为什么这些"不做这个"的答案在SO上如此普遍,这不应该是一个"专业和爱好者的网站"程序员"?为什么一方面这个网站[鼓励极端的研究工作](https://meta.stackoverflow.com/a/261593/4975230)但是当你遇到这些低级别的好奇心问题时,我看到了一个"你不要不需要知道!!!".谁又是这个网站的真正目标受众?需要双手的人还是真正愿意深挖的人? (4认同)
  • 同意!但仍然知道的东西没有伤害吗? (3认同)
  • @claws这篇文章是非常有趣的读物,非常感谢 (2认同)
  • 以下是最初于 2010 年 3 月 22 日 5:09 通过爪子链接的文章的新位置:https://www.codeproject.com/Articles/33870/A-Primer-of-the-Windows-Architecture (2认同)

Ste*_*art 8

关于windows syscall约定你需要知道的另一件事是,据我所知,syscall表是作为构建过程的一部分生成的.这意味着它们可以简单地改变 - 没有人跟踪它们.如果有人在列表顶部添加新的,则无关紧要.NTDLL仍然有效,因此调用NTDLL的其他人仍然可以工作.

甚至用于执行系统调用(int或sysenter)的机制也不是固定不变的,并且在过去已经发生了变化,我认为曾经有一段时间相同版本的Windows使用不同的DLL,这些DLL使用不同的输入机制,具体取决于CPU在机器中.

  • 它有点过时,但我认为Inside Windows 2000涵盖了这一点.http://www.nynaeve.net/?p=48有一个很好的讨论,并且还演示了在x86和x64上的Windows上最后使用了三个系统调用约定.IA64可能会再次做一些完全不同的事情,然后当然有Alpha,PowerPC,MIPS和其他可能.当然,通常的警告适用 - 所有没有记录,可能会改变. (3认同)