|
|
Hidden Registry Detection |
|
|
|
|
|
|
|
|
|
|
|
|
|
Registry is the large database where Windows stores all the
system, security and software specific settings. It is a tree like
structure, which can be viewed or modified using the standard
windows utilities such as Regedit.exe (start->run->
regedit) .
|
|
In addition to all system settings, Registry also contains
various startup entries for processes and services that are
automatically started
when Windows starts. For example, all Windows services are stored
under the following Registry key,
|
|
'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services'. |
|
Similarly some of the startup process entries can be found in the following
Registry locations, |
|
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\explorer\Run |
|
|
|
|
Rootkits generally modifies these entry points to start their own
processes, services or drivers. So it's important for the Rootkit to
hide these registry entries to prevent its detection from various
system-monitoring tools such as Autoruns, HijackThis, etc. |
|
Rootkits use various methods to hide their registry infiltration.
One of the most commonly used techniques is hooking the registry API
functions such as RegOpenKey, RegEnumKey, RegEnumValue etc. All of these
top level API functions in turn will call low level NT functions such as
NTOpenKey, NtEnumerateKey and NtEnumerateValueKey etc. So in order
to be more effective, Rootkits typically hook NT version of these
functions.
As a result whenever any application calls
these registry functions, Hooked Rootkit function will return the filtered
results there by hiding its presence. |
|
|
|
|
Most common detection mechanism used in these cases is the cross-view
comparison method. In this method initially, high level registry API
functions (such as RegEnumKey, RegEnumValue) are used to enumerate the
keys and values. Next some of the advanced techniques are used to enumerate
the same
registry keys. Then the both results are compared to find out the
hidden Rootkit entries.
Many such lower level techniques are present to detect hidden registry
keys. Here we will discuss about two such prominent methods in detail.
|
|
|
|
|
As mentioned previously, Rootkits hide their registry entries by
hooking the lower level NT functions. In order to effectively detect
these entries, one can directly invoke those NT functions rather than
using API functions. Every NT function in Windows is uniquely identified
through its service number (For NtEnumerateKey its 0x47). So instead of
calling these NT functions, one can directly call these functions by
using INT 2E (for Windows 2K) or Sysenter (Windows XP onwards)
instruction by passing the respective service number.
Here is the direct implementation of NtEnumerateKey and
NtEnumerateValueKey function, which can be directly called to bypass any
API level hooks put by the Rootkits.
|
|
//For Windows XP, for other platforms only service number will differ
_declspec(naked)
NTSTATUS __stdcall DirectNtEnumerateKey(
IN HANDLE KeyHandle,
IN ULONG Index,
IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG KeyInformationLength,
OUT PULONG ResultLength )
{
__asm
{
mov eax, 0x47
call DirectCall_XP
ret 0x18
DirectCall_XP:
mov edx, esp
sysenter
}
}
//For Windows XP, for other platforms only service number will differ
_declspec(naked)
NTSTATUS __stdcall DirectNtEnumerateValueKey(
IN HANDLE KeyHandle,
IN ULONG Index,
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG KeyValueInformationLength,
OUT PULONG ResultLength )
{
__asm
{
mov eax, 0x49
call DirectCall_XP
ret 0x18
DirectCall_XP:
mov edx, esp
sysenter
}
}
|
|
|
Rootkits may also hook the NtOpenKey function to prevent any hidden
key from being opened. So it will become useless even if one is able to
discover the key name. In such case, one can use direct NtOpenKey
function as shown below...
|
|
//Note that this code is written for Windows XP. For other platforms
only service number will differ
_declspec(naked)
NTSTATUS __stdcall DirectNtOpenKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes )
{
__asm
{
mov eax, 0x77
call DirectCall_XP
ret 0x0C
DirectCall_XP:
mov edx, esp
sysenter
}
}
|
|
Though Rootkits can bypass this technique by hooking the
above-mentioned NT functions in the kernel, it presents simple but very
effective mechanism to detect any hidden Rootkit registry entries in
user land. |
|
|
|
|
Windows stores the entire registry contents into the different files called Hives
in a standard format. A different portion of registry is stored in
respective hive files such as SYSTEM, SOFTWARE,
SECURITY, SAM, etc. in
the 'C:\Windows\System32\Config' folder.
Here is the table showing the mapping between the registry section and
corresponding registry hive file.
|
|
HKEY_CURRENT_USER |
NTuser.dat |
HKEY_LOCAL_MACHINE\SAM |
SAM |
HKEY_LOCAL_MACHINE\SECURITY |
SECURITY |
HKEY_LOCAL_MACHINE\SOFTWARE |
SOFTWARE |
HKEY_LOCAL_MACHINE\SYSTEM |
SYSTEM |
HKEY_USERS\DEFAULT |
DEFAULT |
|
|
|
|
Though the internal format of
these registry hive file is undocumented, lot of code samples and good
amount of documentation can be found on the net. These hive files are
generally locked while Windows is running and hence remains
inaccessible. However if you like to understand internal storage
structure of these hive files, you can use the API function such as
RegSaveKey (or equivalent
NT function NtSaveKey) to save any registry section to
the chosen file. Then you can manually traverse through this hive file
to decipher the low level of registry entries.
Detailed code sample to traverse the hive file can
be found in the article [1] 'How to avoid the detection of hidden
regkey by hooking RegSaveKeyA' written by EiNSTeiN_. Also the whitepaper
[2] 'Detection of Rootkits in Windows registry'
by miel-labs
explains in detail the complete structure of registry hive file.
In this detection method, all registry entries are retrieved by
traversing through these hive files. Then this list is compared against the high level
list obtained through normal registry
API functions such as RegEnumKey, RegEnumValue etc. At the end any
additional entries discovered will be marked as Hidden Rootkit registry
entries.
Though this method involves using undocumented registry hive
traversal method, it is very effective method in detecting the registry
entries hidden through even the Kernel level hooks (such as SSDT hooks).
|
|
|
|
|
This article shows why Rootkits hide their registry entries
and some of the methods which can be used to detect such hidden entries
to reveal the traces of Rootkits. Though some of these techniques can be
bypassed by
Rootkits operating in Kernel land, these methods present very simple and powerful methods to
detect any registry entries hidden by userland Rootkits. |
|
|
|
|
1.
How to avoid the detection of hidden regkey by hooking RegSaveKeyA
2.
Detection of Rootkits in Windows registry 3.
How to become unseen on Windows NT by HxDef |
|
|
|
|
|
|
|
|
|
|
|
|
|
|