OSSIM开源安全信息管理系统(十五)
Posted 陌兮_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OSSIM开源安全信息管理系统(十五)相关的知识,希望对你有一定的参考价值。
2021SC@SDUSC
五、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最佳实践》年终 五折 优惠活动开始啦!