iMonitorSDK
The world's most powerful System Activity Monitor Engine
一款功能强大的终端行为采集防御开发套件
旨在帮助EDR、零信任、数据安全、审计管控等终端安全软件可以快速实现产品功能, 而不用关心底层驱动的开发、维护和兼容性问题,让其可以专注于业务开发
累计为30+家企业提供优质服务
为什么选择iMonitorSDK
专业、稳定、高效
丰富的监控能力
支持进程、文件、注册表、网络、系统行为等上百种事件的采集和防御能力
良好的兼容性
使用标准规范实现方式,通过微软WHQL认证,兼容性好,同时支持XP到Win11的所有系统
强大的规则引擎
内置应用层和内核两个规则引擎,可以快速实现事件过滤或者防御功能
开箱即用
提供了40多种不同场景的使用示例,轻松接入
稳定可靠
基于SDK自研了冰盾主动防御、冰镜行为分析等多款稳定成熟产品,品质有保证
遥遥领先
提供了异步采集、同步防御、文件隐藏、自保护、沙箱、防火墙、流量代理、HTTPS解析等多种强大能力
适用场景
终端检测与响应(EDR)
主动防御(HIPS)
数据防泄密(DLP)
上网行为管理
零信任
终端管控
行为审计
主机安全
使用示例
示例一:同步拦截场景
演示进程启动同步拦截场景
class MonitorCallback : public IMonitorCallback
{
public:
void OnCallback(IMonitorMessage* Message) override
{
if (Message->GetType() != emMSGProcessCreate)
return;
cxMSGProcessCreate* msg = (cxMSGProcessCreate*)Message;
//
// 禁止进程名 cmd.exe 的进程启动
//
if (msg->IsMatchPath(L"*\\cmd.exe")) {
msg->SetBlock();
}
//
// 异步处理:挂起后,插入到其他线程处理,可以用于弹窗或者并发场景
//
if (msg->Pending()) {
g_Looper->PostRunnable([](msg){
if (msg->IsMatchPath(L"*\\async.exe")) {
msg->SetBlock();
}
msg->CompletePending();
});
}
}
};
int main()
{
MonitorManager manager;
MonitorCallback callback;
HRESULT hr = manager.Start(&callback);
if (hr != S_OK) {
printf("start failed = %08X\n", hr);
return 0;
}
cxMSGUserSetMSGConfig config;
config.Config[emMSGProcessCreate] = emMSGConfigSend;
manager.InControl(config);
WaitForExit("同步防御演示");
return 0;
}
示例二:异步采集场景
实现一个类似sysmon的行为采集器
class MonitorCallback : public IMonitorCallback
{
public:
void OnCallback(IMonitorMessage* msg) override
{
printf("%S ==> %S\n", msg->GetTypeName(), msg->GetFormatedString(emMSGFieldCurrentProcessPath));
for (ULONG i = emMSGFieldCurrentProcessCommandline; i < msg->GetFieldCount(); i++) {
printf("\t%30S : %-30S\n", msg->GetFieldName(i), msg->GetFormatedString(i));
}
}
};
int main()
{
MonitorManager manager;
MonitorCallback callback;
HRESULT hr = manager.Start(&callback);
if (hr != S_OK) {
printf("start failed = %08X\n", hr);
return 0;
}
cxMSGUserSetMSGConfig config;
for (int i = 0; i < emMSGMax; i++) {
config.Config[i] = emMSGConfigPost;
}
manager.InControl(config);
WaitForExit("");
return 0;
}
示例三:流量代理场景
上网行为管理,可以拦截所有HTTP、HTTPS请求(详细参考http_access_control例子)
示例四:注入场景
支持在任意时刻对进程注入动态库,这里演示常见的在进程启动加载Kernel32的时候注入动态库
class MonitorCallback : public IMonitorCallback
{
public:
void OnCallback(IMonitorMessage* Message) override
{
if (Message->GetType() != emMSGImageLoad)
return;
cxMSGImageLoad* msg = (cxMSGImageLoad*)Message;
if (!msg->IsMatchCurrentProcessName(L"notepad.exe"))
return;
if (msg->IsMatchPath(L"*\\kernel32.dll")) {
msg->SetInjectDll(L"D:\\test.dll");
}
}
};
int main()
{
MonitorManager manager;
MonitorCallback callback;
HRESULT hr = manager.Start(&callback);
CheckSignError(hr);
if (hr != S_OK) {
printf("start failed = %08X\n", hr);
return 1;
}
manager.InControl(cxMSGUserSetGlobalConfig());
cxMSGUserSetMSGConfig config;
config.Config[emMSGImageLoad] = emMSGConfigSend;
manager.InControl(config);
WaitForExit("模块注入:在notepad.exe启动加载kernel32.dll过程中,让其强制加载D:\\test.dll");
return 0;
}
示例五:内核规则引擎
演示内核规则引擎的使用,可以设置规则到驱动,直接拦截某些行为
std::string InitRules(void)
{
return R"(
{
"name" : "default",
"description" : "default rule group",
"rules" : [
{
"name" : "Block the execution of notepad",
"action" : 1,
"event" : "ProcessCreate",
"matcher" : {
"or" : [
{"match" : ["Path", "*\\notepad.exe"]},
{"match" : ["Path", "*\\notepad++.exe"]}
]
}
}
]
}
)";
}
int main()
{
MonitorManager manager;
MonitorCallback callback;
HRESULT hr = manager.Start(&callback);
CheckSignError(hr);
if (hr != S_OK) {
printf("start failed = %08X\n", hr);
return 0;
}
std::string rules = InitRules();
manager.SetRules(emUserSetMSGRules, rules.c_str());
WaitForExit("设置内核规则:禁止notepad的进程启动。\n"
"\t注意:此功能是设置,设置完成要恢复需要移除规则!\n"
"\t按任意键移除规则并退出。");
manager.InControl(cxMSGUserRemoveMSGRules());
return 0;
}
示例六:能力扩展
演示字段扩展能力,动态注入字段,可以用于扩充规则引擎的能力等,实现更加灵活的功能
class MonitorCallback : public IMonitorCallback
{
public:
const MonitorExtensionFieldTable& GetExtensionFieldTable(void)
{
static MonitorExtensionField fields[] = {
{ MONITOR_SUPPORT_ALL_MESSAGE, L"FileExtension", nullptr, GetFileExtension },
{ emMSGProcessCreate, L"IsVirus", IsVirus, nullptr },
};
static MonitorExtensionFieldTable table = {
_countof(fields),
fields,
};
return table;
}
void OnConfig(GlobalConfig& Config)
{
Config.ExtensionFieldTable = GetExtensionFieldTable();
}
void OnCallback(IMonitorMessage* Message) override
{
auto is_virus = Message->GetNumber(L"IsVirus");
auto file_ext = Message->GetString(L"FileExtension");
printf("FileExtension = %S\n", file_ext);
}
static CString GetFileExtension(IMonitorMessage* Message)
{
return PathFindExtension(Message->GetString(emMSGFieldPath));
}
static ULONGLONG IsVirus(IMonitorMessage* Message)
{
return FALSE;
}
};
int main()
{
MonitorManager manager;
MonitorCallback callback;
HRESULT hr = manager.Start(&callback);
CheckSignError(hr);
if (hr != S_OK) {
printf("start failed = %08X\n", hr);
return 0;
}
manager.InControl(cxMSGUserSetGlobalConfig());
cxMSGUserSetMSGConfig config;
config.Config[emMSGProcessCreate] = emMSGConfigPost;
manager.InControl(config);
WaitForExit("演示扩展能力:可以为IMonitorMessage扩展更多的字段,这些字段同时也可以用于规则引擎。");
return 0;
}