成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

《Undocumented Windows 2000 Secrets》翻譯 --- 第五章(1)

瀏覽:181日期:2023-08-27 09:41:52

第五章 監(jiān)控Native API調(diào)用

翻譯:Kendiv( fcczj@263.net )

更新:Tuesday, February 22, 2005

聲明:轉(zhuǎn)載請注明出處,并保證文章的完整性,本人保留譯文的所有權利。

攔截系統(tǒng)調(diào)用在任何時候都是程序員們的最愛。這種大眾化愛好的動機也是多種多樣的:代碼性能測試(Code Profiling)和優(yōu)化,逆向工程,用戶活動記錄等等。所有這些都有一個共同的目的:將控制傳遞給一塊特殊的代碼,這樣無論一個應用程序何時調(diào)用系統(tǒng)服務,都可以發(fā)現(xiàn)哪個服務被調(diào)用了,接收了什么參數(shù),返回的結果是什么以及執(zhí)行它花費了多少時間。根據(jù)最初由Mark Russinovich和Bryce Cogswell提出的技巧,本章將介紹一個可以hook任意Native API函數(shù)的通用框架。這里使用的方法完全是數(shù)據(jù)驅(qū)動(data-driven)的,因此,它可以很容易被擴展,并能適應其他Windows NT/2000版本。所有進程的API調(diào)用產(chǎn)生的數(shù)據(jù)都被寫入一個環(huán)狀緩沖區(qū)中,客戶端程序可以通過設備I/O控制來讀取該緩沖區(qū)。采用的數(shù)據(jù)協(xié)議(protocol data)的格式是以行為導向的ANSI文本流,它符合嚴格的格式化規(guī)則,應用程序可以很容易的再次處理它們(postprocessing)。為了示范此種客戶端程序的基本框架,本章還提供了一個示例性的數(shù)據(jù)協(xié)議察看器,該程序運行于控制臺窗口中。

譯注:

profiling 一般是指對程序做性能方面的測試, 主要是速度上的。 在翻譯時,可譯為:剖析,最好是根據(jù)上文環(huán)境進行翻譯。

修改服務描述符表

對比“原始”的操作系統(tǒng),如Dos或Windows 3.x,它們對程序員在API中加入hook的限制很少,而Win32系統(tǒng),如Windows 2000/NT和Windows 9.x則很難駕馭,因為它們使用了巧妙的保護機制把不相關的代碼分離出來。在Win32 API上設置一個系統(tǒng)范圍的hook絕不是一個小任務。幸運的是,我們有像Matt PIEtrek和Jeffery Richter這樣的Win32向?qū)В麄冏隽舜罅康墓ぷ鱽硐蛭覀冋故救绾瓮瓿蛇@一任務,盡管事實上,并沒有簡單和優(yōu)雅的解決方案。在1997年,Russinovich和Cogswell介紹了一種可在Windows NT上實現(xiàn)系統(tǒng)范圍hook的完全不同的方法,可在更低一層上攔截系統(tǒng)調(diào)用(Russinovich和Cogswell 1997)。他們提議向Native API Dispatcher中注入日志機制,這僅比用戶模式和內(nèi)核模式之間的邊界低一些,在這個位置上Windows NT暴露出一個“瓶頸”:所有用戶模式的線程必須通過此處,才能使用操作系統(tǒng)內(nèi)核提供的服務。

服務和參數(shù)表

就像在第二章討論過的,發(fā)生在用戶模式下的Native API調(diào)用必須通過INT 2eh接口,該接口提供一個i386的中斷門來改變特權級別。你可能還記得所有INT 2eh調(diào)用都是由內(nèi)部函數(shù)KiSystemService()在內(nèi)核模式下處理的,該函數(shù)使用系統(tǒng)服務描述符表(SDT)來查找Native API處理例程的入口地址。圖5-1給出了這種分派機制的基本組件之間的相互關系。列表5-1再次給出了SERVICE_DESCRIPTOR_TABLE結構及其子結構的正式定義,在第二章中,已經(jīng)給出過它們的定義(列表2-1)。

