日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

6 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 四 )


#define SPY_MEMORY_DATA_VALUE(_b,_v)
((WORD) (((_b) & SPY_MEMORY_DATA_BYTE ) |
((_v) ? SPY_MEMORY_DATA_VALID : 0)))
列表 4-25. SPY_MEMORY_DATA 的定義
將置換出去的頁(yè)作為有效的地址范圍有一個(gè)很重要的好處:當(dāng) SpyMemoryReadBlock() 試圖讀取這些頁(yè)中的第一個(gè)字節(jié)時(shí),這些頁(yè)就會(huì)被很快的再次調(diào)入內(nèi)存中 。稍后給出的內(nèi)存 Dump 工具如果依賴(lài) MmIsAddressValid(),有時(shí)就會(huì)拒絕顯示指定地址范圍中的數(shù)據(jù)(即使 5 分鐘之前,它還可以顯示這些數(shù)據(jù)),而這僅僅是因?yàn)檫@些頁(yè)可能已被傳送到了頁(yè)面文件中 。
IOCTL 函數(shù) SPY_IO_MEMORY_BLOCK
SPY_IO_MEMORY_BLOCK 依賴(lài)于 SPY_IO_MEMORY_DATA,因?yàn)樗彩菑娜我獾刂窂?fù)制內(nèi)存塊到調(diào)用者的緩沖區(qū)中 。主要的區(qū)別是: SPY_IO_MEMORY_DATA 試圖復(fù)制所有可讀取的字節(jié),而對(duì)于 SPY_IO_MEMORY_BLOCK 來(lái)說(shuō),只要請(qǐng)求的范圍中包含無(wú)效地址它就會(huì)失敗,一個(gè)字節(jié)也不會(huì)復(fù)制 。第 6 章中需要這個(gè)函數(shù)來(lái)將位于內(nèi)核空間中的數(shù)據(jù)結(jié)構(gòu)傳遞給用戶模式下的程序 。這一要求顯然會(huì)大大限制這個(gè)函數(shù),所以若一個(gè)結(jié)構(gòu)體中包含無(wú)法讀取的字節(jié),就跳過(guò)它們,僅復(fù)制可讀取的字節(jié) 。
和 SPY_IO_MEMORY_DATA 類(lèi)似,SPY_IO_MEMORY_BLOCK 期望輸入一個(gè) SPY_MEMORY_BLOCK 結(jié)構(gòu)來(lái)指定要復(fù)制的內(nèi)存塊的基地址和大小 。返回的數(shù)據(jù),將是原始數(shù)據(jù)的 1:1 復(fù)制品 。輸出緩沖區(qū)必須足夠容納要復(fù)制的全部?jī)?nèi)容 。否則,將會(huì)報(bào)告一個(gè)錯(cuò)誤,并且不會(huì)返回任何數(shù)據(jù) 。
IOCTL 函數(shù) SPY_IO_HANDLE_INFO
和前面介紹的 SPY_IO_PHSICAL 類(lèi)似,這個(gè)函數(shù)允許用戶模式下的程序調(diào)用其他途經(jīng)無(wú)法調(diào)用的內(nèi)核模式 API。內(nèi)核驅(qū)動(dòng)程序可通過(guò) ntoskrnl.exe 導(dǎo)出的 obReferenceObjectByHandle() 來(lái)獲取由句柄描述的對(duì)象的指針 。而在 Win32 下沒(méi)有對(duì)等的函數(shù) 。不過(guò),應(yīng)用程序可以命令 Spy 設(shè)備執(zhí)行這一函數(shù),并返回對(duì)象的指針 。列表 4-26 展示了由 SpyDispatcher() 調(diào)用的 SpyOutputHandleInfo() 函數(shù) ??赏ㄟ^(guò) SpyInputHandle() 獲(定義于 列表 4-10 )取輸入的句柄 。
列表 4-26 頂部的 SPY_HANDLE_INFO 結(jié)構(gòu)包含與句柄相關(guān)的對(duì)象體的指針,以及該句柄的屬性,這兩個(gè)都會(huì)由 ObReferenceObjectByHandle() 返回 。特別重要的一點(diǎn)是:如果 ObReferenceObjectByHandle() 調(diào)用成功,就必須調(diào)用 ObDereferenceObject() 來(lái)將對(duì)象的引用計(jì)數(shù)器恢復(fù)到先前的值 。如果沒(méi)有這樣做,將會(huì)導(dǎo)致“對(duì)象引用漏洞” 。
typedef struct _SPY_HANDLE_INFO
{
PVOID pObjectBody;
DWORD dHandleAttributes;
}
SPY_HANDLE_INFO, *PSPY_HANDLE_INFO, **PPSPY_HANDLE_INFO;
#define SPY_HANDLE_INFO_ sizeof (SPY_HANDLE_INFO)
// -----------------------------------------------------------------
NTSTATUS SpyOutputHandleInfo (HANDLE hObject,
PVOID pOutput,
DWORD dOutput,
PDWORD pdInfo)
{
SPY_HANDLE_INFO shi;
OBJECT_HANDLE_INFORMATION ohi;
NTSTATUS ns = STATUS_INVALID_PARAMETER;
if (hObject != NULL)
{
ns = ObReferenceObjectByHandle (hObject,
STANDARD_RIGHTS_READ,
NULL, KernelMode,
&shi.pObjectBody, &ohi);
}
if (ns == STATUS_SUCCESS)
{
shi.dHandleAttributes = ohi.HandleAttributes;
ns = SpyOutputBinary (&shi, SPY_HANDLE_INFO_,
pOutput, dOutput, pdInfo);
ObDereferenceObject (shi.pObjectBody);
}
return ns;
}
列表 4-26. 通過(guò)句柄引用一個(gè)對(duì)象

推薦閱讀