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,但除非我知道调用约定,否则如何在汇编中使用它们.
官方:???
现在,与所谓的Native API有什么关系?是Native API和System calls for windows两者都是指同一件事的不同术语吗?为了证实我将这些来自两个非官方来源进行了比较
系统调用:http://www.metasploit.com/users/opcode/syscalls.html
Native API:http://undocumented.ntinternals.net/aindex.html
我的观察:
Nt其中Native API由许多不以字母开头的函数组成Nt.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是有原因的.
关于windows syscall约定你需要知道的另一件事是,据我所知,syscall表是作为构建过程的一部分生成的.这意味着它们可以简单地改变 - 没有人跟踪它们.如果有人在列表顶部添加新的,则无关紧要.NTDLL仍然有效,因此调用NTDLL的其他人仍然可以工作.
甚至用于执行系统调用(int或sysenter)的机制也不是固定不变的,并且在过去已经发生了变化,我认为曾经有一段时间相同版本的Windows使用不同的DLL,这些DLL使用不同的输入机制,具体取决于CPU在机器中.
| 归档时间: |
|
| 查看次数: |
12187 次 |
| 最近记录: |