調(diào)用KiSystemService()時,需提供兩個參數(shù),由INT 2eh的調(diào)用者通過EAX和EDX寄存器傳入。EAX包含從0開始的索引,該索引可用于一個API函數(shù)指針的數(shù)組,EDX指向調(diào)用者的參數(shù)堆棧。KiSystemService()通過讀取ServiceTable的一個成員的值(該成員是ntoskrnl.exe的一個公開數(shù)據(jù)結構:KeServiceDescriptorTable,圖5-1的左面列出了該結構)來獲取函數(shù)數(shù)組的基地址。實際上,KeServiceDescriptorTable指向一個包含四個服務表的結構,但默認情況下,僅有第一個服務表是有效的。KiSystemService()通過EAX中的索引值進入內(nèi)部結構KiServiceTable,以查找可處理此API調(diào)用的函數(shù)的入口地址。在調(diào)用目標函數(shù)之前,KiSystemServie()以相同的方式查詢KiArgumentTable結構,以找出調(diào)用者在參數(shù)堆棧中傳入了多少字節(jié),然后使用這個值將參數(shù)復制到當前內(nèi)核堆棧中。此后,就只需要一個簡單的匯編指令:CALL來執(zhí)行API處理例程了。這里涉及的所有函數(shù)都符合__stdcall標準。

圖5-1. KeServiceDescriptorTable的結構圖

typedef NTSTATUS (NTAPI*NTPROC)();

typedef NTPROC* PNTPROC;

#define NTPROC_ sizeof(NTPROC)

typedef struct _SYSTEM_SERVICE_TABLE

{

PNTPROC ;ServiceTable;// array of entry points

PDOWRD; CounterTable;// array of usage counters

DWordServiceLimit;;// number of table entries

PBYTE; ;;ArgumentTable; ;// array of byte counts

}

SYSTEM_SERVICE_TABLE,

*PSYSTEM_SERVICE_TABLE,

**PPSYSTEM_SERVICE_TABLE;

//-----------------------------------------------------------------------------------------------------------

typedef struct _SERVICE_DESCRIPTOR_TABLE

{

SYSTEM_SERVICE_TABLE ntoskrnl// ntoskrnl.exe ( native api )

SYSTEM_SERVICE_TABLE win32k;;// win32k.sys (gdi/user support)

SYSTEM_SERVICE_TABLE Table3;;// not used

SYSTEM_SERVICE_TABLE Table4;;// not used

}

SYSTEM_DESCRIPTOR_TABLE,

*PSYSTEM_DESCRIPTOR_TABLE,

**PPSYSTEM_DESCRIPTOR_TABLE;

列表5-1. SERVICE_DESCRIPTOR_TABLE結構的定義

Windows 2000還提供了另一個服務描述符表參數(shù)塊----KeServiceDescriptorTableShadow。不過,KeServiceDescriptorTable已經(jīng)由ntoskrnl.exe公開的導出了,因此,內(nèi)核模式的驅(qū)動程序可以很容易的訪問它,而KeServiceDescriptorTableShadow則不行。在Windows 2000下,KeServiceDescriptorTableShadow緊隨KeServiceDescriptorTable之后,但是你不能在Windows NT中以這樣的方法找到它,因為,這一規(guī)則并不使用于Windows NT。可能在Windows 2000的后續(xù)版本的中,這種方法也不行。這兩個參數(shù)塊的不同之處在于:KeServiceDescriptorTableShadow中的第二個項被系統(tǒng)使用了,用來指向內(nèi)部的W32pServiceTable和w32pArgumentTable結構,Win32的內(nèi)核模式組件Win32K.sys使用這兩個結構來分派自己的API調(diào)用,如圖5-2所示。KiSystemService()通過檢查EAX中索引值的第12和13位來確認是不是應該由Win32K.sys處理API調(diào)用。如果這兩個位都是0,則是由ntoskrnl.exe處理的Native API調(diào)用,因此KiSystemService()使用第一個SDT。如果第12位為1并且第13位為0,KiSystemService()使用第二個SDT,這個SDT并沒有被當前系統(tǒng)使用。這意味著Native API調(diào)用的索引值的潛在范圍是:0x0000 --- 0x0FFFF,Win32K.sys調(diào)用使用的索引范圍是:0x1000 --- 0x1FFF。因此,0x2000 --- 0x2FFF和0x3000 --- 0x3FFF保留給剩下的兩個SDT。在Windows 2000中,Native API服務表包含248個項,Win32K.sys表包含639個項。

圖5-2. KeServiceDescriptorTableShadow的結構圖

