首页
社区
课程
招聘
[原创]ETW注册表监控windows内核实现原理
发表于: 2019-2-28 23:26 9793

[原创]ETW注册表监控windows内核实现原理

2019-2-28 23:26
9793

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期)

收藏
免费 4
支持
分享
最新回复 (11)
雪    币: 26205
活跃值: (63307)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2019-3-1 10:29
0
雪    币: 698
活跃值: (4564)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
支持下三哥
2019-3-1 10:57
0
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
这网站不错,还有稿费功能
2019-3-1 14:44
0
雪    币: 954
活跃值: (123)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
请问ETW是在用户层还是在内核层使用的?能否给个完整的ETW使用教程?
2019-3-2 17:28
0
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
tdsss 请问ETW是在用户层还是在内核层使用的?能否给个完整的ETW使用教程?
主要在应用层,内核也有
2019-3-5 11:35
0
雪    币: 207
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请问EnableTraceEx返回了错误代码5(Access Denied),是不是RegistryProvGuid无法在应用层使用呢?
2019-4-8 21:19
0
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
chanyao 请问EnableTraceEx返回了错误代码5(Access Denied),是不是RegistryProvGuid无法在应用层使用呢?
要求管理员权限
2019-4-12 08:59
0
雪    币: 207
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
已经是获取到管理员权限了,不过EnableTraceEx在win10下是返回错误代码5(ERROR_ACCESS_DENIED),在win7下是返回87(ERROR_INVALID_PARAMETER)
2019-4-13 09:43
0
雪    币: 207
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
You do not call EnableTraceEx to enable kernel providers. To enable kernel providers, set the EnableFlags member of EVENT_TRACE_PROPERTIES which you then pass to StartTrace. The StartTrace function enables the selected kernel providers.
2019-4-27 21:39
0
雪    币: 1795
活跃值: (63)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
能够提供一下完整的测试项目代码呢?
2019-11-20 18:12
0
雪    币: 1129
活跃值: (2761)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2019-12-2 10:53
0
游客
登录 | 注册 方可回帖
返回
//