Sysmon是微软的一款轻量级的系统监控工具,被常常用来进行入侵检测分析,它通过系统服务和驱动程序实现记录进程创建、文件访问以及网络信息的记录,并把相关的信息写入并展示在windows的日志事件里。经常有安全人员使用这款工具去记录并分析系统进程的活动来识别恶意或者异常活动,下面开始讲解该软件的原理与实现。

下面开始上篇的讲解,ring3实现对网络数据记录以及对驱动返回的数据进行解析,而驱动部分则返回进程相关的信息以及进程访问文件注册表的数据给 ring3。

1. 判断当前操作系统是否是64位,如果是就执行64位的sysmon

动态获取IsWow64Process的函数地址,然后调用IsWow64Process函数,判断当前是否是 wow64,如果是就执行SysmonLunchIsAmd64(),进入SysmonLunchIsAmd64函数

通过GetNativeSystemInfo函数判断当前SystemInfo.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_AMD64 的值

如果是PROCESSOR_ARCHITECTURE_AMD64则释放资源节中id = 1001的资源到当前进程的所在目录,这是一个内嵌在资源里的 64位版本的sysmon的exe,释放完毕后,就开始执行这个64 的Sysmon。下面就是Symon的64位资源图

本文还是主要以32位的sysmon来讲解,我们继续往下讲解

2. 参数的检查

接下来sysmon 会对参数进行检查,检查是否config、configuration、h、–nologon、?、help非这些参数后,然后会接着解析具体的参数,根据参数是否加载规则。

我们看SysmonAnalyzeInitArgv 函数具体看看sysmon有哪些参数,

g_commandLine里固定存贮所有的 sysmon参数,这里大概只列举出一部分,Install、i、Uninstall、Configuration、c、u、Manifest、m、DebugMode、nologo、AcceptEula、ConfigDefault、HashAlgorithms、NetworkConnect、ImageLoad、l、DriverName、ProcessAccess、CheckRevocation、PipeMonitoring等等。

如果是相应的参数就继续往下执行相应的动作。

通过检测参数sha、sha-1、md5、md-5、sha、sha256、imphash、imp-hash 计算当前使用何种hash算法

Sha:  1算法、Md5: 2 算法、sha:3算法、imphash:4 算法

接下来会加载内置在exe 内的Sysmonschema.xml

Sysmonschema.xmlconfiguration规定了一些进程参数的说明,而events描述说明一些记录信息事件,比如

<event name=”SYSMON_CREATE_PROCESS”value=”1″ level=”Informational” template=”ProcessCreate” rulename=”ProcessCreate” ruledefault=”include”version=”5″>

<data name=”UtcTime” inType=”win:UnicodeString”outType=”xs:string” />

<data name=”ProcessGuid”inType=”win:GUID” />

<data name=”ProcessId”inType=”win:UInt32″ outType=”win:PID” />

<data name=”Image”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”FileVersion”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”Description”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”Product”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”Company”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”CommandLine”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”CurrentDirectory”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”User”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”LogonGuid” inType=”win:GUID”/>

<data name=”LogonId”inType=”win:HexInt64″ />

<data name=”TerminalSessionId”inType=”win:UInt32″ />

<data name=”IntegrityLevel”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”Hashes”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”ParentProcessGuid”inType=”win:GUID” />

<data name=”ParentProcessId”inType=”win:UInt32″ outType=”win:PID” />

<data name=”ParentImage”inType=”win:UnicodeString” outType=”xs:string” />

<data name=”ParentCommandLine”inType=”win:UnicodeString” outType=”xs:string” />

</event>

就说明了SYSMON_CREATE_PROCESS创建进程上报信息的一些数据内容及说明。

如果参数是PrintSchema


则解析并获取Sysmonschema的version,然后打印Sysmonschema 的信息

3. 注册日志记录事件

Sysmon接着会通过EventRegister()函数注册一个GUID为{ 5770385F-C22A-43E0-BF4C-06F5698FFBD9}的日志事件。然后sysmon会通过系统的wevtutil.exe的程序去注册该GUID的系统日志trace类

获取系统是否存在Microsoft-Windows-Sysmon的trace类,如果没有就加载exe资源中“SYSMONMAN”的资源到内存,然后释放写入系统临时目录下的文件名MANXXXX.tmp文件里

该文件是定义{5770385F-C22A-43E0-BF4C-06F5698FFBD9}Microsoft-Windows-Sysmon的trace事件的provider,用于sysmon的后续数据解析。

最后调用系统的”wevtutil.exe imMANXXXX.tmp”去注册安装事件类

4.     安装minifilter驱动

释放资源文件为1002的到系统目录Tmp/Sysmon.sys,资源1002文件是个pe文件,实际上是sysmon的文件注册表监控驱动。

接下来继续就是安装这个驱动

Sysmon还会设置minifilter驱动的Altitude值为385201

最后开启驱动服务

往驱动发送IO控制码:0×8340008(该控制码是给驱动更新配置规则)

