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 开头的,例如 gintgboolean 等。

之前接触 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开源安全信息管理系统(十五)相关推荐

  1. OSSIM开源安全信息管理系统(六)

    2021SC@SDUSC (接上一篇文章:) __daemonize__(self) : 守护进程方法 如果收到信号 signal.SIGTERM(终止进程),调用 self.stop 当用户输入 k ...

  2. OSSIM开源安全信息管理系统(十六)

    2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...

  3. OSSIM开源安全信息管理系统(十四)

    2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...

  4. OSSIM开源安全信息管理系统(十二)

    2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...

  5. OSSIM开源安全信息管理系统(十)

    2021SC@SDUSC 一.Framework 部分源码分析 (接上一篇文章) def __shouldRunBackup(self) : 该函数的主要功能为检查是否开始运行备份操作 备份时间:默认 ...

  6. OSSIM开源安全信息管理系统(一)

    2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...

  7. OSSIM开源安全信息管理系统(二)

    2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...

  8. OSSIM开源安全信息管理系统(九)

    2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...

  9. OSSIM开源安全信息管理系统(十七)

    2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...

最新文章

  1. java图片序列化_Java中的强大武器——对象的序列化
  2. jquery 和js 还有 jq 挂事件
  3. python 进度条_Python小程序系列——动态进度条(1)
  4. vector机器人 HOW TO RESET, ERASE AND RESTORE VECTOR 如何重置,删除和恢复向量
  5. 解决beautifulsoup代码无效问题
  6. 杨校老师课堂之Java类与对象、封装、构造方法
  7. weka 学习总结(持续)
  8. pythonweb接口优化_python-web后台限制接口调用频率
  9. android的辅助代码,跟App相关的Android辅助类
  10. Mybatis-plus 将字段更新为null
  11. mybatis--关于接口参数注解的几个小问题
  12. CorelDRAW最好用免费稳定版本win,mac版本做图设计使用技巧教程
  13. (35)zabbix Event acknowledgment事件确认
  14. 家里可以装网吧无盘服务器吗,我在家里想装个网吧系统,求好的网吧系统。请专业的来个连接我...
  15. 类型多样的电子数码免抠元素素材,速来收藏
  16. 机器人聊天软件c#_我的C#之路之简单的聊天机器人。
  17. php 微盟,微盟开放授权并获取ACCESS_TOKEN方法(新版)
  18. 打印机有重影 校正对齐喷头
  19. Ardupilot 增加一个mavlink消息(翻译官网)
  20. 利用VBA给Excel或WPS表格添加自定义函数(如方位角函数)

热门文章

  1. 健身房管理系统(开发项目)
  2. 设计模式六大原则(6)开闭原则(Open Close Principle)
  3. Okhttp上传文件实现
  4. python字符位运算_python 字符串位运算-女性时尚流行美容健康娱乐mv-ida网
  5. C#陈广自学视频笔记3——namespace
  6. 实现Log4j和Logback的统一日志封装与动态日志级别调整
  7. 初级会计考试的通过率有多少?
  8. 计算机和微型计算机有什么不同,小型计算机和微型计算机是同一个吗?
  9. 计算机网络与互联网 北京交通大学 期末考试2020春
  10. GPU DCU 移植