簡體   English   中英

我可以直接訪問Windows內核系統調用嗎?

[英]Can I access Windows Kernel system calls directly?

我一直在研究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)
...

因此,讓我們隨機選擇一個, NtReadFile看起來很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

在這里,我們看到我們rcxrcx ,將syscall編號放入eax ,然后調用syscall指令。 每個系統調用都有一個由Windows任意分配的數字(即,該數字是ntdll和內核之間的秘密握手,並且會在Microsoft需要時更改)

這些指令都不是“魔術”的,您也可以直接在應用中執行它們(但是,出於實用的考慮,沒有實際的理由)

EmptyClipboard是所謂的“Win32 API的”一個和NtUserEmptyClipboard一個相應的“原生API”。

與Linux syscall(2) ,我們很少應該直接調用“本地API”。 我聽說它們位於ntdll.dll而不是win32k.sys 但是我們應該能夠像在普通DLL中定義的普通函數一樣調用它們。

我強烈懷疑0x117f是您要查找的地址 我懷疑這可能是您需要傳遞給GetProcAddress 但我不確定,因為這些問題在Windows版本之間有所不同(這就是為什么普通人改用文檔功能的原因)

本機API的主要部分是通過ntdll.dll中的常規功能導出的。 您可以將此dll加載到您的進程中,並像其他任何API函數一樣調用這些函數。 只要您具有正確的函數原型和參數,調用就可以正常工作。 他們在內部做的工作是從用戶模式轉換到內核模式,然后使用偏移量進入系統服務描述符表(SSDT),以在內核模式內存中查找函數的地址,然后調用該函數。 有一個開源項目http://nativetest.codeplex.com/ ,它可以調用您可能引用的本機api。

win32k.sys中的功能未在ntdll.dll中公開。 據我所知,它們沒有暴露在任何地方。 您列出的地址-我相信-實際上是SSDT的偏移量。 如果確實需要調用此函數,則必須自己進行從usermode到kernelmode的轉換,將函數的所有參數和SSDT偏移量放在正確的位置。

正如其他人所建議的那樣,我建議找到usermode API來幫助完成您想做的事情。 FWIW,根據鏈接/轉儲輸出,在user32.dll中,函數EmptyClipboard似乎直接轉發到NtUserEmptyClipboard。

1731   DF 0002018A EmptyClipboard = _NtUserEmptyClipboard@0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM