• cvechecker的源码分析


    cvechecker是用c语言写的,好多年没搞c了,上手比较费劲,经过几天终于弄了好demo。

    cvechecker是关键的地方是版本的获取。

    1、每一天文件cvecheck.c

    这个文件是主文件有main函数。

    initialize_arguments初始参数

    initialize_workstate初始化配置文件及数据库

    load_databases载入数据

    initialize_databases初始数据

    load_version_data载入版本数据

    get_installed_software这个是关键的地方,进入之后

    init_binlist初始化数据结构,主要是打开生成的命令文件

    clear_versiondatabase,清除版本数据:DELETE FROM tb_binmatch WHERE hostname = "controller" AND userdefkey = "controller";

    while(fgets(line, sizeof(line), ws->binlist) != NULL) 循环读取每一行数据,如果行过长报错误。

    接着对读到的行进行简单处理。

    process_binfile 这个比较重要,是对每一行进行处理:

    进入之后是一些基本的判断,包括文件的权限,是否是连接文件,然后是

    match_binary,得到文件的路径和文件名,然后进入

    mysql_dbimpl_process_binary

    MariaDB [cvechecker]> select v.filename as filename, v.filetype as filetype, v.filematch as filematch, v.contentmatch as contentmatch, c.cpepart as cpepart, c.cpevendor as cpevendor, c.cpeproduct as cpeproduct, c.cpeversion as cpeversion, c.cpeupdate as cpeupdate, c.cpeedition as cpeedition, c.cpelanguage as cpelanguage from tb_versionmatch v, tb_cpe c where v.cpe = c.cpeid and "git " between filename and filename || "z";
    +----------+----------+-----------+---------------------------+---------+-----------+------------+------------+-----------+------------+-------------+
    | filename | filetype | filematch | contentmatch | cpepart | cpevendor | cpeproduct | cpeversion | cpeupdate | cpeedition | cpelanguage |
    +----------+----------+-----------+---------------------------+---------+-----------+------------+------------+-----------+------------+-------------+
    | git | 1 | git$ | ^([0-9][0-9]*(\.[0-9]+)+) | a | git | git | \1 | | | |
    +----------+----------+-----------+---------------------------+---------+-----------+------------+------------+-----------+------------+-------------+
    1 row in set, 4 warnings (0.01 sec)

    首先查看库中是否有要查询的命令,如果有继续,没有返回。

    然后对查询结果进行处理,做一些匹配工作,这里有bug,然后进入

    strings_extract_version通过字符串获取版本信息,这个是重要的,通过配置文件中的string命令获取命令的二进制信息,

    buffer = substitute_variable(stringcmd, "@", "@", "file", file);

    根据匹配规则^([0-9][0-9]*(\.[0-9]+)+) 匹配出版本号

    rc = regexec(preg, data, 16, pmatch, 0);

    版本号存储在data当中,然后再存cpe->version中。

    search_and_substitute_group

    先写到这了,要关门了。

  • 相关阅读:
    谢惠民,恽自求,易法槐,钱定边编数学分析习题课讲义16.2.3练习题参考解答[来自陶哲轩小弟]
    高考题(可作为试讲资料)
    美国数学教父拒绝10亿美元 免费分享教学视频
    梁启超死亡真相:主刀医生错把健康的肾切除
    [家里蹲大学数学杂志]第418期南开大学2013年实变函数期末考试试题参考解答
    陆启铿同志去世
    [电视剧]养父的花样年华
    [电视剧]错爱一生
    [家里蹲大学数学杂志]第413期插值不等式
    Oracle的 EXEC SQL CONTEXT学习
  • 原文地址:https://www.cnblogs.com/zw2002/p/8311614.html
Copyright © 2020-2023  润新知