我有40多个不同的IDA签名文件(内置文件除外),有时我不想麻烦检查哪些签名可能与给定目标有关。相反,我只想一次应用所有签名,并让IDA告诉我哪些签名在目标中最匹配。手动执行此操作非常繁琐,因为


IDA仅允许在每个应用操作中应用1个签名。
签名的应用顺序会影响给定签名生成多少个匹配项。例如,当应用sig A时,可能意味着sig B错过了A之前已匹配的某些匹配项。 ,计数匹配,然后删除sig A的应用并应用B,计数匹配,然后删除应用程序并应用C,依此类推。

没有其他人有这个想法吗?我一直找不到能做到这一点的插件或脚本,如果有一个插件或脚本,我宁愿不写自己的插件。

#1 楼

如果您谈论的是IDA FLIRT签名,那么不幸的是,迟早您可能会遇到它们的局限性,或者,如果想要高精度,会对结果感到沮丧。

首先,您可以了解IDA的系统在此处详细了解:
https://www.hex-rays.com/products/ida/tech/flirt/in_depth.shtml

您可以看到它仅与前32个字节匹配函数。
然后使用CRC16,因此有很大的冲突机会。

FLIRT的最大问题是它非常模棱两可。
容易出现错误匹配。并且,或者,如果匹配函数的前32个字节没有更改,但其余部分仍将匹配。这通常是一件好事,但其行为却是不可预测的。
此外,IDA中的系统缺少一个最小的UI。
例如,如果IDA跟踪并向您显示匹配项和不匹配项的列表,那就很好了。
虽然据说在6.4中他们会检查并更新设置,所以它可能已经改善。

现在还不可怕;总比没有好,总的来说,它非常有用。
但是由于这些问题,您可能需要自己做。

我制作了自己的签名系统,该系统遍历每个功能源签名目标的对象并复制所有非相对字节(即,IE跳过JMP,MOV,CALL指令等的偏移字节),并对整个对象进行64位哈希处理。
我只保存唯一的用户命名函数并跳过较小的函数(在字节数截止点以下)。保存冗余签名没有意义。

通过这种方式,我知道以后如果我有一场比赛,那就更有可能是一场出色而独特的比赛。
它更准确,而且很少有虚假和多余比赛的机会。
/>同样,它是通过一个插件完成的,该插件的速度与IDA自己的sig系统差不多,甚至更快。它还允许我添加所需的UI列表,包括匹配项,不匹配项,统计信息等。

评论


优秀的!那被释放了吗?我正在使用您的几个插件,但我不相信我会记得这样的插件。

– johnrl
2014年2月5日在10:36

#2 楼

您可能可以使用快照通过插件来实现此目的。我不认为数据库快照功能是在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时所做的更改。 br />
希望能使您走上正确的轨道

#3 楼

如果您在一个IDA数据库中重命名了Sub_Routines,则有一个名为BinDiff的插件,您可以在当前的IDA和尚未重构的新数据库之间运行BinDiff。唯一的缺点是,大小超过30mb的二进制文件会浪费一些时间。

http://i.imgur.com/dTPEyHq.png

评论


BinDiff是通用的差异引擎。它与我上面所描述的没有任何相似之处。您仍然需要在EAC /数据库对上手动比较和应用签名,这是我要避免的。

– johnrl
2014年1月30日9:52