微软轻量级系统监控工具sysmon原理与实现完全分析.docx
- 文档编号:3440076
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:12
- 大小:268.88KB
微软轻量级系统监控工具sysmon原理与实现完全分析.docx
《微软轻量级系统监控工具sysmon原理与实现完全分析.docx》由会员分享,可在线阅读,更多相关《微软轻量级系统监控工具sysmon原理与实现完全分析.docx(12页珍藏版)》请在冰豆网上搜索。
微软轻量级系统监控工具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并不是随机生成得,而是有一定算法得,具体读者可以自行研究发现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微软 轻量级 系统 监控 工具 sysmon 原理 实现 完全 分析