sysmon的ring3层实现原理
作者:浪子_三少
Sysmon是微软的一款轻量级的系统监控工具,最开始是由Sysinternals开发的,后来Sysinternals被微软收购,现在属于Sysinternals系列工具。它通过系统服务和驱动程序实现记录进程创建、文件访问以及网络信息的记录,并把相关的信息写入并展示在windows的日志事件里。经常有安全人员使用这款工具去记录并分析系统进程的活动来识别恶意或者异常活动。而本文讨论不是如何去使用该工具,而是讲解该软件的原理与实现。
本文对Sysmon分两部分
1.ring3层的exe,
2. Flt的minifilter
下面开始上篇的讲解,ring3实现对网络数据记录以及对驱动返回的数据进行解析,而驱动部分则返回进程相关的信息以及进程访问文件注册表的数据给ring3,我们首选讲解ring3的实现原理。
Sysmon的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.xml的configuration规定了一些进程参数的说明,而events描述说明一些记录信息事件,比如
<event name="SYSMON_CREATE_PROCESS" value="1" level="Informational" template="Process Create" 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 im MANXXXX.tmp”去注册安装事件类
4. 安装minifilter驱动
释放资源文件为1002的到系统目录Tmp/Sysmon.sys,资源1002文件是个pe文件,实际上是sysmon的文件注册表监控驱动。
接下来继续就是安装这个驱动
Sysmon还会设置minifilter驱动的Altitude值为385201
最后开启驱动服务
往驱动发送IO控制码: 0x8340008(该控制码是给驱动更新配置规则)
以上过程是大致的安装与启动的过程,接下来就是执行Sysmon服务的SysmonServiceMain例程。
下面开始执行取数据的工作了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课