Russinovich和Cogswell的獨具特色的方法是:通過簡單的向KiServiceTable數(shù)組中放入一個不同的處理例程來hook所有API調(diào)用。這個處理例程最終會調(diào)用位于ntoskrnl.exe中的原始處理例程,但它有機會察看一下被調(diào)用函數(shù)的輸入/輸出參數(shù)。這個方法非常強大卻又如此簡單。因為所有用戶模式的線程必須經(jīng)過這個“針眼”才能獲得Native API的服務,安裝一個全局hook來簡單的替換一個函數(shù)指針的方法,在啟動一個新的進程和線程的情況下,也能很穩(wěn)定的工作。這并不需要一種通訊機制來通知新加入或?qū)⒁瞥倪M程/線程。

不幸的是,系統(tǒng)服務表在不同Windows NT版本上不相同。表5-1比較了Windows NT/2000的KiServiceTable。很顯然,不僅是處理例程的號碼從211增加到了248,而且新的處理例程并不是直接添加到列表的末尾,而是被插入到了各個地方!因此,一個服務函數(shù)索引,如0x20在Windows 2000中指向NtCreateFile(),而在Windows NT中卻指向NtCreateProfile()。所以,通過操作服務函數(shù)表進行hook的API調(diào)用監(jiān)控器必須小心的檢查它所在的Windows NT的版本。這可以通過如下幾個方式來完成:

l 一種可能性是,檢查由ntoskrnl.exe導出的公開變量:NtBuildNumber,就像Russinovich和Cogswell在他們的原文中所作的那樣。Windows NT 4.0為所有Service Pack提供的Build Number是:1381。Windows 2000的當前Build Number是:2195。看來有希望,這個版本號在Windows NT的早期版本中很穩(wěn)定。

l 另一個可能性是,檢查SharedUserData結構中的NtMajorVersion和NtMinorVersion成員,該結構定義與Windows 2000頭文件ntddk.h中。Windows NT 4.0的所有Service Pack都將SharedUserData->NtMajorVersion設為4,將SharedUserData->NtMinorVersion設為0。Windows 2000的當前版本為Windows NT Version 5.0。

l 本章給出的代碼采用了另一中替代方法:它測試SDT的ServiceLimit成員是否和它的預期值相匹配,該預期值是211(0xD3)針對Windows NT 4.0和248(0xF8)針對Windows 2000。

表5-1. Windows 2000/NT 服務表對比

Windows 2000

索引

Windows NT 4.0

NtAcceptConnectPort

0x00

NtAcceptConnectPort

NtAccessCheck

0x01

NtAccessCheck

NtAccessCheckAndAuditAlarm

0x02

NtAccessCheckAndAuditAlarm

NtAccessCheckByType

0x03

NtAddAtom

NtAccessCheckByTypeAndAuditAlarm

0x04

NtAdjustGroupsToken

NtAccessCheckByTypeResultList

0x05

NtAdjustPrivilegesToken

NtAccessCheckByTypeResultListAndAuditAlarm

0x06

NtAlertResumeThread

NtAccessCheckByTypeResultListAndAuditAlarmByHandle

0x07

NtAlertThread

NtAddAtom

0x08

NtAllocateLocallyUniqueld

NtAdjustGroupsToken

0x09

NtAllocateUuids

NtAdjustPrivilegesToken

0x0A

NtAllocateVirtualMemory

NtAlertResumeThread

0x0B

NtCallbackReturn

NtAlertThread

0x0C

NtCancelloFile

NtAllocateLocallyUniqueld

0x0D

NtCancelTimer

NtAllocateUserPhysicalPages

0x0E

NtClearEvent

NtAllocateUuids

0x0F

NtClose

NtAllocateVirtualMemory

0x10

NtCloseObjectAuditAlarm

NtAreMappedFilesTheSame

0x11

NtCompleteConnectPort

NtAssignProcessToJobObject

0x12

NtConnectPort

NtCallbackReturn

0x13

NtContinue

NtCancelloFile

0x14

NtCreateDirectoryObject

NtCancelTi mer

0x15

NtCreateEvent

NtCancelDeviceWakeupRequest

0x16

NtCreateEventPair

NtClearEvent

0x17

NtCreateFile

NtClose

0x18

NtCreateloCompletion

NtCloseObjectAuditAlarm

0x19

NtCreateKey

NtCompleteConnectPort

0x1A

NtCreateMailslotFile

NtConnectPort

0x1B

NtCreateMutant

NtContinue

0x1C

NtCreateNamedPipeFile

NtCreateDirectoryObject

0x1D

NtCreatePagingFile

NtCreateEvent

0x1E

NtCreatePort

NtCreateEventPair

0x1F

NtCreateProcess

