windows&;中的系统调用;本机API?
最近我在*NIX操作系统中使用了很多汇编语言。我想知道windows域的情况windows&;中的系统调用;本机API?,windows,linux,assembly,kernel,nt-native-api,Windows,Linux,Assembly,Kernel,Nt Native Api,最近我在*NIX操作系统中使用了很多汇编语言。我想知道windows域的情况 linux中的调用约定: mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80 就这样。这就是我们在linux中进行系统调用的方式 linux中所有系统调用的引用: mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80 关于哪个$SYS
linux中的调用约定:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
就这样。这就是我们在linux中进行系统调用的方式
linux中所有系统调用的引用:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
关于哪个$SYS\u Call\u NUM和哪些参数,我们可以使用此参考:
官方参考:
在Windows中调用约定:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
Windows中所有系统调用的引用:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
非官方:,但除非我知道调用约定,否则我如何在汇编中使用这些
官员:
- 如果你说,他们没有记录下来。那么,在不知道系统调用的情况下,如何为windows编写libc呢?如何进行Windows汇编编程?至少在驱动程序编程中需要了解这些。对吧?
现在,所谓的本机API是怎么回事?windows的
本机API
和系统调用是否都是指同一事物的不同术语?为了证实这一点,我比较了两个非官方来源的数据
系统调用:
本机API:
我的意见:
所有系统调用都以字母Nt
开头,其中作为本机API由许多不是以字母Nt
开头的函数组成
windows的系统调用
是本机API
的子集。系统调用只是本机API的一部分李>
有人能证实这一点并解释一下吗
编辑:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
还有一个答案。这是第二个答案。我真的很喜欢它,但我不知道为什么回答者删除了它。我请求他重新发布他的答案。Windows系统调用是通过调用系统dll来执行的,如kernel32.dll
或gdi32.dll
,这是通过普通子程序调用完成的。捕获到操作系统特权层的机制没有文档记录,但这没关系,因为像kernel32.dll
这样的dll会为您执行此操作
通过系统调用,我指的是有文档记录的Windows API入口点,如CreateProcess()
或GetWindowText()
。设备驱动程序通常使用与Windows DDK不同的API。如果在Windows下进行汇编编程,则不进行手动系统调用。您可以使用NTDLL和本机API来实现这一点
本机API只是内核模式方面的包装器。它所做的只是为正确的API执行系统调用
您永远不需要手动系统调用,因此整个问题都是多余的
Linux系统调用代码不变,Windows系统调用代码不变,这就是为什么需要通过额外的抽象层(也称为NTDLL)工作的原因
编辑:
此外,即使您在程序集级别工作,您仍然可以完全访问Win32 API,没有理由一开始就使用NT API!导入、导出等都可以在汇编程序中正常工作
编辑2:
如果您真的想进行手动系统调用,则需要为每个相关的Windows版本反转NTDLL,添加版本检测(通过PEB),并为每个调用执行系统调用查找
然而,这将是愚蠢的。NTDLL的存在是有原因的
人们已经完成了逆向工程部分:请参阅,以获取每个Windows内核的系统调用号表。(请注意,后面的行即使在Windows 10的版本之间也会发生变化。)同样,除了在您自己的机器上进行仅供个人使用的实验以了解有关asm和/或Windows内部结构的更多信息之外,这是一个坏主意。不要将系统调用内联到您分发给其他人的代码中。Windows中的官方调用约定:
(希望此链接在将来仍然存在;如果没有,请在MSDN上搜索“x64软件约定”)
函数调用约定在Linux和Windows x86_64中有所不同。在这两种ABI中,参数最好通过寄存器传递,但使用的寄存器不同。有关Linux ABI的更多信息,请访问关于windows系统调用约定,您需要了解的另一件事是,据我所知,系统调用表是作为构建过程的一部分生成的。这意味着他们可以简单地改变——没有人跟踪他们。如果有人在列表的顶部添加了一个新的,这并不重要。NTDLL仍然有效,所以其他调用NTDLL的人仍然有效
即使是用来执行系统调用(int或syscenter)的机制也不是一成不变的,在过去已经发生了变化,我认为,从前,同一版本的windows使用不同的DLL,根据机器中的CPU使用不同的输入机制。我对在汇编中进行windows API调用而不进行导入感兴趣(作为教育练习),因此我编写了以下FASM汇编来实现NtDll!NtCreateFile没有。这是在我的64位版本Windows(Win10 1803版本10.0.17134)上的一个粗略演示,它在调用后崩溃,但syscall的返回值为零,因此它是成功的。一切都是按照Windows x64调用约定设置的,然后系统调用号加载到RAX中,然后是运行调用的syscall汇编指令。我的示例创建了文件c:\HelloWorldFile\u FASM,因此它必须以“管理员”身份运行
我使用了Ntdll的文档!我还使用内核调试器查看和复制了许多参数
__kernel_entry NTSTATUS NtCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
);
1.我将如何在汇编语言编程中使用它们?2.Windows API和系统调用不是一回事。WINDOWS API使用系统调用。linux域上类似的类比是POSIXAPI(WINDOWS API)使用linux内核(WINDOWS内核)提供的系统调用。所以,我关心的是真正的系统调用。我知道API调用和进入操作系统privi的陷阱之间有区别