论坛首页 恶意代码分析区 阅读主题

[原创]从零构建杀毒引擎系列之扫描器核心逻辑设计与实现(下)

189 浏览 0 回复
#1 楼主 2026-06-01 21:08:51
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

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号