跳至主要內容

规则引擎


iMonitorSDK内置规则引擎,可以基于配置快速实现强大的功能。一般用于主动防御、审计管控、EDR等业务。

接口说明

interface IMonitorRule
{
    virtual const char*      GetId                (void) = 0;
    virtual const char*      GetName              (void) = 0;
    virtual const char*      GetDescription       (void) = 0;
    virtual const char*      GetGroupName         (void) = 0;
    virtual ULONG            GetAction            (void) = 0;
    virtual const char*      GetActionParam       (void) = 0;
    virtual ULONG            GetMessageTypeCount  (void) = 0;
    virtual ULONG            GetMessageType       (ULONG Index) = 0;
};

interface IMonitorMessageField
{
    using RuleString = CStringW;
    using RuleNumber = ULONGLONG;

    virtual bool            GetString            (IMonitorMessage* Object, RuleString& Value) = 0;
    virtual bool            GetNumber            (IMonitorMessage* Object, RuleNumber& Value) = 0;
};

interface IMonitorRuleContext
{
    virtual IMonitorMessageField* GetCustomField(const char* Field) = 0;
};

interface IMonitorMatchCallback
{
    enum emMatchStatus {
        emMatchStatusBreak,
        emMatchStatusContinue,
    };

    virtual void            OnBeginMatch        (IMonitorMessage* Message) {}
    virtual void            OnFinishMatch       (IMonitorMessage* Message) {}
    virtual emMatchStatus   OnMatch             (IMonitorMessage* Message, IMonitorRule* Rule) = 0;
};

interface __declspec(uuid("51237525-2811-4BE2-A6A3-D8889E0D0CA1")) IMonitorRuleEngine : public IUnknown
{
    virtual void            Match               (IMonitorMessage* Message, IMonitorMatchCallback* Callback) = 0;
    virtual void            EnumRule            (void(*Callback)(IMonitorRule* Rule, void* Context), void* Context) = 0;
};
函数说明
Match在IMonitorCallback回调里匹配规则,匹配结果通过IMonitorMatchCallback通知
EnumRule遍历全部规则
OnBeginMatch开始匹配,可以初始化一些状态
OnFinishMatch匹配结束,可以做反初始化
OnMatch匹配到规则,这里可以返回是否继续匹配下一条规则,还是终止匹配

使用说明

class MonitorCallback
    : public IMonitorCallback
    , public IMonitorMatchCallback
{
public:
    void OnCallback(IMonitorMessage* Message) override
    {
        m_RuleEngine->Match(Message, this);
    }

    emMatchStatus OnMatch(IMonitorMessage* Message, IMonitorRule* Rule) override
    {
        if (Rule->GetAction() & emMSGActionBlock) {
            Message->SetBlock();
            printf("match block rule %s.%s\n", Result.GroupName, Result.RuleName);
            return emMatchStatusBreak;
        }

        return emMatchStatusContinue;
    }

public:
    CComPtr<IMonitorRuleEngine> m_RuleEngine;
};

规则文件说明

通过CreateRuleEngine传递规则文件路径创建规则引擎接口,路径格式支持全路径、带通配符的模糊匹配。

比如: C:\1.json、C:\rules\*.json

规则文件分为规则组、规则、匹配条件

{
    "name": "default",
    "description": "default rule group",
    "rules": [
        {
            "name": "block notepad",
            "action": 1,
            "action_param": "",
            "event": [
                "ProcessCreate",
                "ProcessOpen"
            ],
            "matcher": {
                "or": [
                    {
                        "match": [
                            "Path",
                            "*notepad.exe"
                        ]
                    }
                ]
            }
        }
    ]
}

规则组

字段说明
name规则组名
description描述
rules规则列表

规则

字段说明
name规则名
action匹配后的动作,在OnMatch里面使用,可以根据emMSGActionBlock来拦截操作,也可以自定义类型做其他业务相关的操作
action_param匹配后的动作参数,在OnMatch里面使用
event数组或者字符串,表示当前规则针对哪些消息类型有效
matcher匹配条件

规则匹配条件

匹配条件的格式统一为 { operator: [field, value] } 的格式

比如 { "==" { "CurrentProcessName", "cmd.exe"}} 表示 CurrentProcessName == "cmd.exe"

operator表示匹配类型,见下面列表。

field表示匹配的字段,详细参考协议字段。

value表示匹配的值,具体类型参考operator

operatorvalue类型说明
orarray表示数组下任意规则匹配
andarray表示数组下全部规则匹配
boolbool直接返回value的值
equalstring字符串相等
!equalstring字符串不相等
matchstring表示通配符的字符串匹配
!matchstringmatch的相反
includestring包含
!includestring不包含
regexstring正则匹配
!regexstring正则匹配失败
注意!!!上面字符串默认都是不区分大小写,如果需要区分大小写则使用大写的方式,比如:
EQUAL 表示字符串相等,并且大小写敏感
==number等于
!=number不等于
>number大于
<number小于
>=number大于等于
<=number小于等于
&number包含
!&number不包含

匹配扩展字段

除了基本的字段,规则引擎内部也内置了一些常见的扩展

字段含义
AccessModifiable表示CreateFile、OpenProcess等存在Access的操作,是否具备写、删除等权限
Address网络操作时的地址远程地址,比如:127.0.0.1:8080
Path.Ext文件后缀名: .dll
Path.FileName文件名
Process.ProcessPath进程路径
Process.ProcessName进程名称
Process.Commandline进程命令行
Process.CompanyName进程文件对应的公司名称
Process.ProductName进程文件对应的产品名
Process.FileDescription进程文件对应的描述信息
CurrentProcess.XxxxXxxx同Process的字段,表现操作进程的字段

开发扩展字段

interface IMonitorRuleContext
{
    virtual IMonitorMessageField* GetCustomField(const char* Field) = 0;
};

可以通过Context返回对应的接口提供