OSSIM开源安全信息管理系统(十五)
2021SC@SDUSC
目录
- 五、OSSIM关联分析的部分源代码分析
- 1、sim-directive.c
- 1.1、初识 glib
- 1.2、glib 基本类型定义
- 1.3、glib 函数
- 1.4、源码分析
五、OSSIM关联分析的部分源代码分析
OSSIM系统中,关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os-sim\src
1、sim-directive.c
打开 sim-directive.c
源码文件,同样先是包含一些库
#include <glib.h>
#include <glib-object.h>
#include <uuid/uuid.h>
这里引入了 glib.h
,而且阅读到后面的代码部分发现有很多的数据类型是 g
开头的,例如 gint
、gboolean
等。
之前接触 C 语言的次数也比较少,仅仅简单了解一点 C 语言的知识,在这里特地查找了网上的相关资料,学习了解一下 C 语言的 glib。
1.1、初识 glib
这里先简单介绍一下 glib
glib 库是 Linux 平台下最常用的 C 语言函数库,它具有很好的可移植性和实用性。c 语言复杂点也就数组,glib 能提供更复杂的数据结构,队列,简单链表,树,线程同步,信号,对象等复杂类型
glib 是 Gtk + 库和 Gnome 的基础。glib 可以在多个平台下使用,比如 Linux、Unix、Windows 等。glib 为许多标准的、常用的 C 语言结构提供了相应的替代物。
glib 的各种实用程序具有一致的接口。它的编码风格是半面向对象,标识符加了一个前缀 “g”,这也是一种通行的命名约定。
使用glib库的程序都应该包含glib的头文件glib.h。
1.2、glib 基本类型定义
glib 的类型定义不是使用 C 的标准类型,它自己有一套类型系统。它们比常用的 C 语言的类型更丰富,也更安全可靠。引进这套系统是为了多种原因。例如, gint32 能保证是 32 位的整数,一些不是标准 C 的类型也能保证。有一些仅仅是为了输入方便,比如 guint 比 unsigned 更容易输入。还有一些仅仅是为了保持一致的命名规则,比如,gchar 和 char 是完全一样的。
整数类型:
gint8、guint8、gint16、guint16、gint32、guint32、gint64、guint64。
不是所有的平台都提供64位整型,如果一个平台有这些, glib会定义G_HAVE_GINT64。
类型gshort、glong、gint和short、long、int完全等价。
布尔类型:
gboolean:它可使代码更易读,因为普通 C 没有布尔类型。
gboolean可以取两个值:TRUE 和 FALSE。实际上 FALSE 定义为 0,而 TRUE 定义为非零值。
字符型:
gchar和char完全一样,只是为了保持一致的命名。
浮点类型:
gfloat、gdouble 和 float、double 完全等价。
指针类型:
gpointer 对应于标准 C 的 void *,但是比 void * 更方便。
指针 gconstpointer 对应于标准 C 的 const void *(注意,将const void *定义为const gpointer是行不通的)
1.3、glib 函数
glib还提供了一系列实用函数,可以用于获取程序名称、当前目录、临时目录等。
这些函数都是在glib.h中定义的。
/*返回应用程序的名称*/
gchar* g_get_prgname (void);/*设置应用程序的名称*/
void g_set_prgname (const gchar *prgname);/*返回当前用户的名称*/
gchar* g_get_user_name (void);/*返回用户的真实名称。该名称来自“passwd”文件。返回当前用户的主目录*/
gchar* g_get_real_name (void);/*返回当前使用的临时目录,它按环境变量TMPDIR、TMPandTEMP 的顺序查找。如果上面的环境变量都没有定义,返回“/tmp”*/
gchar* g_get_home_dir (void);
gchar* g_get_tmp_dir (void);/*返回当前目录。返回的字符串不再需要时应该用g_free() 释放*/
gchar* g_get_current_dir (void);/*获得文件名的不带任何前导目录部分的名称。它返回一个指向给定文件名字符串的指针*/
gchar* g_basename (const gchar *file_name);/*返回文件名的目录部分。如果文件名不包含目录部分,返回“.”。返回的字符串不再使用时应该用g_free() 函数释放*/
gchar* g_dirname (const gchar *file_name);/*如果给定的file_name是绝对文件名(包含从根目录开始的完整路径,比如/usr/local),返回TRUE */
gboolean g_path_is_absolute (const gchar *file_name);/*返回一个指向文件名的根部标志(“/”)之后部分的指针。如果文件名file_name不是一个绝对路径,返回NULL */
gchar* g_path_skip_root (gchar *file_name);/*指定一个在正常程序终止时要执行的函数*/
void g_atexit (GVoidFunc func);
上面介绍的只是glib库中的一小部分, glib的特性远远不止这些。这里进行简单介绍,只是为了能够在后面的部分更好的分析 OSSIM 关联分析这一部分的源代码。
如果想了解其他内容,参考glib.h文件。这里面的绝大多数函数都是简明易懂的。
另外,http://www.gtk.org上的glib文档也是极好的资源。
1.4、源码分析
gboolean sim_directive_match_by_event(SimDirective *directive,SimEvent *event)
:
该函数的主要功能是判断传入指令是否与根节点指令匹配,这里只检查根节点,并不检查指令的子节点
gboolean
sim_directive_match_by_event (SimDirective *directive,SimEvent *event)
{gboolean match;g_return_val_if_fail (SIM_IS_DIRECTIVE (directive), FALSE);g_return_val_if_fail (!directive->_priv->matched, FALSE);g_return_val_if_fail (directive->_priv->rule_root, FALSE);g_return_val_if_fail (SIM_IS_RULE (directive->_priv->rule_root->data), FALSE);g_return_val_if_fail (SIM_IS_EVENT (event), FALSE);SimRule *rule = (SimRule *)directive->_priv->rule_root->data;match = sim_rule_match_by_event (rule, event);return match;
}
gboolean sim_directive_backlog_match_by_event (SimDirective *directive,SimEvent *event)
:
这将检查事件是否可以与 backlog 中的某些数据匹配。
backlog 实际上是一个包含事件数据的指令。每个 backlog 条目都是一个树,其中包含来自一个指令的所有规则(它相当于是一个指令克隆)。其中每个规则(simrule)还包含与规则匹配的事件的数据。
gboolean
sim_directive_backlog_match_by_event (SimDirective *directive,SimEvent *event)
{GNode *node = NULL;g_return_val_if_fail (directive, FALSE);g_return_val_if_fail (SIM_IS_DIRECTIVE (directive), FALSE);g_return_val_if_fail (!directive->_priv->matched, FALSE);g_return_val_if_fail (directive->_priv->rule_curr, FALSE);g_return_val_if_fail (directive->_priv->rule_curr->data, FALSE);g_return_val_if_fail (SIM_IS_RULE (directive->_priv->rule_curr->data), FALSE);g_return_val_if_fail (event, FALSE);g_return_val_if_fail (SIM_IS_EVENT (event), FALSE);
我们必须对照backlog中的所有规则节点检查事件,除了根节点,因为它签入了sim_directive_match_by_event是从sim_organizer_correlation调用的
node = directive->_priv->rule_curr->children; while (node) {SimRule *rule = (SimRule *) node->data; if (sim_rule_match_by_event (rule, event)){g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event; sim_rule_match_by_event: True");time_t time_last = time (NULL);directive->_priv->rule_curr = node; // 每次事件匹配时,该指令都下一级到匹配的节点。下次将根据此级别检查事件。
FIXME: 父节点中可能存在内存泄漏.
directive->_priv->time_last = time_last;
directive->_priv->time_out = sim_directive_get_rule_curr_time_out_max (directive);//这里我们将事件中的各个字段分配到规则中,所以每次我们进入规则时,我们可以看到匹配的事件.
sim_rule_set_event_data (rule, event); sim_rule_set_time_last (rule, time_last); if (!G_NODE_IS_LEAF (node)){GNode *children = node->children; while (children){SimRule *rule_child = (SimRule *) children->data;sim_rule_set_time_last (rule_child, time_last);sim_directive_set_rule_vars (directive, children);children = children->next;g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: There are childrens in %d directive", directive->_priv->id);}} else{directive->_priv->matched = TRUE;g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: The directive %d has matched", directive->_priv->id);} return TRUE;} else{g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: sim_rule_match_by_event: False");}node = node->next;} return FALSE;
}
本篇文章部分内容参考或转载自下列文章及书籍。侵权即删。
参考书籍:
- 《开源安全运维平台OSSIM疑难解析(入门篇)》——李晨光著
- 《开源安全运维平台OSSIM疑难解析(提高篇)》——李晨光著
- 《开源安全运维平台:OSSIM最佳实践》——李晨光著
参考文章:
- https://blog.51cto.com/chenguang/2426473
- https://blog.csdn.net/lcgweb/article/details/101284949
- https://blog.51cto.com/chenguang/1665012
- https://www.cnblogs.com/lsdb/p/10000061.html
- https://blog.51cto.com/chenguang/1691090
- https://blog.51cto.com/chenguang/category10.html
- https://blog.51cto.com/topic/ossim.html
- https://blog.csdn.net/isinstance/article/details/53694361
- https://blog.51cto.com/chenguang/1332329
- https://www.cnblogs.com/airoot/p/8072727.html
- https://blog.51cto.com/chenguang/1738731
- https://blog.csdn.net/security_yj/article/details/120153992
上一篇:OSSIM开源安全信息管理系统(十四)
下一篇:
OSSIM开源安全信息管理系统(十五)相关推荐
- OSSIM开源安全信息管理系统(六)
2021SC@SDUSC (接上一篇文章:) __daemonize__(self) : 守护进程方法 如果收到信号 signal.SIGTERM(终止进程),调用 self.stop 当用户输入 k ...
- OSSIM开源安全信息管理系统(十六)
2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...
- OSSIM开源安全信息管理系统(十四)
2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...
- OSSIM开源安全信息管理系统(十二)
2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...
- OSSIM开源安全信息管理系统(十)
2021SC@SDUSC 一.Framework 部分源码分析 (接上一篇文章) def __shouldRunBackup(self) : 该函数的主要功能为检查是否开始运行备份操作 备份时间:默认 ...
- OSSIM开源安全信息管理系统(一)
2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...
- OSSIM开源安全信息管理系统(二)
2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...
- OSSIM开源安全信息管理系统(九)
2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...
- OSSIM开源安全信息管理系统(十七)
2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...
最新文章
- java图片序列化_Java中的强大武器——对象的序列化
- jquery 和js 还有 jq 挂事件
- python 进度条_Python小程序系列——动态进度条(1)
- vector机器人 HOW TO RESET, ERASE AND RESTORE VECTOR 如何重置,删除和恢复向量
- 解决beautifulsoup代码无效问题
- 杨校老师课堂之Java类与对象、封装、构造方法
- weka 学习总结(持续)
- pythonweb接口优化_python-web后台限制接口调用频率
- android的辅助代码,跟App相关的Android辅助类
- Mybatis-plus 将字段更新为null
- mybatis--关于接口参数注解的几个小问题
- CorelDRAW最好用免费稳定版本win,mac版本做图设计使用技巧教程
- (35)zabbix Event acknowledgment事件确认
- 家里可以装网吧无盘服务器吗,我在家里想装个网吧系统,求好的网吧系统。请专业的来个连接我...
- 类型多样的电子数码免抠元素素材,速来收藏
- 机器人聊天软件c#_我的C#之路之简单的聊天机器人。
- php 微盟,微盟开放授权并获取ACCESS_TOKEN方法(新版)
- 打印机有重影 校正对齐喷头
- Ardupilot 增加一个mavlink消息(翻译官网)
- 利用VBA给Excel或WPS表格添加自定义函数(如方位角函数)