use*_*018 4 c c++ windows system-calls windows-kernel
我一直在研究 Windows 内部,最近刚刚了解了系统调用,我想知道是否可以像函数一样使用这些系统调用?我知道它们并不是真的要从外部访问。
例如:NtUserEmptyClipboard是 Win32k.sys 中的系统调用,其地址为0x117f
如果我想像函数一样使用这个调用,我该怎么做?
您想要做什么在很大程度上取决于您感兴趣的架构,但要知道的是,这ntdll.dll是每个系统调用的用户模式蹦床 - 即在一天结束时实际进行系统调用的唯一一个是 ntdll。
因此,让我们通过打开任何旧的 exe(我选择记事本)来在 WinDbg 中反汇编这些方法之一。首先,使用x ntdll!*查找ntdll导出的符号:
0:000> x ntdll!*
00007ff9`ed1aec20 ntdll!RtlpMuiRegCreateLanguageList (void)
00007ff9`ed1cf194 ntdll!EtwDeliverDataBlock (void)
00007ff9`ed20fed0 ntdll!shortsort_s (void)
00007ff9`ed22abbf ntdll!RtlUnicodeStringToOemString$fin$0 (void)
00007ff9`ed1e9af0 ntdll!LdrpAllocateDataTableEntry (void)
...
Run Code Online (Sandbox Code Playgroud)
所以,让我们随机挑选一个,NtReadFile看起来很不错。让我们拆解一下:
0:000> uf ntdll!NtReadFile
ntdll!NtReadFile:
00007ff9`ed21abe0 4c8bd1 mov r10,rcx
00007ff9`ed21abe3 b805000000 mov eax,5
00007ff9`ed21abe8 0f05 syscall
00007ff9`ed21abea c3 ret
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到我们塞掉了rcx,将系统调用号放入eax,然后调用syscall指令。每个 syscall 都有一个由 Windows 任意分配的编号(即这个编号是 ntdll 和内核之间的秘密握手,并且随 Microsoft 需要而更改)
这些指令都不是“魔法”,你也可以直接在你的应用程序中执行它们(但当然没有实际的理由 - 只是为了好玩)
我强烈怀疑这0x117f就是你要找的地址。我怀疑这可能是您需要传递给的值GetProcAddress。但我不确定,因为这些事情因 Windows 版本而异(这就是普通人使用文档化函数的原因)