By :浪子_三少
Window 7以及以上系统的ETW日志自带了一个注册表日志信息的输出,在windows事件查看器的Microsoft Windows Kernel Registry / Analytic可以看到并且开启或者关闭注册表日志,它的监控操作包括CreateKey_Opt、OpenKey_Opt、DeleteKey_Opt、QueryKey_Opt、SetValueKey_Opt、DeleteValueKey_Opt、QueryValueKey_Opt监控的输出数据包括根据每个不同的操作它的内容也不一样,例如
CreateKey_Opt
mName = 0x000001e0ca423d30 L"BaseObject": ulongptr
mName = 0x000001e0ca423d30 L"KeyObject" : ulongptr
mName = 0x000001e0ca423da8 L"Status" ULONG32
mName = 0x000001e0ca423e20 L"Disposition" ULONG32
mName = 0x000001e0ca423e98 L"BaseName" 2
mName = 0x000001e0ca423f10 L"RelativeName" 0x82
SetValueKey_Opt
mName = 0x0000025ea4054208 L"KeyObject" ulongptr
mName = 0x0000025ea4054280 L"Status" ULONG32
mName = 0x0000025ea40542f8 L"Type" ULONG32
mName = 0x0000025ea4054370 L"DataSize" ULONG32
mName = 0x0000025ea40543e8 L"KeyName" 2
mName = 0x0000025ea4054460 L"ValueName" char*
mName = 0x0000025ea40544d8 L"CapturedDataSize" 2
mName = 0x0000025ea4054550 L"CapturedData" 0
mName = 0x0000025ea40545c8 L"PreviousDataType" ULONG32
mName = 0x0000025ea4054640 L"PreviousDataSize" ULONG32
mName = 0x0000025ea40546b8 L"PreviousDataCapturedSize" 2
mName = 0x0000025ea4054730 L"PreviousData" 0
DeleteValueKey_Opt
mName = 0x000001f3275e5c28 L"KeyObject" ulongptr
mName = 0x0000025ea4054280 L"Status" ULONG32
mName = 0x0000025ea40543e8 L"KeyName" 2
mName = 0x000001f3275e5d90 L"ValueName"
DeleteKey_Opt
mName = 0x000001f3275e5c28 L"KeyObject" ulongptr
mName = 0x0000025ea4054280 L"Status" ULONG32
mName = 0x0000025ea40543e8 L"KeyName" 2
更多具体的数据,读者可以自行去研究我们今天讲解的不是他的具体使用方法,而是windows内核是怎么样实现输出这些数据的。
Windows的内核程序ntoskrnl.exe初始化的时候会启动和初始化很多信息,启动ETW组件就是启动一项内容,在void __fastcall EtwInitialize(unsigned int Phase)的函数里,最下面有几个调用了EtwRegister函数去注册一些Etw事件,如下
我们可以看到EventTracingProvGuid、KernelProvGuid、NetProvGuid、DiskProvGuid等等一些日志事件,在这些注册之间还有一个函数EtwpInitializeRegTracing(),这个是初始化注册注册表事件的函数,跟进去继续追踪,实现很简单
int __cdecl EtwpInitializeRegTracing()
{
return EtwRegister(
(_GUID *)&RegistryProvGuid,
(void (__cdecl *)(_GUID *, unsigned int, char, unsigned __int64, unsigned __int64, _EVENT_FILTER_DESCRIPTOR *, void *))EtwpRegTraceEnableCallback,
0i64,
&EtwpRegTraceHandle);
}
RegistryProvGuid 就是注册表的事件的id :
{70eb4f03-c1de-4f73-a051-33d13d5413bd
注册的回调函数是EtwpRegTraceEnableCallback,注册得到的句柄是:EtwpRegTraceHandle,最后内核也是通过EtwWrite写句柄EtwpRegTraceHandle来输出日志。
注意知识讲解点:
查询MSDN库,EtwRegister定义如下:
NTSTATUS EtwRegister(
LPCGUID ProviderId,
PETWENABLECALLBACK EnableCallback,
PVOID CallbackContext,
PREGHANDLE RegHandle
);
EnableCallback是应用层调用EnableTrace后,内核会把应用层传入的CallbackContext参数传输给EnableCallback的回调,PETWENABLECALLBACK定义如下:
void Etwenablecallback(
LPCGUID SourceId,
ULONG ControlCode,
UCHAR Level,
ULONGLONG MatchAnyKeyword,
ULONGLONG MatchAllKeyword,
PEVENT_FILTER_DESCRIPTOR FilterData,
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)