NtCreateFile

0x20

NtCreateProfile

NtCreateloCompletion

0x21

NtCreateSection

NtCreateJobObject

0x22

NtCreateSemaphore

NtCreateKey

0x23

NtCreateSymbolicLinkObject

NtCreateMailslotFile

0x24

NtCreateThread

NtCreateMutant

0x25

NtCreateTimer

NtCreateNamedPipeFile

0x26

NtCreateToken

NtCreatePagingFile

0x27

NtDelayExecution

NtCreatePort

0x28

NtDeleteAtom

NtCreateProcess

0x29

NtDeleteFile

NtCreateProfile

0x2A

NtDeleteKey

NtCreateSection

0x2B

NtDeleteObjectAuditAlarm

NtCreateSemaphore

0x2C

NtDeleteValueKey

NtCreateSymbolicLinkObject

0x2D

NtDeviceloControlFile

NtCreateThread

0x2E

NtDisplayString

NtCreateTimer

0x2F

NtDuplicateObject

NtCreateToken

0x30

NtDuplicateToken

NtCreateWaitablePort

0x31

NtEnumerateKey

NtDelayExecution

0x32

NtEnumerateValueKey

NtDeleteAtom

0x33

NtExtendSection

NtDeleteFile

0x34

NtFindAtom

NtDeleteKey

0x35

NtFlushBuffersFile

NtDeleteObj ectAuditAlarm

0x36

NtFlushlnstructionCache

NtDeleteValueKey

0x37

NtFlushKey

NtDeviceloControlFile

0x38

NtFlushVirtualMemory

NtDisplayString

0x39

NtFlushWriteBuffer

NtDuplicateObject

0x3A

NtFreeVirtualMemory

NtDuplicateToken

0x3B

NtFsControlFile

NtEnumerateKey

0x3C

NtGetContextThread

NtEnumerateValueKey

0x3D

NtGetPlugPlayEvent

NtExtendSection

0x3E

NtGetTickCount

NtFilterToken

0x3F

NtlmpersonateClientOfPort

NtFindAtom

0x40

NtlmpersonateThread

NtFlushBuffersFile

0x41

NtlnitializeRegistry

NtFlushlnstructionCache

0x42

NtListenPort

NtFlushKey

0x43

NtLoadDriver

NtFlushVirtualMemory

0x44

NtLoadKey

NtFlushWriteBuffer

0x45

NtLoadKey2

NtFreeUserPhysicalPages

0x46

NtLockFile

NtFreeVirtualMemory

0x47

NtLockVirtualMemory

NtFsControlFile

0x48

NtMakeTemporaryObject

NtGetContextThread

0x49

NtMapViewOfSection

NtGetDevicePowerState

0x4A

NtNotifyChangeDirectoryFile

NtGetPlugPlayEvent

0x4B

NtNotifyChangeKey

NtGetTickCount

0x4C

NtOpenDirectoryObject

NtGetWriteWatch

0x4D

NtOpenEvent

NtlmpersonateAnonymousToken

0x4E

NtOpenEventPair

NtlmpersonateClientOfPort

0x4F

NtOpenFile

NtlmpersonateThread

0x50

NtOpenloCompletion

NtlnitializeRegistry

0x51

NtOpenKey

NtlnitiatePowerAction

0x52

NtOpenMutant

NtlsSystemResumeAutomatic

0x53

NtOpenObjectAuditAlarm

NtListenPort

0x54

NtOpenProcess

NtLoadDriver

0x55

NtOpenProcessToken

NtLoadKey

0x56

NtOpenSection

NtLoadKey2

0x57

NtOpenSemaphore

NtLockFile

0x58

NtOpenSymbolicLinkObject

NtLockVirtualMemory

0x59

NtOpenThread

NtMakeTemporaryObject

0x5A

NtOpenThreadToken

NtMapUserPhysicalPages

0x5B

NtOpenTimer

NtMapUserPhysicalPagesScatter

0x5C

NtPlugPlayControl

NtMapViewOfSection

0x5D

NtPrivilegeCheck

NtNotifyChangeDirectoryFile

0x5E

NtPrivilegedServiceAuditAlarm

NtNotifyChangeKey

0x5F

NtPrivilegeObjectAuditAlarm

NtNotifyChangeMultipleKeys

0x60

NtProtectVirtualMemory

NtOpenDirectoryObject

0x61

NtPulseEvent

NtOpenEvent

0x62

NtQuerylnformationAtom

