当前位置: 首页 > 工具软件 > cvechecker > 使用案例 >

cvechecker的源码分析

华瀚漠
2023-12-01

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

先写到这了,要关门了。

 

转载于:https://www.cnblogs.com/zw2002/p/8311614.html

 类似资料: