最近我在* NIX操作系统中使用了很多汇编语言。 我想知道的Windows域。
在linux中调用约定:
mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80
而已。 这就是我们应该如何在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 ,但我怎样才能在汇编中使用这些,除非我知道调用约定。
官方:???
现在,所谓的Native API呢? 本Native API
和System calls for windows
都是不同的术语是指同一件事情? 为了证实我比较了这两个非官方来源
系统调用: http : //www.metasploit.com/users/opcode/syscalls.html
原生API: http : //undocumented.ntinternals.net/aindex.html
我的观察:
Nt
开头,其中Native API由许多不以字母Nt
开头的函数组成。 System Call of windows
是Native API
子集。 系统调用只是Native API的一部分。 任何人都可以证实这一点并解释。
编辑:
还有另一个答案。 这是第二个答案。 我真的很喜欢它,但我不知道为什么回答者已经删除它。 我要求他重新发表他的回答。
如果你在Windows下进行汇编编程,你不要手动系统调用。 您可以使用NTDLL和Native API为您执行此操作。
Native API仅仅是一些内核模式的封装。 它所做的只是为正确的API执行系统调用。
你永远不需要手动系统调用,所以你的整个问题是多余的。
Linux系统调用代码不会改变,Windows是这样的,这就是为什么你需要通过一个额外的抽象层(又名NTDLL)。
编辑:
另外,即使您在汇编级别工作,仍然可以完全访问Win32 API,没有理由使用NT API开始! 汇编程序中的导入,导出等工作都很好。
EDIT2:
如果你真的想要手动系统调用,你将需要为每个相关的Windows版本反向NTDLL,添加版本检测(通过PEB),并为每个调用执行系统调用查找。
但是,这将是愚蠢的。 NTDLL是有原因的。
关于windows系统调用约定的另一件事是,据我所知,系统调用表是作为构建过程的一部分生成的。 这意味着他们可以简单地改变 – 没有人跟踪他们。 如果有人在列表顶部添加一个新的,没关系。 NTDLL仍然有效,所以其他所有调用NTDLL的人仍然可以工作。
甚至用于执行系统调用(int或sysenter)的机制也不是固定的,并且在过去已经发生了变化,我认为,同一版本的Windows使用不同的DLL,它们使用不同的入口机制,具体取决于机器中的CPU。
Windows系统调用是通过调用系统DLL(如kernel32.dll
或gdi32.dll
)来完成的,这是使用普通的子程序调用完成的。 陷入到操作系统特权层的机制是没有记录的,但这是可以的,因为像kernel32.dll
这样的DLL为你做这个。
通过系统调用,我指的是像CreateProcess()
或GetWindowText()
这样记录的Windows API入口点。 设备驱动程序通常会使用Windows DDK中的不同API。
Windows中的OFFICIAL调用约定: http : //msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
(希望这个链接在未来能够存活;如果不存在,只需在MSDN上搜索“x64软件约定”)。
函数调用约定在Linux和Windows x86_64中有所不同。 在两个ABI中,参数最好通过寄存器传递,但所使用的寄存器不同。 有关Linux ABI的更多信息, 请访问http://www.x86-64.org/documentation/abi.pdf