NtOpenEventPair

0x63

NtQueryAttributesFile

NtOpenFile

0x64

NtQueryDefaultLocale

NtOpenloCompletion

0x65

NtQueryDirectoryFile

NtOpenJobObject

0x66

NtQueryDirectoryObject

NtOpenKey

0x67

NtQueryEaFile

NtOpenMutant

0x68

NtQueryEvent

NtOpenObjectAuditAlarm

0x69

NtQueryFullAttributesFile

NtOpenProcess

0x6A

NtQuerylnformationFile

NtOpenProcessToken

0x6B

NtQueryloCompletion

NtOpenSection

0x6C

NtQuerylnformationPort

NtOpenSemaphore

0x6D

NtQuerylnformationProcess

NtOpenSymbolicLinkObject

0x6E

NtQuerylnformationThread

NtOpenThread

0x6F

NtQuerylnformationToken

NtOpenThreadToken

0x70

NtQuerylntervalProfile

NtOpenTimer

0x71

NtQueryKey

NtPlugPlayControl

0x72

NtQueryMultipleValueKey

NtPowerlnformation

0x73

NtQueryMutant

NtPrivilegeCheck

0x74

NtQueryObject

NtPrivilegedServiceAuditAlarm

0x75

NtQueryOleDirectoryFile

NtPrivilegeObjectAuditAlarm

0x76

NtQueryPerformanceCounter

NtProtectVirtualMemory

0x77

NtQuerySection

NtPulseEvent

0x78

NtQuerySecurityObject

NtQuerylnformationAtom

0x79

NtQuery Semaphore

NtQueryAttributesFile

0x7A

NtQuerySymbolicLinkObject

NtQueryDefaultLocale

0x7B

NtQuerySystemEnvironmentValue

NtQueryDefaultUILanguage

0x7C

NtQuerySystemlnformation

NtQueryDirectoryFile

0x7D

NtQuerySystemTime

NtQueryDirectoryObject

0x7E

NtQuery Timer

NtQueryEaFile

0x7F

NtQueryTimerResolution

NtQueryEvent

0x80

NtQuery ValueKey

NtQueryFullAttributesFile

0x81

NtQuery VirtualMemory

NtQuerylnformationFile

0x82

NtQuery VolumelnformationFile

NtQuerylnformationJobObject

0x83

NtQueueApcThread

NtQueryloCompletion

0x84

NtRaiseException

NtQuerylnformationPort

0x85

NtRaiseHardError

NtQuerylnformationProcess

0x86

NtReadFile

NtQuerylnformationThread

0x87

NtReadFileScatter

NtQuerylnformationToken

0x88

NtReadRequestData

NtQuerylnstallUILanguage

0x89

NtReadVirtualMemory

NtQuerylntervalProfile

0x8A

NtRegisterThreadTerminatePort

NtQueryKey

0x8B

NtReleaseMutant

NtQueryMultiple ValueKey

0x8C

NtReleaseSemaphore

NtQueryMutant

0x8D

NtRemoveloCompletion

NtQueryObject

0x8E

NtReplaceKey

NtQueryOpenSubKeys

0x8F

NtReplyPort

NtQueryPerformanceCounter

0x90

NtReplyWaitReceivePort

NtQueryQuotalnformationFile

0x91

NtReplyWaitReplyPort

NtQuerySection

0x92

NtRequestPort

NtQuerySecurityObject

0x93

NtRequestWaitReplyPort

NtQuerySemaphore

0x94

NtResetEvent

NtQuerySymbolicLinkObject

0x95

NtRestoreKey

NtQuerySystemEnvironmentValue

0x96

NtResumeThread

NtQuerySystemlnformation

0x97

NtSaveKey

NtQuerySystemTime

0x98

NtSetloCompletion

NtQueryTimer

0x99

NtSetContextThread

NtQueryTimerResolution

0x9A

NtSetDefaultHardErrorPort

NtQueryValueKey

0x9B

NtSetDefaultLocale

NtQueryVirtualMemory

0x9C

NtSetEaFile

NtQueryVolumelnformationFile

0x9D

NtSetEvent

NtQueueApcThread

0x9E

NtSetHighEventPair

NtRaiseException

0x9F

NtSetHighWaitLowEventPair

NtRaiseHardError

0xA0

NtSetHighWaitLowThread

NtReadFile

0xA1

NtSetlnformationFile

NtReadFileScatter

0xA2

NtSetlnformationKey

