您可以使用快照从插件中实现这一点。我认为 IDC 或 IDAPython 中没有公开数据库快照功能。
新打开的数据库上的通用算法将类似于
libs_before = iterate over all functions to determine initial count of library functions
snapshot_t ss;
::qstrncpy(ss.filename, "tempsnap", 9);
qstring errmsg;
take_database_snapshot(&ss, &errmsg);
//use platform directory iterator on IDA sigs directory
for i in list_of_sig_files
int signum = plan_to_apply_idasgn(i);
while (i--) {
apply_idasgn(1); //may need to play around with this
}
libs_after = iterate over all functions to determine count of library functions after sigs applied
msg("%d signatures matched from %s\n", libs_after - libs_before, i);
restore_database_snapshot(&ss), mycb, NULL);
其中最小值mycb
是:
void idaapi mycb(const char *errmsg, void *ud) {}
显然有一些代码需要你填写,但这个想法是在二进制文件中获取库函数的初始计数并拍摄快照。接下来遍历所有 sig 文件的名称并依次应用每个文件。在应用每个签名文件之后,在数据库中生成新的库函数计数。新计数和原始计数之间的差异是签名匹配的数量。最后恢复到您在应用 sig 时回滚所做更改的快照。
您可以通过迭代所有函数(请参阅get_next_func
)并对每个返回的函数进行func_t *f
检查来计算库函数的数量(f->flags & FUNC_LIB) != 0
。
希望这能让你走上正轨