系统调用在窗户及地API?
-
21-09-2019 - |
题
最近我一直在使用大会语言*尼克斯的操作系统。我想知道有关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
呼吁《公约》在窗口:
???
参考系统的所有呼吁在窗口:
???
非官方的: http://www.metasploit.com/users/opcode/syscalls.html 但我如何使用这些中大会除非我知道这个叫公约》。
官方:???
- 如果你说,他们没有记录在案。然后是如何一个会写的libc windows不知道系统的电话?怎么是一个要做Windows会编程?至少在驾驶员编程人需要知道这些。对吗?
现在,怎么了与所谓的本地API?是 Native API
& System calls for windows
两者都不同的条款参照同样的事情吗?为了确认我比较了这些从两个非官方消息来源
系统调用: http://www.metasploit.com/users/opcode/syscalls.html
本机API: http://undocumented.ntinternals.net/aindex.html
我的意见:
- 所有系统通话开始用字母
Nt
其中作为本机API组成的大量职能不是开始用字母Nt
. System Call of windows
是的子集Native API
.系统调用的司机。
任何一个可以确认和解释。
编辑:
还有另一个答案。这是一个2的答复。我真的很喜欢它但是我不知道为什么回答者已被删除。我请求他重新发布他的回答。
解决方案
如果你这样做会编程在窗户你不做手册系统调用.你使用NTDLL和地API以为你做的。
本机API是一个简单的包装的那么边的事情。它所做的是执行一个系统调用于正确的。
你应该永远不需要手动系统调用所以你的整个问题是多余的。
Linux的系统调用的代码不改变,Windows做,这就是为什么你需要的工作,通过一个额外的抽象层(又名NTDLL).
编辑:
此外,即使你的工作在大会一级,你还有完全进入Win32API,没有任何理由可以使用的NT API开始!进口、出口等所有工作只是现在大会的程序。
EDIT2:
如果你真的想要做手册系统调用,你会需要反NTDLL为每个相关的Windows的版本,加版的检测(通过苯),并执行一个系统调用查找针对每一呼吁。
然而,那将是愚蠢的。NTDLL是有原因的。
人们已经完成的逆向工程的部分:看看 https://j00ru.vexillium.org/syscalls/nt/64/ 对一个表格的系统-电话号码的每个窗户内核。(注意,后面行做变化之间甚至版本的Windows10。) 再次,这是一个糟糕的想法以外的个人使用的唯一实验在你自己的机器了解更多有关汇编和/或Windows内部。不内联的系统调入的代码分发给其他任何人。
其他提示
其他的事情你需要知道的有关windows系统调用《公约》是,据我了解的系统调用表格产生的部分作为建立过程。这意味着他们可以简单地改变-没有人跟踪他们。如果某人增加一个新的名单的,它并不重要。NTDLL仍然有效,所以其他人的电话NTDLL仍然有效。
甚至本机构用于执行系统调用(其int或sysenter)不是固定在石头,并有改变过去,我认为,一旦在一个时间相同版本的windows用不同的Dll其使用不同的条机制取决于CPU在机。
窗系统的电话是执行通过调入系统Dll如 kernel32.dll
或 gdi32.dll
, ,这样做是与普通的子程序的呼吁。该机制陷入OS特权阶层是无证件的,但这是好的,因为Dll喜欢 kernel32.dll
为你做这个。
并且通过系统电话,我指的记录Windows API入境点喜欢 CreateProcess()
或 GetWindowText()
.设备的司机通常将使用一个不同的API从窗户信息适.
我很感兴趣,这样做windows API呼吁在大会没有进口(作为一种教育活动),因此我写了以下FASM会做什么NtDll!NtCreateFile。这是一个粗糙的示范,在我的64位版本的Windows(Windows10 1803版10.0.17134),以及它提出之后打电话,但返回值的系统调用为零,所以它是成功的。一切都设置了每Windows64呼吁《公约》,然后系统中的呼号是装入RAX,然后是系统调用大会的指示运行的电话。我的例子创建文件c:\HelloWorldFile_FASM,因此具有可运行的"作为管理员"。
format PE64 GUI 4.0
entry start
section '.text' code readable executable
start:
;puting the first four parameters into the right registers
mov rcx, _Handle
mov rdx, [_access_mask]
mov r8, objectAttributes
mov r9, ioStatusBlock
;I think we need 1 stack word of padding:
push 0x0DF0AD8B
;pushing the other params in reverse order:
push [_eaLength]
push [_eaBuffer]
push [_createOptions]
push [_createDisposition]
push [_shareAcceses]
push [_fileAttributes]
push [_pLargeInterger]
;adding the shadow space (4x8)
; push 0x0
; push 0x0
; push 0x0
; push 0x0
;pushing the 4 register params into the shadow space for ease of debugging
push r9
push r8
push rdx
push rcx
;now pushing the return address to the stack:
push endOfProgram
mov r10, rcx ;copied from ntdll!NtCreateFile, not sure of the reason for this
mov eax, 0x55
syscall
endOfProgram:
retn
section '.data' data readable writeable
;parameters------------------------------------------------------------------------------------------------
_Handle dq 0x0
_access_mask dq 0x00000000c0100080
_pObjectAttributes dq objectAttributes ; at 00402058
_pIoStatusBlock dq ioStatusBlock
_pLargeInterger dq 0x0
_fileAttributes dq 0x0000000000000080
_shareAcceses dq 0x0000000000000002
_createDisposition dq 0x0000000000000005
_createOptions dq 0x0000000000000060
_eaBuffer dq 0x0000000000000000 ; "optional" param
_eaLength dq 0x0000000000000000
;----------------------------------------------------------------------------------------------------------
align 16
objectAttributes:
_oalength dq 0x30
_rootDirectory dq 0x0
_objectName dq unicodeString
_attributes dq 0x40
_pSecurityDescriptor dq 0x0
_pSecurityQualityOfService dq securityQualityOfService
unicodeString:
_unicodeStringLength dw 0x34
_unicodeStringMaxumiumLength dw 0x34, 0x0, 0x0
_pUnicodeStringBuffer dq _unicodeStringBuffer
_unicodeStringBuffer du '\??\c:\HelloWorldFile_FASM' ; may need to "run as adinistrator" for the file create to work.
ioStatusBlock:
_status_pointer dq 0x0
_information dq 0x0
securityQualityOfService:
_sqlength dd 0xC
_impersonationLevel dd 0x2
_contextTrackingMode db 0x1
_effectiveOnly db 0x1, 0x0, 0x0
我用的是文件Ntdll!NtCreateFile,我也使用核debugger来看待和复制多的参数。
__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
);
官方调《公约》在窗口: http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
(希望这个链路存在的未来;如果不是,只要搜索"64软件公约"在MSDN).
功能呼吁《公约》的不同之处在Linux和Windows x86_64.在这两个ABIs、参数是最好通过注册,但登记册使用的不同而不同。更多的Linux ABI可以发现在 http://www.x86-64.org/documentation/abi.pdf