如何逆向分析Etw框架windows内核监控注册表的实现原理

本篇文章给大家分享的是有关如何逆向分析Etw框架windows内核监控注册表的实现原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

临西网站建设公司创新互联公司,临西网站设计制作,有大型网站制作公司丰富经验。已为临西1000+提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的临西做网站的公司定做!

         Window7以及以上系统的ETW日志自带了一个注册表日志信息的输出,在windows事件查看器的Microsoft  Windows KernelRegistry / 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 = 0x000001e0ca423da8L"Status"           ULONG32

          mName = 0x000001e0ca423e20L"Disposition"  ULONG32

          mName = 0x000001e0ca423e98 L"BaseName"     2

          mName = 0x000001e0ca423f10L"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 = 0x000001f3275e5d90L"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事件,如下

如何逆向分析Etw框架windows内核监控注册表的实现原理

如何逆向分析Etw框架windows内核监控注册表的实现原理

我们可以看到EventTracingProvGuid、KernelProvGuid、NetProvGuid、DiskProvGuid等等一些日志事件,在这些注册之间还有一个函数EtwpInitializeRegTracing(),这个是初始化注册注册表事件的函数,跟进去继续追踪,实现很简单


int __cdeclEtwpInitializeRegTracing()

{

  return EtwRegister(

           (_GUID *)&RegistryProvGuid,

           (void (__cdecl *)(_GUID *, unsignedint, char, unsigned __int64, unsigned __int64, _EVENT_FILTER_DESCRIPTOR *, void*))EtwpRegTraceEnableCallback,           0i64,

           &EtwpRegTraceHandle);

}