以上过程是大致的安装与启动的过程,接下来就是执行Sysmon服务的SysmonServiceMain例程。

5.数据的获取与解析

接下来开始执行取数据的工作了。

第一步:文件进程注册表的事件监控

通过发送IO控制码: 0×83400000,打开文件驱动功能,接着sysmon会开启一个线程从驱动获取监控数据,通过发送IO控制码:0×83400004,去反复获取

每隔500毫秒发送一次获取数据,堆大小0×400000,获取了数据后,则开始解析这raw data,这个raw数据的首四个字节是表示数据类型

Typedefstruct_Sysmon_Raw_Data

{

ULONG DataType;

}Sysmon_Raw_Data;

Case 1: 上报进程创建

ReportEventWriteEvent((int)&v147,(unsigned __int16 *)&g_CreateProcess, (int)v1, v17);

Case 2: 文件时间改变

ReportEventWriteEvent((int)&v147,(unsigned __int16 *)&g_CreateFileTime, (int)v1, v30);

Case 3:进程关闭

ReportEventWriteEvent((int)&v147,(unsigned __int16 *)&g_TerminateProcess, (int)v1, 0);

Case 5:加载镜像

ReportEventWriteEvent((int)&v146,&g_ImageLoad, (int)v1, v50);

Case 7:创建远程线程

ReportEventWriteEvent((int)&v146,(unsigned __int16 *)&g_CreateRemoteThread, (int)v1, 0);

Case 8:文件读

ReportEventWriteEvent((int)&v146,(unsigned __int16 *)&g_FileRead, (int)v1, 0);

Case 9:访问进程

ReportEventWriteEvent((int)&v146,(unsigned __int16 *)&g_ProcessAccess, (int)v1, 0);

Case 10:文件创建

ReportEventWriteEvent((int)&v146,(unsigned __int16 *)&g_FileCreate, (int)v1, v32);

Case 11:文件流事件

ReportEventWriteEvent((int)&v146,(unsigned __int16 *)&g_FileStreamCreate, (int)v1, v35);

Case 12:注册表相关的事件

Case 13:管道类事件

第二步:网络链接事件的监控

Sysmon还会创建一个ETW事件去监控网络连接的访问事件

Net Trace 名:L”SYSMON TRACE”;或者使用系统的L”NT Kernel Logger”;

方法参考微软官方实例:https://docs.microsoft.com/en-us/windows/desktop/etw/configuring-and-starting-the-nt-kernel-logger-session

事件回调EventCallBack()接受数据

在解析数据时使用的是WMI Mof的方法来解析

可以参考微软的官方例子:

https://docs.microsoft.com/en-us/windows/desktop/etw/retrieving-event-data-using-mof

第三步:接受上报数据写入windows的Application日志

在第二部中我们可以看到通过ReportEventWriteEvent函数上报信息,在ReportEventWriteEvent函数里分两种情况系统API上报

通过ReportEvent或者EventWrite两个其中一个API上报,而上报的事件IDD 类都是前面我们看到的Sysmon自己注册到系统的里<provider name=”Microsoft-Windows-Sysmon”guid=”{5770385F-C22A-43E0-BF4C-06F5698FFBD9}”symbol=”SYSMON_PROVIDER” resourceFileName=”%filename%”messageFileName=”%filename%”>

<events>

Microsoft-Windows-Sysmon事件代理,这个会生成到windows日志的Application项目下,具体会使用哪个API是根据windows的版本来选择的

这里可以看到如果操作系统主版本,如果是vista之前的操作系统使用ReportEvent,如果是vista以及以上操作系统则使用EventWrite函数。

Sysmon记录上报了数据源通过注册的WMIEvent的wmi数据持久化过滤事件去过滤不会被记录的事件,我们下面看它如何实现的。

在之前的服务启动入口有一个函数RegisterWmiEvent,该函数就是注册过滤WmiEvent的函数,我们继续往下看

函数开头会创

建实例IDD_WebCImv,class Id: IID_IWbemLocatorGUID2

<0dc12a687h,0737fh,011cfh,088h,04dh,000h,0aah,000h,04bh,02eh,024h> 

链接”ROOT\\Subscription”的服务

接着创建Stub插口

g_WMIListenerEvent接口类型是IWbemObjectSink,其定义如下

MIDL_INTERFACE(“7c857801-7381-11cf-884d-00aa004b2e24″)

IWbemObjectSink :publicIUnknown

{

public:

virtualHRESULTSTDMETHODCALLTYPEIndicate(

/*[in] */longlObjectCount,

/*[size_is][in] */__RPC__in_ecount_full(lObjectCount) IWbemClassObject **apObjArray)= 0;

virtualHRESULTSTDMETHODCALLTYPESetStatus(

/*[in] */longlFlags,

/*[in] */HRESULThResult,

/*[unique][in] */__RPC__in_optBSTRstrParam,

/*[unique][in] */__RPC__in_optIWbemClassObject *pObjParam) =0;

};

然后执行

“SELECT * FROM__InstanceOperationEventWITHIN 5WHERE TargetInstance ISA ‘__EventConsumer’ ORTar”