NtReadRequestData

0xA3

NtSetlnformationObject

NtReadVirtualMemory

0xA4

NtSetlnformationProcess

NtRegisterThreadTerminatePort

0xA5

NtSetlnformationThread

NtReleaseMutant

0xA6

NtSetlnformationToken

NtReleaseSemaphore

0xA7

NtSetlntervalProfile

NtRemoveloCompletion

0xA8

NtSetLdtEntries

NtReplaceKey

0xA9

NtSetLowEventPair

NtReplyPort

0xAA

NtSetLowWaitHighEventPair

NtReplyWaitReceivePort

0xAB

NtSetLowWaitHighThread

NtReplyWaitReceivePortEx

0xAC

NtSetSecurity Object

NtReplyWaitRepiyPort

0xAD

NtSetSystemEnvironmentValue

NtRequestDeviceWakeup

0xAE

NtSetSystemlnformation

NtRequestPort

0xAF

NtSetSystemPowerState

NtRequestWaitReplyPort

0xB0

NtSetSystemTime

NtRequestWakeupLatency

0xB1

NtSetTimer

NtResetEvent

0xB2

NtSetTimerResolution

NtResetWriteWatch

0xB3

NtSetValueKey

NtRestoreKey

0xB4

NtSetVolumelnformationFile

NtResumeThread

0xB5

NtShutdownSystem

NtSaveKey

0xB6

NtSignalAndWaitForSingleObject

NtSaveMergedKeys

0xB7

NtStartProfile

NtSecureConnectPort

0xB8

NtStopProfile

NtSetloCompletion

0xB9

NtSuspendThread

NtSetContextThread

0xBA

NtSystemDebugControl

NtSetDefaultHardErrorPort

0xBB

NtTerminateProcess

NtSetDefaultLocale

0xBC

NtTerminateThread

NtSetDefaultUILanguage

0xBD

NtTestAlert

NtSetEaFile

0xBE

NtUnloadDriver

NtSetEvent

0xBF

NtUnloadKey

NtSetHighEventPair

0xC0

NtUnlockFile

NtSetHighWaitLowEventPair

0xC1

NtUnlockVirtualMemory

NtSetlnformationFile

0xC2

NtUnmapViewOfSection

NtSetlnformationJobObject

0xC3

NtVdmControl

NtSetlnformationKey

0xC4

NtWaitForMultipleObjects

NtSetlnformationObject

0xC5

NtWaitForSingleObject

NtSetlnformationProcess

0xC6

NtWaitHighEventPair

NtSetlnformationThread

0xC7

NtWaitLowEventPair

NtSetlnformationToken

0xC8

NtWriteFile

NtSetlntervalProfile

0xC9

NtWriteFileGather

NtSetLdtEntries

0xCA

NtWriteRequestData

NtSetLowEventPair

0xCB

NtWriteVirtualMemory

NtSetLowWaitHighEventPair

0xCC

NtCreateChannel

NtSetQuotalnformationFile

0xCD

NtListenChannel

NtSetSecurity O b j ect

0xCE

NtOpenChannel

NtSetSystemEnvironment Value

0xCF

NtReplyWaitSendChannel

NtSetSystemlnformation

0xD0

NtSendWaitReplyChannel

NtSetSystemPowerSrate

0xD1

NtSetContextChannel

NtSetSystemTime

0xD2

NtYieldExecution

NtSetThreadExecutionState

0xD3

N/A

NtSetTimer

0xD4

N/A

NtSetTimerResolution

0xD5

N/A

NtSetUuidSeed

0xD6

N/A

NtSetValueKey

0xD7

N/A

NtSetVolumelnformationFile

0xD8

N/A

NtShutdownSystem

0xD9

N/A

NtSignalAndWaitForSingleObject

0xDA

N/A

NtStartProfile

0xDB

N/A

NtStopProfile

0xDC

N/A

NtSuspendThread

0xDD

N/A

NtSystemDebugControl

0xDE

N/A

NtTerminateJobObject

0xDF

N/A

NtTerminateProcess

0xE0

N/A

NtTerminateThread

0xE1

N/A

NtTestAlert

0xE2

N/A

NtUnloadDriver

0xE3

N/A

NtUnloadKey

0xE4

N/A

NtUnlockFile

0xE5

N/A

NtUnlockVirtualMemory

0xE6

N/A

NtUnmapViewOfSection

0xE7

N/A

NtVdmControl

0xE8

N/A

NtWaitForMultipleObjects

