Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows&;中的系统调用;本机API?_Windows_Linux_Assembly_Kernel_Nt Native Api - Fatal编程技术网

windows&;中的系统调用;本机API?

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

最近我在*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\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的陷阱之间有区别