微软轻量级系统监控工具sysmon原理与实现完全分析.docx

上传人:b****5 文档编号:3440076 上传时间:2022-11-23 格式:DOCX 页数:12 大小:268.88KB
下载 相关 举报
微软轻量级系统监控工具sysmon原理与实现完全分析.docx_第1页
第1页 / 共12页
微软轻量级系统监控工具sysmon原理与实现完全分析.docx_第2页
第2页 / 共12页
微软轻量级系统监控工具sysmon原理与实现完全分析.docx_第3页
第3页 / 共12页
微软轻量级系统监控工具sysmon原理与实现完全分析.docx_第4页
第4页 / 共12页
微软轻量级系统监控工具sysmon原理与实现完全分析.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

微软轻量级系统监控工具sysmon原理与实现完全分析.docx

《微软轻量级系统监控工具sysmon原理与实现完全分析.docx》由会员分享,可在线阅读,更多相关《微软轻量级系统监控工具sysmon原理与实现完全分析.docx(12页珍藏版)》请在冰豆网上搜索。

微软轻量级系统监控工具sysmon原理与实现完全分析.docx

微软轻量级系统监控工具sysmon原理与实现完全分析

微软轻量级系统监控工具sysmon原理与实现完全分析

微软轻量级系统监控工具sysmon内核实现原理

微软轻量级监控工具sysmon原理与实现

前两次我们分别讲了sysmon的ring3与ring0的实现原理,但是当初使用的版本的是8.X的版本,最新的版本10.X的sysmon功能有所增加,经过分析代码上也有变化。

比如增加DNS得功能,这个功能实现也很简单,就是ETW里获取Microsoft-Windows-DNS-Client得数据,但是本篇不讲这个,本续篇主要讲内核里的事件结构。

所有的内核里上报的事件开头基本都是

ReportSize

ReportType

struct_Report_Common_Header

{

ULONGReportType;

ULONGReportSize;

};

下面具体讲解每个事件的结构

1.FileCreate

下图是文件上报事件,除了上报上诉三个字段外,还有ProcessPid、EventCreateTime,FileCreateTime、hashVlaue算法id,hashvalue、三组进程相关的数据用户UserSid、进程ImageFileName、文件名FileName

可以看到内核里上报出来的事件类型是根据是否计算hash来判断,分别是10、11

struct_Report_File

{

Common_HeaderHeader;

CHARdata[16];

ULONGProcessPid;

ULONGParentPid;

LARGE_INTEGERCreateTime;

LARGE_INTEGERFileCreateTime;

ULONGHashingalgorithmRulev;

CHARFileHash[84];

ULONGDataLength[4];

CHARData2[1];

};

2.设置文件属性时间改变事件

内核出来的事件Type值是2

结构体与FileCreate稍微有些不同,少了文件hash的计算的步骤,但是多了一个设置文件改变的时间。

struct_Report_File_SetAttrubute

{

Common_HeaderHeader;

CHARdata[16];

ULONGProcessPid;

ULONGParentPid;

LARGE_INTEGERCreateTime;

LARGE_INTEGERFileTime;

LARGE_INTEGERFileCreateTime;

ULONGDataLength[4];

CHARData2[1];

};

3.进程创建事件

进程创建上报事件内核的事件Type值是4或者1

他的结构体如下(具体不在讲解,名字字面意思都能看懂)

struct_Report_Process

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGProcessPid;

ULONGParentPid;

ULONGSessionId;

ULONGUserSid;

LARGE_INTEGERCreateTime;

LUIDAuthenticationId;

ULONGTokenIsAppContainer;

LUIDTokenId;

ULONGHashingalgorithmRule;

DWORDDataChunkLength[6];

CHARData[1];

};

4.进程退出事件

进程退出事件内核的Type值是3

struct_Report_Process_Create

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGProcessPid;

ULONGParentPid;

LARGE_INTEGERCreateTime;

ULONGSidLength;

ULONGXXXXXXX;

SIDUserSid;

CHARData[1];

};

可以看到数据有进程id、父进程id、事件创建时间、UserSid

5.线程创建事件