0xE9

N/A

NtWaitForSingleObject

0xEA

N/A

NtWaitHighEventPair

0xEB

N/A

NtWaitLowEventPair

0xEC

N/A

NtWriteFile

0xED

N/A

NtWriteFileGather

0xEE

N/A

NtWriteRequestData

0xEF

N/A

NtWriteVirtualMemory

0xF0

N/A

NtCreateChannel

0xF1

N/A

NtListenChannel

0xF2

N/A

NtOpenChannel

0xF3

N/A

NtReplyWaitSendChannel

0xF4

N/A

NtSendWaitReplyChannel

0xF5

N/A

NtSetContextChannel

0xF6

N/A

NtYieldExecution

0xF7

N/A

Russinoich和Cogewell采用的最重要的一步是:編寫一個內(nèi)核模式的設備驅(qū)動程序來安裝和維護Native API Hook。因為,用戶模式下的模塊沒有修改系統(tǒng)服務描述符表的權限。就像第四章中的Spy驅(qū)動程序,這是一種多少有些特殊的驅(qū)動程序,因為它不處理通常的I/O請求。它只是導出一個簡單的設備I/O控制(IOCTL)接口,以讓用戶模式下的代碼訪問它收集到的數(shù)據(jù)。該驅(qū)動程序的主要任務是修改KiServiceTable、攔截并記錄所選的Windows 2000 Native API調(diào)用。盡管這種方法很簡單而且優(yōu)雅,它還是有些讓人擔心。它的簡單使我想起了在DOS時代,hook一個系統(tǒng)服務只需要簡單的修改處理器的中斷向量表中的指針。任何知道如何編寫基本的Windows 2000內(nèi)核驅(qū)動程序的人都可以hook任意的NT系統(tǒng)服務而不需要而外的努力。

Russinovich和Cogswell使用他們的技術開發(fā)了一個非常有用的Windows NT注冊表監(jiān)視器。當使用他們的技術來完成其他“間諜”任務時,我很快就變得煩躁起來,這是因為我需要為我要監(jiān)控的每個API函數(shù)都編寫一個獨立的hook API函數(shù)。為了避免編寫大量的代碼,我打算找出一種方法來強迫所有我感興趣的API函數(shù)進入同一個hook函數(shù)中。這個任務花費了我大量的時間,并給我展示了多種多樣的藍屏。不過,最終的結果是我得到了一個通用的解決方案,只需花費很少的努力,我就能hook不同的API函數(shù)集合。

