zoukankan      html  css  js  c++  java
  • 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

    先写到这了,要关门了。

  • 相关阅读:
    mfc中的_T
    zmq的send
    c++内存相关函数
    如何运行linux shell程序
    Dockfile中的命令如何在.sh中执行
    Linux 错误: $' ': command not found
    实战ZeroMQ的PUSH/PULL推拉模式
    Servlet笔记
    进程控制块(PCB)
    Makefile规则介绍
  • 原文地址:https://www.cnblogs.com/zw2002/p/8311614.html
Copyright © 2011-2022 走看看