内核里的事件类型是7

结构体如下

struct_Report_Process_Thread

{

Report_Common_HeaderHeader;

CHARdata[16];

LARGE_INTEGERCreateTime;

ULONGThreadOwnerPidv;

ULONGThreadId;

ULONGThreadAddress;

ULONGOpenProcessPid;

WCHARDllInfo[261];

WCHARDllExportInfo[261];

};

DllInfo是指线程所在的模块名,DllExportInfo是该模块的导出表信息

6.OpenProcess事件

内核事件类型是:

9

结构体定义如下:

struct_Report_OpenProcess

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGProcessId;

ULONGMyThreadId;

ULONGOpenPrcesid;

ULONGAccessMask;

LARGE_INTEGERCreateTime;

ULONGStatckTrackInfoSize;

ULONGDataLength[3];

CHARData[1];

};

7.注册表事件

进程注册表操作事件的Type值是12

结构体如下:

struct_Report_Process_Registry

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGOperateEventType;

ULONGParentPid;

LARGE_INTEGERCreateTime;

ULONGProcessPid;

ULOGDataLenth[5];

CHARData[1];

};

这里要说明的是附加数据段有5个数据

UserSid

RegistryOperateName

进程名带参数

KeyName

ValueName

其中RegistryOperateName的值是根据OperateEventType的值从下面的数组中选取

g_RegistryTypeNameddoffsetaUnknownEventTy

.rdata:

100134D8;DATAXREF:

SysmonCreateRegistryReportInfo+15E↑r

.rdata:

100134D8;"UnknownEventtype"

.rdata:

100134DCddoffsetaCreatekey;"CreateKey"

.rdata:

100134E0ddoffsetaDeletekey;"DeleteKey"

.rdata:

100134E4ddoffsetaRenamekey;"RenameKey"

.rdata:

100134E8ddoffsetaCreatevalue;"CreateValue"

.rdata:

100134ECddoffsetaDeletevalue;"DeleteValue"

.rdata:

100134F0ddoffsetaRenamevalue;"RenameValue"

.rdata:

100134F4ddoffsetaSetvalue;"SetValue"

.rdata:

100134F8dword_100134F8dd100010h;DATAXREF:

Regist

8.命名管道事件

内核的事件的Type的值是:

13

结构体如下:

struct_Report_Process_NameedPipe

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGNamedPipeType;

ULONGParentPid;

LARGE_INTEGERCreateTime;

ULONGProcessPid;

DWORDDataChunkLength[3];

CHARData[1];

};

在data块里会输出:

NamePipeFileName和ImageFileName两个数据

9.上报错误信息事件

内核的事件Type值是:

6

结构体定义:

struct__Report_Event_Error

{

Report_Common_HeaderHeader;

CHARdata[16];

ULONGErrorDataLength[2];

CHARData[1];

};

Data信息里会输出两个错误信息的字符串,如:

下面我做一个小实验,以进程信息为例子,向sysomn的驱动发送IO控制码0xXXX0000X(我打码屏蔽了,希望读者自己去发现,不要做伸手党)

LARGE_INTEGERRequest;

Request.LowPart=GetCurrentProcessId();

Request.HighPart=FALSE;

BYTEOutBuffer[4002]={0};

ULONGBytesReturned=0;

if(SUCCEEDED(DeviceIoControl(

hObjectDrv,

SYSMON_REQUEST_PROCESS_INFO,

&Request,

8.

OutBuffer,

sizeof(OutBuffer),

&BytesReturned,0)))

{

if(BytesReturned)

{

Report_Process*pSysmon_Report_Process=(_Report_Process*)

&OutBuffer[0];

if(pSysmon_Report_Process->Header.ReportSize)

{

CheckServiceOk=TRUE;

}

}

}

CloseHandle(hObjectDrv);

看结果:

可以看到结构体上的值都是对的,然后6个DataChunkLenggth都有值,我们在去看下面的Data内存

今天的续篇就此结束,sysmon还是可以挖掘很多很实用得东西,比如每个事件里得ProcessGuid并不是随机生成得,而是有一定算法得,具体读者可以自行研究发现。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1