1.4.4 Database模块Ⅰ. Database 模块设计 在正式实现之前,我们先明确 Database 模块的职责与对外接口。为了给CoreEngine模块提供访问我们设计的Sqlite3病毒数据库的接口,我们应该在Database模块下提供这些接口:intdb_lookup_sha256(constchar*sha256_hash)SHA-256检索接口:用于在病毒库中检索指定的SHA-256值是否存在。返回值:命中返回1,未命中返回0,错误返回-1intdb_load_signatures(SignatureEntry**out_sigs, int*out_count)这里的 SignatureEntry 是我们自己定义的结构体,在后续部分会详细说明。特征码读取接口:用于读取病毒库内的所有特征码并返回字符串数组指针与数量,提供给引擎比对检测。返回值:成功返回0,失败返回-1Ⅱ. Database 模块实现 在设计好Database模块后,我们接下来将着手实现这个模块。首先我们来实现最简单的db_lookup_sha256函数。db_lookup_sha256函数的流程非常简单,下面的图片就很好的解释的这个函数的工作流程: 首先我们在函数内初始化sqlite3连接:sqlite3*virus_db=NULL;
intret=0;
// 尝试打开数据库
ret=sqlite3_open(VIRUS_DB_PATH, &virus_db);
if(ret!=SQLITE_OK)
// 打开失败,输出错误信息并返回-1
fprintf(stderr,"Cannot open the Virus database :%s\n",sqlite3_errmsg(virus_db));
sqlite3_close(virus_db);
return-1;
} 接下来我们需要构建查询SQL语句,这里我们需要用sqlite3_prepare_v2接口来编译我们的SQL语句,同时使用sqlite3_bing_text绑定参数:constchar*sql="SELECT COUNT(*) FROM virus_sha256 WHERE sha256 = ?;";
sqlite3_stmt*stmt=NULL;
// 编译SQL语句
ret=sqlite3_prepare_v2(virus_db, sql, -1, &stmt, NULL);
if(ret!=SQLITE_OK)
// 编译失败,输出错误信息并返回-1
fprintf(stderr, "SQL prepare failed: %s\n", sqlite3_errmsg(virus_db));
sqlite3_close(virus_db);
return-1;
// 绑定查询参数
sqlite3_bind_text(stmt, 1, sha256_hash, -1, SQLITE_TRANSIENT); 使用参数绑定方法构建SQL语句可以有效防止SQL注入的风险。参数绑定方式将查询条件作为参数传递,而不是把查询条件拼接入SQL语句中,可以有效防止恶意内容被解释为SQL语法的一部分,从而规避SQL注入攻击。 最后提交查询并返回结果:// 执行查询
ret=sqlite3_step(stmt);
if(ret==SQLITE_ROW)
// 获取查询结果条数
intcount=sqlite3_column_int(stmt, 0);
sqlite3_finalize(stmt);
sqlite3_close(virus_db);
returncount>0?1 : 0;
//查询失败
sqlite3_finalize(stmt);
sqlite3_close(virus_db);
return-1; 以上就是db_lookup_sha256的全部实现过程,下面的是整合代码:intdb_lookup_sha256(constchar*sha256_hash)
sqlite3*virus_db=NULL;
intret=0;
// 尝试打开数据库
ret=sqlite3_open(VIRUS_DB_PATH, &virus_db);
if(ret!=SQLITE_OK)
// 打开失败,输出错误信息并返回-1
fprintf(stderr,"Cannot open the Virus database :%s\n",sqlite3_errmsg(virus_db));
sqlite3_close(virus_db);
return-1;
constchar*sql="SELECT COUNT(*) FROM virus_sha256 WHERE sha256 = ?;";
sqlite3_stmt*stmt=NULL;
// 编译SQL语句
ret=sqlite3_prepare_v2(virus_db, sql, -1, &stmt, NULL);
if(ret!=SQLITE_OK)
// 编译失败,输出错误信息并返回-1
fprintf(stderr, "SQL prepare failed: %s\n", sqlite3_errmsg(virus_db));
sqlite3_close(virus_db);
return-1;
// 绑定查询参数
sqlite3_bind_text(stmt, 1, sha256_hash, -1, SQLITE_TRANSIENT);
// 执行查询
ret=sqlite3_step(stmt);
if(ret==SQLITE_ROW)
// 获取查询结果条数
intcount=sqlite3_column_int(stmt, 0);
sqlite3_finalize(stmt);
sqlite3_close(virus_db);
returncount>0?1 : 0;
//查询失败
sqlite3_finalize(stmt);
sqlite3_close(virus_db);
return-1;
} 接下来我们再回顾一下db_loa
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-291026.htm
[原创]从零构建杀毒引擎系列之扫描器核心逻辑设计与实现(下)
189 浏览
0 回复
暂无回复,快来抢沙发吧!