成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲三级在线观看| 国产精品理论在线观看| 国产亚洲一区二区三区在线观看| 黄网站免费久久| 久久精彩视频| 亚洲激情五月婷婷| 国产精品对白刺激久久久| 日韩你懂的电影在线观看| 久久9热精品视频| 久久婷婷国产综合尤物精品| 一区二区三区四区av| 亚洲午夜精品一区二区| 日本一区二区三区免费乱视频| 国产**成人网毛片九色| 欧美日韩久久久久久| 日韩av网站免费在线| 国产亚洲精品久久飘花 | 18成人在线观看| 欧美性大战久久久久| 久久免费看少妇高潮| 白白色 亚洲乱淫| 精品久久久久久久久久久久包黑料| 国产一区二区免费在线| 欧美喷水一区二区| 久久99深爱久久99精品| 欧美日韩三级在线| 韩国欧美国产1区| 欧美日韩www| 国产精品香蕉一区二区三区| 欧美日韩国产三级| 韩国精品主播一区二区在线观看| 在线免费观看日本欧美| 麻豆视频一区二区| 欧美日韩国产色站一区二区三区| 激情国产一区二区| 91精品国产一区二区| 国产成人av一区二区三区在线观看| 日韩你懂的在线观看| 99re热这里只有精品视频| 国产日韩精品久久久| 欧美性色综合| 亚洲婷婷综合久久一本伊一区| 夜夜爽www精品| 五月激情综合色| 在线精品国精品国产尤物884a| 男男成人高潮片免费网站| 欧美日韩免费观看一区二区三区 | 欧美精品一卡| 亚洲欧美日韩国产手机在线| 久久aⅴ国产紧身牛仔裤| 日韩黄色一级片| 欧美日韩黄色一区二区| 成人午夜在线播放| 欧美激情资源网| 亚洲人久久久| 天天影视涩香欲综合网| 色综合激情五月| 国产九色精品成人porny| 日韩欧美视频在线| 欧美激情日韩| 亚洲一二三四在线| 欧美人妇做爰xxxⅹ性高电影| 顶级嫩模精品视频在线看| 国产欧美日韩中文久久| 亚洲免费不卡| 青青草精品视频| 日韩写真欧美这视频| 欧美成人一区二区在线| 日韩美女视频一区二区 | 在线视频你懂得一区| 国产精品亚洲专一区二区三区| 国产午夜精品久久久久久免费视 | 一区二区在线观看视频| 欧洲日韩一区二区三区| 成人综合在线视频| 国产精品五月天| 美日韩在线观看| 岛国精品在线播放| 亚洲免费在线播放| 欧美亚日韩国产aⅴ精品中极品| 成人av集中营| 亚洲日本丝袜连裤袜办公室| 在线观看日韩av先锋影音电影院| 成人一区二区三区视频| 最新欧美精品一区二区三区| 欧美专区日韩专区| 欧美一区二区三区久久精品| 亚洲无线码一区二区三区| 7777精品伊人久久久大香线蕉的| 色综合久久中文综合久久97| 亚洲国产一区二区视频| 欧美一二三四在线| 妖精视频成人观看www| 国产在线一区二区| 中文字幕日韩av资源站| 欧美性猛片aaaaaaa做受| 91在线码无精品| 亚洲6080在线| www国产精品av| 久久中文在线| 91日韩精品一区| 天堂va蜜桃一区二区三区| 精品国产精品网麻豆系列| 中文一区二区| 成人午夜在线视频| 偷偷要91色婷婷| 久久久久久久国产精品影院| 免费日韩av| 欧美在线网址| 精品一区二区av| 综合色天天鬼久久鬼色| 欧美日韩mp4| 夜久久久久久| av电影天堂一区二区在线观看| 视频一区二区国产| 欧美国产在线观看| 欧美理论在线播放| 国产精品区一区| 91在线小视频| 久久99国产精品久久99果冻传媒| 成人免费一区二区三区在线观看| 7777精品久久久大香线蕉| av成人毛片| 99re在线精品| 黄色成人免费在线| 一区二区三区在线免费观看| 日韩美女天天操| 久久只有精品| 亚洲黄色成人| 91免费视频大全| 韩日欧美一区二区三区| 亚洲国产日韩一级| 亚洲国产精品激情在线观看| 欧美另类z0zxhd电影| 久久精品首页| 欧美午夜精品久久久久免费视| 国产成人在线免费| 日韩国产一二三区| 1区2区3区国产精品| 久久久欧美精品sm网站| 欧美片在线播放| 久久国产日本精品| 黄色免费成人| 91视频观看免费| 粉嫩在线一区二区三区视频| 日本欧美在线观看| 午夜久久久久久久久久一区二区| 中文字幕一区二区三区在线不卡 | 欧美精品乱码久久久久久按摩| 国产精品免费在线| 韩国在线一区| av资源网一区| 国产精品一区二区在线观看不卡 | 日韩av一级电影| 亚洲综合清纯丝袜自拍| 中文字幕二三区不卡| 久久综合色天天久久综合图片| 欧美精品v国产精品v日韩精品| 色中色一区二区| 免费亚洲一区二区| 国产欧美大片| 99亚洲伊人久久精品影院红桃| 欧美午夜不卡影院在线观看完整版免费| 国产精品一品二品| 久久99九九99精品| 免费观看在线综合色| 亚洲福利视频一区二区| 亚洲免费观看高清完整版在线| 日本一区二区高清| 久久免费看少妇高潮| 日韩一级高清毛片| 制服丝袜中文字幕一区| 欧美日本在线观看| 欧美日韩国产色站一区二区三区| 欧洲av在线精品| 色丁香久综合在线久综合在线观看| 国产伦精品一区| 国产精品一区二区在线观看| 亚洲网站在线| 国产一区美女| 国产主播一区| 国产精品magnet| 欧美精品一区在线| 国内精品一区二区| 国产一区二区三区无遮挡| 欧美精品色网| 黄色亚洲大片免费在线观看| 国产精品www994| 亚洲无毛电影| 一区二区三区精品国产| 亚洲色图自拍| 久久精品30| 在线国产电影不卡| 在线视频你懂得一区| 欧美亚洲动漫精品| 欧美理论在线播放| 欧美一区二区成人6969| 日韩美女在线视频| 久久先锋影音av鲁色资源网| 国产亚洲欧美日韩在线一区|