ntdll.dll学习总结
生活随笔
收集整理的這篇文章主要介紹了
ntdll.dll学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ntdll.dll
ntdll.dll描述了windows本地NTAPI的接口。是重要的Windows NT內核級文件。當Windows啟動時,ntdll.dll就駐留在內存中特定的寫保護區域,使別的程序無法占用這個內存區域。
中文名 ntdll.dll 外文名 NT Layer DLL 版 ? ?本 6.3.9600.17736 系統DLL文件 是 屬 ? ?于 Windows NT?
內核
目錄
1 概述
2 詳細介紹
3 函數調用
4 其他定義的部分函數如下
? Csr系列
? Dbg系列 調試函數
? Ki系列
? Ldr系列 Loader APIs
? Nls系列
? Nt系列及其他
5 英文解釋
DLL 文件名:ntdll.dll
DLL 名稱: NT Layer DLL
ntdll.dll
ntdll.dll(20張)
描述:
ntdll.dll是NT操作系統重要的模塊。[2]?
ntdll.dll是Windows系統從ring3到ring0的入口。位于Kernel32.dll和user32.dll中的所有win32 API 最終都
是調用ntdll.dll中的函數實現的。ntdll.dll中的函數使用SYSENTRY進入ring0,函數的實現實體在ring0中。
常見錯誤: File Not Found, Missing File, Exception Errors
詳細介紹
打開NTDLL.dll,發現CRT的許多基本函數都是在這里實現的。包括qsort,ceil這樣的函數,還有strcpy堆的釋放
,進程管理,似乎都是在ntdll中實現。
用戶模式的代碼在調用系統內核函數的時候,首先把一個叫做system call number的數放在EAX中,把參數放在
其它的寄存器中了。然后調用INT 2E中斷。但是大部分應用程序并不需要直接這么做。通常都是在調用
kernel32.dll等時由他們來調用INT 2E.
內核模式的代碼,做法稍微有點不同。他們通常調用由NTOSKRNL.EXE導出的NTDLL.dll中Zw開頭的那一系列函數
,比如 ZwWaitForSingleObject, 反之,如果是用戶級代碼需要調用內核,就會利用INT 2E調用
WaitForSingleObject.對于許多函數的批量調用,你會明顯發現 Zw族要比Rtl族效率高很多。
ntdll.dll中的大部分函數都是在MSDN中找不到描述的,因為這些函數介于Windows API與內核API之間,微軟并
未公開全部的內核函數.
函數調用編輯
對于一部分得知其定義形式的函數,可以這樣調用:
//C language??
//以進程掛起函數NtSuspendProcess為例? ?
//define function?
typedef LONG (NTAPI * _____NtSuspendProcess)(IN HANDLE);? ?
//Get Process Address (from ntdll.dll)?
_____NtSuspendProcess NtSuspendProcess=(_____NtSuspendProcess)GetProcAddress(GetModuleHandle
("ntdll"),"NtSuspendProcess");??
?//In function "main"
//Suspend itself:
?
NtSuspendProcess(GetCurrentProcess());
? ?
?//代碼在Mingw g++ 4.8.7(Windows 8.1 64bit)編譯通過
?
//運行時程序理應有SE_DEBUG_NAME特權
其他定義的部分函數如下
Csr系列
(configuration status register? Command and Status Register?)
CsrAllocateCaptureBuffer
CsrAllocateMessagePointer
CsrCaptureMessageBuffer
CsrCaptureMessageMultiUnicodeStringsInPlace
CsrCaptureMessageString
CsrCaptureTimeout
CsrClientCallServer
CsrClientConnectToServer
CsrFreeCaptureBuffer
CsrGetProcessId
CsrIdentifyAlertableThread
CsrNewThread
CsrProbeForRead
CsrProbeForWrite
CsrSetPriorityClass
Dbg系列 調試函數
DbgBreakPoint
DbgPrint
DbgPrintEx
DbgPrintReturnControlC
DbgPrompt
DbgQueryDebugFilterState
DbgSetDebugFilterState 6
DbgUiConnectToDbg
DbgUiContinue
DbgUiConvertStateChangeStructure
DbgUiDebugActiveProcess
DbgUiGetThreadDebugObject
DbgUiIssueRemoteBreakin
DbgUiRemoteBreakin
DbgUiSetThreadDebugObject
DbgUiStopDebugging
DbgUiWaitStateChange
DbgUserBreakPoint
Ki系列
KiRaiseUserExceptionDispatcher
KiUserApcDispatcher
KiUserCallbackDispatcher
KiUserExceptionDispatcher
Ldr系列 Loader APIs
(共34個API,NTDLL APIs)
LoadResource
LdrAccessResource
LdrAlternateResourcesEnabled
DisableThreadLibraryCalls
LdrDisableThreadCalloutsForDll
LdrEnumResources
LdrFindAppCompatVariableInfo
LdrFindEntryForAddress
EnumResourceTypesW
LdrFindResourceDirectory_U
FindResourceExA
LdrFindResource_U
LdrFlushAlternateResourceModules
LdrGetAlternateResourceModuleHandle
GetModuleHandleForUnicodeString
LdrGetDllHandle
GetProcAddress
LdrGetProcedureAddress
LdrInitializeThunk
LoadLibraryEx (LOAD_LIBRARY_AS_DATAFILE)
LdrLoadAlternateResourceModule
LoadLibrary
LdrLoadDll
LdrProcessRelocationBlock
LdrQueryApplicationCompatibilityGoo
LdrQueryImageFileExecutionOptions
LdrQueryProcessModuleInformation
LdrRelocateImage
ExitProcess
LdrShutdownProcess
ExitThread
LdrShutdownThread
LdrUnloadAlternateResourceModule
FreeLibrary
LdrUnloadDll
LdrVerifyImageMatchesChecksum
LdrVerifyMappedImageMatchesChecksum
Nls系列
代碼頁管理(National Language Support)
NlsAnsiCodePage
NlsMbCodePageTag
NlsMbOemCodePageTag
Nt系列及其他
(從process explorer上找到的一些函數)
NtQuerySystemInformation
NtQuerySymbolicLinkObject
NtQueryDirectoryObject
NtOpenSymbolicLinkObject
NtOpenDirectoryObject
NtQueryObject
NtQueryInformationProcess
NtSetInformationProcess
NtQuerySemaphore
NtQuerySection
NtQueryEvent
NtQueryMutant
NtResumeThread
NtSuspendThread
NtOpenThread
NtQueryInformationThread
NtQueryVirtualMemory
RtlCreateQueryDebugBuffer
RtlQueryProcessDebugInformation
RtlDestroyQueryDebugBuffer
RtlTimeToTimeFields
PropertyLengthAsVariant[5]?
英文解釋
NTDLL.DLL exports the WindowsNative API. The Native API is the interface used by user-mode?
components of the operating system that must run without support from Win32 or other API?
subsystems. Most of this API is implemented inNTDLL.DLLand at the upper edge ofntoskrnl.exe(and?
its variants), and the majority of exported symbols within these libraries are prefixedNt, for?
exampleNtDisplayString. Native APIs are also used to implement many of the "kernel APIs" or "base?
APIs" exported by KERNEL32.DLL.The large majority of Windows applications do not call NTDLL.DLL?
directly.
Applications that arelinkeddirectly against this library are known asnative applications; the?
primary reason for their existence is to perform tasks that must run early in the system startup?
sequence before the Win32 subsystem is available. An obvious but important example is the?
creation of the Win32 subsystem process,csrss.exe. Before the csrss.exe process exists, no Win32?
processes may be created, therefore the process that creates it (Smss.exe, the "session manager")?
must be a native application.csrss.exeitself is a native application.
Despite having an ".exe" file extension, native applications cannot be executed by the user (or?
any program in the Win32 or other subsystems). An example is theautochk.exebinary that?
runschkdskduring the system initialization "Blue Screen". Other prominent examples are the?
services that implement the various subsystems, such ascsrss.exe.
UnlikeWin32applications, native applications instantiate within the Kernel runtime code?
(ntoskrnl.exe) and so they must have a different entry point (NtProcessStartup, rather than(w)
(Win)MainCRTStartupas is found in a Win32 application),obtain their command-line arguments via a?
pointer to an in-memory structure, manage their own memory using theRtlheap API,(which the Win32?
heap APIs are just wrappers around -- no real difference there) and return execution with a call?
toNtTerminateProcess(as opposed toExitProcess). A common library linked with Native applications?
is nt.lib, which contains startup code for Native applications, similar to how the C runtime?
provides startup code for Win32 apps.
Though most of the API is undocumented, Native Applications can be built using theWindows Driver?
Development Kit; manyAntiVirusand other utility software vendors incorporate Native Applications?
within their products, usually to perform some boot-time task that cannot be carried out?
inuserspace.
========
掛起一個進程 ?
怎樣才能掛起一個進程。線程很好辦,因為系統提供了 SuspendThread() API 可以直接調用
。忘了是昨天還是前天,在用
十六進制方式查看大名鼎鼎的 Process Explorer 的時候,無意之中看到了一個原來沒見過的 API 名字:
NtSuspendProcess(),望文知義,連弱智都應該能看出來這個函數的作用。與之相對應的還有?
NtResumeProcess()。他們的原型為:
?
NTSTATUS NtSuspendProcess(HANDLE hProcess);
NTSTATUS NtResumeProcess(HANDLE hProcess);
?
從 NTDLL.DLL 中找到地址就可以直接用了。另外關于查詢一個進程當前是不是處于被掛起狀態我還不知道,估
計跑不了 NtQueryInformationProcess()。
========
深層解析最核心的dll:NTDLL.dll
打開NTDLL.dll,驚奇的發現原來CRT的許多基本函數居然都是在這里實現的!甚至包括qsort,ceil這樣的函數,
還有臭名昭著的 strcpy(嚴格來講,這只能怪使用者不當心)。堆的釋放,進城管理,似乎都是在這。于是,
我決定,仔細察看以下它,這1410個函數是做什么的.?
用戶模式的代碼在調用系統內核函數的時候,首先把一個叫做system call number的數放在EAX中,把參數
放在其它的寄存器中了。然后調用INT 2E中斷。但是大部分應用程序并不需要直接這么做。通常都是在調用
kernel32.dll等時由他們來調用INT 2E.?
內核模式的代碼,做法稍微有點不同。他們通常調用由NTOSKRNL.EXE導出的NTDLL.dll中Zw開頭的那一系列
函數,比如 ZwWaitForSingleObject, 反之,如果是用戶級代碼需要調用內核,就會利用INT 2E調用
WaitForSingleObject.對于許多函數的批量調用,你會明顯發現 Zw族要比Rtl族效率高很多。?
可惜ntdll.dll中的大部分函數都是undocumented.?
對于一部分得知其定義形式的函數,可以這樣調用:?
1.先將NTDLL.DLL讀入 LoadLibrary(TEXT(/"NTDLL.dll/"))?
2.利用GetProcAddress 獲取其函數入口地址?
3.利用得到的函數指針調用?
但是可以大致的分為幾類吧?
1 PropertyLengthAsVariant 它被排在了第一號,但是我就是不明白它是做什么的?
2 Csr(configuration status register? Command and Status Register?)系列?
CsrAllocateCaptureBuffer CsrAllocateMessagePointer CsrCaptureMessageBuffer?
CsrCaptureMessageMultiUnicodeStringsInPlace CsrCaptureMessageString CsrCaptureTimeout?
CsrClientCallServer CsrClientConnectToServer CsrFreeCaptureBuffer CsrGetProcessId?
CsrIdentifyAlertableThread CsrNewThread CsrProbeForRead CsrProbeForWrite CsrSetPriorityClass?
3 Dbg系列 調試函數?
DbgBreakPoint DbgPrint DbgPrintEx DbgPrintReturnControlC DbgPrompt DbgQueryDebugFilterState?
DbgSetDebugFilterState DbgUiConnectToDbg DbgUiContinue DbgUiConvertStateChangeStructure?
DbgUiDebugActiveProcess DbgUiGetThreadDebugObject DbgUiIssueRemoteBreakin DbgUiRemoteBreakin?
DbgUiSetThreadDebugObject DbgUiStopDebugging DbgUiWaitStateChange DbgUserBreakPoint?
4 ki系列?
KiRaiseUserExceptionDispatcher?
KiUserApcDispatcher?
KiUserCallbackDispatcher?
KiUserExceptionDispatcher?
5 Ldr系列 Loader APIs,共34個?
API?
NTDLL APIs?
LoadResource?
LdrAccessResource?
Ldr*****nateResourcesEnabled?
DisableThreadLibraryCalls?
LdrDisableThreadCalloutsForDll?
LdrEnumResources?
LdrFindAppCompatVariableInfo?
LdrFindEntryForAddress?
EnumResourceTypesW?
LdrFindResourceDirectory_U?
FindResourceExA?
LdrFindResource_U?
LdrFlush*****nateResourceModules?
LdrGet*****nateResourceModuleHandle?
GetModuleHandleForUnicodeString?
LdrGetDllHandle?
GetProcAddress?
LdrGetProcedureAddress?
LdrInitializeThunk?
LoadLibraryEx (LOAD_LIBRARY_AS_DATAFILE)?
LdrLoad*****nateResourceModule?
LoadLibrary?
LdrLoadDll?
LdrProcessRelocationBlock?
LdrQueryApplicationCompatibilityGoo?
LdrQueryImageFileExecutionOptions?
LdrQueryProcessModuleInformation?
LdrRelocateImage?
ExitProcess?
LdrShutdownProcess?
ExitThread?
LdrShutdownThread?
LdrUnload*****nateResourceModule?
FreeLibrary?
LdrUnloadDll?
LdrVerifyImageMatchesChecksum?
LdrVerifyMappedImageMatchesChecksum?
6 Nls(National Language Support)系列 代碼頁管理?
NlsAnsiCodePage?
NlsMbCodePageTag?
NlsMbOemCodePageTag?
7 Nt系列 共285個,大部分都是kernel32.dll,user32.dll等的核心實現?
NtCreateFile, NtOpenFile, NtClose, NtWaitForSingleObject 是kernel32.dll中許多用戶級代碼的核心
實現。?
NTSTATUS NtClose( HANDLE Handle);?
竟然是CloseHandle 的原身!唯一的缺點是該函數并沒有導出庫,如果要調用,就必須使用
GetProcAddress 來獲得其函數指針然后調用。?
NtCreateFile 可以說是DDK的核心?
RtlUnwind initiates an unwind of procedure call frames?
結構化異常(Structured Exception Handling, SEH )的 核心。?
NTSTATUS NtWaitForSingleObject( HANDLE Handle, BOOLEAN Alertable, PLARGE_INTEGER Timeout);?
Waits until the specified object attains a state of signaled?
我想,信號同步等,應該與之有莫大的聯系吧?
8 pfx 不明白?
PfxFindPrefix?
PfxInitialize?
PfxInsertPrefix?
PfxRemovePrefix?
9 RestoreEm87Context SaveEm87Context?
10 rtl系列 共506個。我想,rtl應該是runtime library的縮寫吧。一個很龐大的函數族,里面包含像?
RtlCreateUserProcess 這樣的一些很基本的函數,通常供內核模式的driver等調用?
下面是一部分示例?
APIs Forwarded to NTDLL?
API?
Destination?
DeleteCriticalSection?
Forwarded to NTDLL.RtlDeleteCriticalSection?
EnterCriticalSection?
Forwarded to NTDLL.RtlEnterCriticalSection?
HeapAlloc?
Forwarded to NTDLL.RtlAllocateHeap?
HeapFree?
Forwarded to NTDLL.RtlFreeHeap?
HeapReAlloc?
Forwarded to NTDLL.RtlReAllocateHeap?
HeapSize?
Forwarded to NTDLL.RtlSizeHeap?
LeaveCriticalSection?
Forwarded to NTDLL.RtlLeaveCriticalSection?
RtlFillMemory?
Forwarded to NTDLL.RtlFillMemory?
RtlMoveMemory?
Forwarded to NTDLL.RtlMoveMemory?
RtlUnwind?
Forwarded to NTDLL.RtlUnwind?
RtlZeroMemory?
Forwarded to NTDLL.RtlZeroMemory?
SetCriticalSectionSpinCount?
Forwarded to NTDLL.RtlSetCriticalSection- SpinCount?
TryEnterCriticalSection?
Forwarded to NTDLL.RtlTryEnterCriticalSection?
VerSetConditionMask?
Forwarded to NTDLL.VerSetConditionMask
? ? ? 11 VerSetConditionMask 用于確認系統信息?
The VerSetConditionMask function sets the bits of a 64-bit value to indicate the comparison?
operator to use for a specified operating system version attribute. This function is used to?
build the dwlConditionMask parameter of the VerifyVersionInfo function.?
12 Zw系列 共284個。前面已經說過,為可執行性系統服務提供內核模式的入口, 為NTOSKRNL.EXE 提供實
現。由于是內核模式,所以在執行的時候并不檢查用戶是否有執行權限?
13 內部函數 共116個。具體作用不明,很底層的東西。無法查到任何相關資料。無法得知與其相關的任何
信息。?
_CIcos _CIlog _CIpow _CIsin _CIsqrt __eCommonExceptions __eEmulatorInit __eF2XM1 __eFABS?
__eFADD32 __eFADD64 __eFADDPreg __eFADDreg __eFADDtop __eFCHS __eFCOM __eFCOM32 __eFCOM64?
__eFCOMP __eFCOMP32 __eFCOMP64 __eFCOMPP __eFCOS __eFDECSTP __eFDIV32 __eFDIV64 __eFDIVPreg?
__eFDIVR32 __eFDIVR64 __eFDIVRPreg __eFDIVRreg __eFDIVRtop __eFDIVreg __eFDIVtop __eFFREE?
__eFIADD16 __eFIADD32 __eFICOM16 __eFICOM32 __eFICOMP16 __eFICOMP32 __eFIDIV16 __eFIDIV32?
__eFIDIVR16 __eFIDIVR32 __eFILD16 __eFILD32 __eFILD64 __eFIMUL16 __eFIMUL32 __eFINCSTP __eFINIT?
__eFIST16 __eFIST32 __eFISTP16 __eFISTP32 __eFISTP64 __eFISUB16 __eFISUB32 __eFISUBR16?
__eFISUBR32 __eFLD1 __eFLD32 __eFLD64 __eFLD80 __eFLDCW __eFLDENV __eFLDL2E __eFLDLN2 __eFLDPI?
__eFLDZ __eFMUL32 __eFMUL64 __eFMULPreg __eFMULreg __eFMULtop __eFPATAN __eFPREM __eFPREM1?
__eFPTAN __eFRNDINT __eFRSTOR __eFSAVE __eFSCALE __eFSIN __eFSQRT __eFST __eFST32 __eFST64?
__eFSTCW __eFSTENV __eFSTP __eFSTP32 __eFSTP64 __eFSTP80 __eFSTSW __eFSUB32 __eFSUB64 __eFSUBPreg?
__eFSUBR32 __eFSUBR64 __eFSUBRPreg __eFSUBRreg __eFSUBRtop __eFSUBreg __eFSUBtop __eFTST __eFUCOM?
__eFUCOMP __eFUCOMPP __eFXAM __eFXCH __eFXTRACT __eFYL2X __eFYL2XP1 __eGetStatusWord?
14 一些CRT的基本函數 共131個 主要是字符串管理,還有些基本的數學函數?
__isascii __iscsym __iscsymf __toascii _alldiv _alldvrm _allmul _alloca_probe _allrem _allshl?
_allshr _atoi64 _aulldiv _aulldvrm _aullrem _aullshr _chkstk _fltused _ftol _i64toa _i64tow _itoa?
_itow _lfind _ltoa _ltow _memccpy _memicmp _snprintf _snwprintf _splitpath _strcmpi _stricmp?
_strlwr _strnicmp _strupr _tolower _toupper _ui64toa _ui64tow _ultoa _ultow _vsnprintf?
_vsnwprintf _wcsicmp _wcslwr _wcsnicmp _wcsupr _wtoi _wtoi64 _wtol abs atan atoi atol bsearch?
ceil cos fabs floor isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace?
isupper iswalpha iswctype iswdigit iswlower iswspace iswxdigit isxdigit labs log mbstowcs memchr?
memcmp memcpy memmove memset pow qsort sin sprintf sqrt sscanf strcat strchr strcmp strcpy?
strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr strtol strtoul swprintf tan?
tolower toupper towlower towupper vDbgPrintEx vDbgPrintExWithPrefix vsprintf wcscat wcschr wcscmp?
wcscpy wcscspn wcslen wcsncat wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcsstr wcstol wcstombs?
wcstoul?
眾所周知,NT中有很多為公布的api,習慣上大家喜歡把他們稱為native api.上面就是一部分。?
那么所謂的native api究竟是用來做什么的呢??
他是主要是用來在受控的狀態下調用kernel mode的代碼。說的簡單點,就是一個通往kernel 的?
interface.舉個簡單的例子,user mode 下,用戶是不能直接訪問硬件的。即使是像打開,關閉文件這樣的簡
單操作,也需要先從user mode 切換至 kernel mode.然后交給內核來執行。如果這一系列操作都交給用戶來做
,這中間存在一個很大的問題。那就是user mode和kernel mode的切換,管理的問題。如果僅僅是的內核,問
題不大??墒乾F在的OS不僅都是多進程,而且大部分UNIX kernel 都是搶占式可重入的。這意味著當你從user?
mode 切換至kernel mode 正在執行 一個很重要的操作時,會突然被另一個應用程序打斷。此時進程同步就顯
得極為重要。?
比如,兩個進程A和B,A先進入內核,需要向軟盤寫入一個500k的文件。讀取軟盤A的剩余空間,800k,夠了
,但此時被掛起。B進程進入,寫入一個400k的文件,然后退出。然后A繼續執行。然后。。。?
更常見的是,A先讀取某資源V的數量,數量為1。然后B進入,占用此資源并將V-1,然后B被掛起,A繼續進
行,A又將V-1,V成了-1…?
最理想的方式是,將諸如此類的操作設為atomic operation.中間不允許打斷。但是很多時候這樣是不可能
的,而且就算可能,性能會打很大的折扣。?
于是對于長時期的操作,采取lock,semaphore,Signal等來同步或控制,短操作,就設定一個critical?
region.一旦進入critical region的process是不可被中斷的。?
Kernel mode 下的這些同步與控制非常復雜,為了系統安全,大部分程序都是運行在user mode 下,然后
由kernel 提供一個interface,交給用戶來調用。Unix下這些interface都是well documented,比如很出名的
read(),write().但是windows下,如上文所提到,ntdll.dll中提供有 NtCreateFile, NtOpenFile, NtClose三
個重要的函數,MSDN中對其僅有少許的說明。?
這其實是與NT的架構相關的。NT的kernel,可以算是一個modified microkernel.“Instead of supporting?
one basic operating system API, NT implements several”。Windows NT 利用其特有的Environment?
subsystems方式很有效的實現了這一點。整個Environment subsystems由CSRSS.EXE控制。(CSRSS.EXE這個進程
你可以在tasklist中看見。你可以用windows sdk中的debug tools在kernel debug mode下debug它,然后選
stop,它就會被強行中止掉。^_^).windows core apis被分在一個個的獨立的dll中來實現
(kernel.dll,usr32.dll,gdi32.dll…)。然后這些dll交給 CSRSS.EXE來調度以給用戶提供所需的接口。當用戶
發出調用請求的時候,首先由CSRSS.EXE找到該dll,然后dll對于其請求的處理,會執 行以下的一個或多個步驟
。?
1。立即返回。?
2。向windows server發送一條消息,請求幫助 。?
3。調用native api 去執行該請求。?
首先,對于第一種情況,當且僅當該dll本身就可以完成該請求,比如執行GetCurrentProcess().?
對于第二種情況,也很少需要。僅僅是必須要windows server參與的時候,才會如此。比如
CreateProcess()。該dll本身是無法完成的。?
第三種情況也就算最常見的了。?
通常是先由用戶調用kernel.dll(or gdi32.dll,user.dll,etc),然后由之調用ntdll.dll,然后ntdll.dll調
用kernel mode 的KiSystemService,由之來完成具體操作。
========
總結
以上是生活随笔為你收集整理的ntdll.dll学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能输入器
- 下一篇: Oracle用户管理学习总结