RegistryProvGuid就是注册表的事件的id :

 {70eb4f03-c1de-4f73-a051-33d13d5413bd

如何逆向分析Etw框架windows内核监控注册表的实现原理

注册的回调函数是EtwpRegTraceEnableCallback,注册得到的句柄是:EtwpRegTraceHandle,最后内核也是通过EtwWrite写句柄EtwpRegTraceHandle来输出日志。

 注意知识讲解点

查询MSDN库,EtwRegister定义如下:

  NTSTATUS EtwRegister(

  LPCGUID            ProviderId,

  PETWENABLECALLBACK EnableCallback,

  PVOID              CallbackContext,

  PREGHANDLE         RegHandle

);

EnableCallback是应用层调用EnableTrace后,内核会把应用层传入的CallbackContext参数传输给EnableCallback的回调,PETWENABLECALLBACK定义如下:

void Etwenablecallback(

    LPCGUIDSourceId,

    ULONGControlCode,

     UCHAR Level,

     ULONGLONG MatchAnyKeyword,

    ULONGLONGMatchAllKeyword,

    PEVENT_FILTER_DESCRIPTORFilterData,

    PVOIDCallbackContext

)

ControlCode就是True or false的开关

Level是日志等级

MatchAnyKeyword 和 MatchAllKeyword是两个过滤keyword id

FilterData 这个参数只有windows 7或者以上系统才有的参数,是应用层通过EnableTraceEx或者 EnableTraceEx2来传入的参数。

接下来我们继续看EtwpRegTraceEnableCallback回调函数的实现

如何逆向分析Etw框架windows内核监控注册表的实现原理

当应用层开启Enable日志的时候,即ControlId = True时,回调函数内部会通过CmRegisterCallbackEx函数注册注册表过滤回调EtwpRegTraceCallback,注册成功后,全局变量EtwpRegTracingEnabled会设置为True,如果ControlId = False时,即关闭日志,会调用CmUnRegisterCallback注销回调函数。

注意

  if ( FilterData&& FilterData->Size == 4 )

EtwpRegTraceOptions= *(unsigned int *)FilterData->Ptr;

这两句代码,这是一个未文档化隐含的“技能”,当设置过滤数据后,就会设置EtwpRegTraceOptions的全局值,设置不同的数值会输出不同的数据,默认是0,当EtwpRegTraceOptions为0时内核只会输出一些基本的key 、 value 、 Type值,但不会输出一些很具体的设置的CaptureData数据。 

接下来我们看EtwpRegTraceCallback函数

 如何逆向分析Etw框架windows内核监控注册表的实现原理

这里是组装QueryValueKey_Opt的数据,注意EtwpRegTraceOptions& 2就如前所讲EtwpRegTraceOptions有2的标志位就会再次组装注册表里查询的KeyValueData,注意这个大小最多只给你2048个字节

如何逆向分析Etw框架windows内核监控注册表的实现原理


if ( EtwpRegTraceOptions & 4 )

EtwpCapturePreviousRegistryData((_REG_SET_VALUE_KEY_INFORMATION*)Argument2);

如果EtwpRegTraceOptions参数包含4的时候就会输出设置之前的ValueData,(但是这里却没有设置输出最大值,有点奇怪)。

其他类型就不集体讲解了,一样的方式,在内核里有如下定义

如何逆向分析Etw框架windows内核监控注册表的实现原理

后面那个一串数据80000000000010000000200410000001是当前MatchKeyWord,如之前所讲应用层可以通过EnableTrace/EnableTraceEx/EnableTraceEx2keyword参数设置输出不同的数据。 

最后组合起来的数据会通过EtwWrite函数写句柄EtwpRegTraceHandle,哪个实例注册了这个事件id,Etw的组件就会把这个数据输出给实例。

 如何逆向分析Etw框架windows内核监控注册表的实现原理

下面我们写个程序去展示下获取这个日志输出,(怎样创建Etw不再讲解),

ULONG64 KeyWord = (ULONG64)((CreateKey_Keyword |

                                              DeleteKey_Keyword |

                                              SetValueKey_Keyword |

                                              DeleteValueKey_Keyword) & 0xFFFF);

                       EVENT_FILTER_DESCRIPTOR EnableFilterDesc = {0};

                       ULONG64 dwVal = 0x02;

                       UCHAR   Level = EVENT_CONTROL_CODE_ENABLE_PROVIDER;

                       Level = EVENT_CONTROL_CODE_ENABLE_PROVIDER;

                       EnableFilterDesc.Ptr = (ULONGLONG)&dwVal;

                       EnableFilterDesc.Size = 4;

                       EnableTraceEx(

                           &RegistryProvGuid,

                           0,

                           m_Session,

                           Level,

                           TRACE_LEVEL_VERBOSE,

                           KeyWord,

                           0,

                           0,

                           &EnableFilterDesc

                           );

注意我设置定义了EnableFilterDesc的其他把EnableFilterDesc.Size= 4,和dwVal设置为2,就是之前讲解的要windows注册表内核去设置EtwpRegTraceOptions参数,

运行后,可以看到内核输出的日志信息

KeyName:


如何逆向分析Etw框架windows内核监控注册表的实现原理 

ValueName:

如何逆向分析Etw框架windows内核监控注册表的实现原理

当前操作是SetValueKey,设置的Data

如何逆向分析Etw框架windows内核监控注册表的实现原理 

输出了CaptureData数据,大小1460,数据如下

如何逆向分析Etw框架windows内核监控注册表的实现原理

这里也输出了设置之前的data

如何逆向分析Etw框架windows内核监控注册表的实现原理

如何逆向分析Etw框架windows内核监控注册表的实现原理

至此内核里如何实现注册表Etw日志的原理讲解以及实例展示完毕,整个结构很简单,可以不用自己去专门写个注册表驱动去实现监测了,微软已经为我们提供一套完整的解决方案,只是更多未文档化的细节需要去发现。

以上就是如何逆向分析Etw框架windows内核监控注册表的实现原理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网页名称:如何逆向分析Etw框架windows内核监控注册表的实现原理
文章网址:http://hbruida.cn/article/ishdhj.html