“getInstance ISA’__EventFilter’ OR TargetInstance ISA ‘__FilterToConsumerBinding’”

g_WmiSubscriptProxy->lpVtbl->ExecNotificationQueryAsync(

g_WmiSubscriptProxy,

strQueryLanguage,

strQuery,

128,

0,

(IWbemObjectSink*)g_pIWebmObjectSink);

去设置WMiEvent的过滤事件,操作类型是所有操作InstanceOperationEvent,设置三种事件

EventConsumer’、EventFilter’、FilterToConsumerBinding’,查询时间是5秒一次,这样就注册了。

下面我们看g_WMIListenerEvent结构

过滤事件就是在Indicate()函数中实现,会通过IWbemClassObject**数组的形式输入,函数内会枚举数据,如果是要过滤的数据则循环枚举否则中断枚举。

至此本篇对sysmon的大致原理流程我们分析完毕,通过对它分析,学习它的实现过程,可以自己完成实现一个sysmon,当然也可以绕过sysmon的监控,这就需要读者自己去研究与发现。

微软轻量级监控工具sysmon原理与实现相关推荐

  1. Linux系统轻量级监控工具monitorix和munin安装

    提到监控工具,大家都会想到zabbix等重量级的,这些好是好,但是需要安装数据库等等,如果有时候希望简单点其实可以借助一些轻量级的监控工具,例如monitorix和munin. 需要做点前置工作开启N ...

  2. [转] 微软轻量级 Web 开发平台 WebMatrix 发布

    Microsoft WebMatrix 是一个全新的 Web 开发平台,今天开始正式发布第一个版本供公众使用.区别于现有的开发平台,WebMatrix 的特点是一站式和简化的开发过程,主要包含以下几大 ...

  3. 深度解析 Lucene 轻量级全文索引实现原理

    作者:vivo互联网服务器团队-Qian Yulun 一.Lucene简介 1.1 Lucene是什么? Lucene是Apache基金会jakarta项目组的一个子项目: Lucene是一个开放源码 ...

  4. 通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 一.实现网站访问计数器 1.线程不安全的做法 1.1.代码 package ...

  5. Linux系统轻量级监控工具Linux dash的安装方法

    Linux系统监控工具Linux dash的安装方法 一.Linux dash介绍 二.初始环境安装 1.系统版本 2.安装apche 3.安装php 4.防火墙与selinux配置 ①selinux ...

  6. java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)

    转自http://www.cnblogs.com/redcreen/archive/2011/03/29/1998801.html 大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的 ...

  7. Java 轻量级锁原理详解(Lightweight Locking)

    2019独角兽企业重金招聘Python工程师标准>>> 大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与mo ...

  8. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  9. 2022春招实习面经【美团、阿里、微软、字节、米哈游】

    目录 写在前面 一,美团--快驴事业部 1,时间线 2,笔试 3,面试 一面 二面 二,阿里--大淘宝技术 1,时间线 2,笔试 3,面试 一面 二面 三,微软--苏州STCA 1,时间线 2,笔试 ...

最新文章

  1. 主机/服务器某端口被占用及解决办法
  2. 解决eclipse ctrl+鼠标左键不能用
  3. 黄聪:说说JSON和JSONP,也许你会豁然开朗(转)
  4. 用hundred造句子_关于冬至的问候短句,冬至文案唯美句子
  5. LeetCode 27.移除元素
  6. python 输入正方形_Python打印正方形
  7. loadrunner linux 端口,Linux下loadrunner generator的安装
  8. 判断形参S所指字符串是否是回文,若是,函数返回1,不是则返回0,并在main中实现输出...
  9. 6月全球浏览器份额之争:霸主IE份额持续降至54%
  10. java中double类型占几个字节_Java基本数据类型占用字节数
  11. 计算机是通过计算器发明的吗,计算器是什么时候发明的
  12. 详解vue原理之观察模式Dep->Watcher
  13. 使用Markdown如何修改图片大小
  14. macOS用的是linux系统吗
  15. Red Giant Universe 3中文版
  16. 易泊夏武离线车牌识别,车牌识别SDK
  17. c++中new是否会自动初始化
  18. DLL 注入的三种方法详解
  19. 2022.07.16模拟赛总结
  20. 计算机主机的拆卸步骤,电脑清灰详细图文教程解说

热门文章

  1. 华清远见fs4412开发板学习笔记(四)
  2. 递归(6):小白上楼梯
  3. 余姚计算机编程培训,余姚python编程培训
  4. 达梦两个表模糊查询_极简式财务记账管理系统,窗格录入,模糊查找,弹窗汇总...
  5. Sexy Beach PR 汉化补丁+新手教程
  6. T100数据迁移与数据恢复
  7. php三极管驱动蜂鸣器计算,三分钟教你如何用三极管驱动蜂鸣器
  8. 【工业现场】核心工段机器代人,维视智造助力环保行业智能升级
  9. 股指期货买卖规则(股指期货交易规则详解)
  10. windows中hid操作api介绍