序
看到google开源的一款2进制代码比较工具bindiff, 这软件以前还是商业版,google收购了人家的公司,现在变成免费版本了.
这工具主要用来比较增量的可执行文件里面汇编代码的差异, 软件的原始设计目的是比较MS的patch文件.
下载点
初级使用方法
软件是java写的,先安装jre-8u131-windows-x64.exe
将java_home和path设置好。
JAVA_HOME=D:\Program Files\Java\jre1.8.0_131\
path += %JAVA_HOME%\bin
软件要比对的是IDA的idb文件,先安装IDA6.8.
安装bindiff, 安装文件为bindiff420-win-x86.msi
将bindiff420-win-pluginsonly.zip和bindiff-license-key.zip中的文件释放到bindiff420安装目录下的bin目录.
假设要分析的代码(假设这工程是第三方的)如下
// testcase0510a.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
void fnTest(int iIn);
int main()
{
fnTest(rand());
printf("END\n");
system("pause");
return 0;
}
void fnTest(int iIn)
{
// if ((iIn > 0x100) && (0 == (iIn % 2))) // v1
if ((iIn > 90) && (iIn <= 100) && (0 == (iIn % 2))) { // v2 这行算法升级了, 这里是增量的修改
printf("luck\n");
}
else {
printf("oh, no\n");
}
}
用IDA打开2个增量的exe, 分析完后,形成2个idb
testcase0510a_v1.exe => testcase0510a_v1.idb
testcase0510a_v2.exe => testcase0510a_v2.idb
运行bindiff.cmd,启动UI.
建立工作区
增加新比较
找增量的函数
对于本实验,只找相似度高,但是不一样的函数,不勾选”Show identical”, 马上就找到了, 就一个函数。
打开图形模式看代码增量的反汇编
当找到增量的函数时,函数地址已经知道了。这时,如果用打开2个IDA直接看反汇编,也是可以的。但是bindiff更专业,看完bindiff的分析,再去用IDA分析,思路更清晰。
bindiff将增量的代码用黄框围起,说明是不同的代码。
绿色的代码框内是相同的代码。
比较黄色代码和上下文逻辑可以看出增量的代码功能。
v1版本:当入参<=0x100时,走失败流程。
v2版本 : 失败流程判断与v1不同,具体由调试器动态分析和IDA静态分析相结合来决定逻辑实现。
总结
这工具相当好用,不管是第三方的增量还是自己开发的程序,找不同点都非常容易。
工作任务中,经常有这个版本好使,下个版本不好使了,那到底哪的代码实现被改挫了呢,一目了然。不用去一步一步的单步了.