一、说明

大概一两年前在《漏洞战争:软件漏洞分析精要》听到bindiff(和补丁比较法),但一直都没去使用。前两天再回头看书感觉需要使用一翻,整个过程下来还是遇到了一些问题,值得记录一番。

二、安装

2.1 jdk安装

bindiff是一款java程序,因此需要安装jdk,我装的是jdk1.8其他版本兼容性不太清楚。

jdk下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

2.2 ida安装

bindiff需要借助ida pro进行分析,所以需要安装ida pro。官方说明需要6.8及以上版本,但7.x版本也尚不支持。

ida pro安装可参考:https://www.cnblogs.com/lsdb/p/7500981.html

2.3 bindiff安装

下载地址:https://www.zynamics.com/software.html

bindiff同时支持windows、linux、mac;bindiff5只能装在win8和win10上;下载链接不明显但是是有链接的,直接中键点击文件名处即可下载。

双击运行安装程序

接受协议

选择安装组件和路径

指出自己ida pro安装的目录

确认安装

安装完成

三、bindiff使用

3.1 编写比较程序

我这里使用cfree创建两个控制台项目bindiff1和bindiff2,分另写入以下两分代码并各自编译。代码的区别就只是把if语句的大于号改为小于号。

bindff1代码:

# include <stdio.h>
int main(){
int a = ;
if (a > ){
printf("if brance\n");
}
else{
printf("else brance\n");
}
getchar();
}

bindff2代码:

# include <stdio.h>
int main(){
int a = ;
if (a < ){
printf("if brance\n");
}
else{
printf("else brance\n");
}
getchar();
}

3.2 使用ida创建数据库

bindiff不能直接分析exe程序,而只能先使用ida pro的.i64数据库基础上进行分析。

因此需要先用ida pro分别打开bindiff1.exe和bindiff2.exe再关闭,以创建.i64数据库。

3.3 bindiff载入文件并比较

到安装目录bin文件夹下双击bindiff.jar即可启动bindiff,界面如下:

主菜单----Diffs----New Diff

先后载入bindffi1.i64和bindiff2.i64,点击Diff进行比较

32位操作系统应该成功载入,64位操作系统可能会报错:“Can't find Diff engine at '...\differ64.exe'”

看意思是differ64.exe找不到,打开bindiff安装目录的bin文件夹,将bindiff.exe复制一份命名为bindiff64.exe,此时再重新载入比较即可。

Call Graph----两个文件的函数调用图

Matched Functions----两个文件的函数匹配度

Primary Unmatched Functions----

Secondary Unmatched Functions----

bindiff的主要简单使用是双击打开"Matched Functions"项,按相似度(Similarity)从低到高排序,相似度不为1的函数即为两个文件被改动的位置。

由上图可以看到,bindiff1.exe和bindiff2.exe只有_main相似度不为1,双击_main打开, 两个函数不同的位置会被以有底色形式标出

如下图可以看到只有一条指令不同:bindiff1.exe是"jle 0x401335"(小于等于则进入else)而bindiff2是“jg 0x401335”(大于则进入else)

由此我们可以推断出bindiff2.exe相对于bindiff1.exe做的改动是:bindiff1.exe是"if > else"而bindiff2.exe是"if < else"。与我们的改动完全一致。

3.4 将bindiff以ida插件形式使用

在上边的操作中我们需要先用ida打开文件创建数据库,再使用bindiff打开比较,这是比较麻烦的。bindiff允许直接以ida插件的形式使用。(在安装bindiff时已同步安装为插件所以不需要另行安装)

先使用ida打开bindiff1.exe,然后使用“Ctrl+6”打开窗口,如下图所示

点击“Diff Database...”载入bindiff2.i64。如下图,仍是类似单独使用时的那几个窗口。当然这只是简单查看比较最后还是要打开bindiff。

3.5 bindiff使用注意点

第一点,相同的高级语言代码使用不同编译器编译出来的内容是有区别的。比如我这里使用cfree编译,倘若同样的代码你用VC++去编译那函数数量可能会多不少。但当然识别出的改动位置还是一个意思的。

第二点,相同的高级语言代码使用相同编译器不同的编译模式编译出来的内容是有区别的。比如VC++优化模式和普通模式编译出的汇编代码是有区别的。

第三点,bindiff只能识别出汇编指令的区别不能识别出汇编指令操作数的区别。即如上边“jle 0x401335”和“jg 0x401335”会被不同底色标出,但如果是“jle 0x401335”和“jle 0x401336”那将不会被标出。

参考:

https://www.zynamics.com/bindiff/manual/index.html

BinDiff安装使用教程的更多相关文章

  1. IntelliJ IDEA - 热部署插件JRebel 安装使用教程

    IntelliJ IDEA - JRebel 安装使用教程 JRebel 能做什么? JRebel 是一款热部署插件.当你的 Java-web 项目在 tomcat 中 run/debug 的时候 , ...

  2. Zabbix3.x安装图解教程

    准备知识: Zabbix3.x比较之前的2.0界面有了很大的变化,但是安装部署过程与2.x基本完全一样. 1.Zabbix2.x安装图解教程 http://www.osyunwei.com/archi ...

  3. VMware vCenter Server安装图解教程

    安装说明: 1.安装VMware vCenter Server的主机操作系统为:Windows Server 2008 R2 2.在Windows Server 2008 R2中需要预先安装好SQL ...

  4. 在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程

    在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程 本教程提供PDF格式下载: 在RedHat.Enterprise.Linux_v6.3系统中安装Ora ...

  5. Zabbix安装图解教程

    说明: 操作系统:CentOS IP地址:192.168.21.127 Web环境:Nginx+MySQL+PHP zabbix版本:Zabbix 2.2 LTS 备注:Linux下安装zabbix需 ...

  6. MapGIS6.7安装图文教程(完美破解)

    mapgis安装比较简单,主要注意在安装的时候,先打开软件狗,然后再进行软件安装,一般就不会照成其他安装失败的现象,有时候安装之前没有打开软件狗也安装成功了,也有这情况,不过软件使用也需要软件狗的支持 ...

  7. VirtualBox安装Ubuntu教程

    1.VirtualBox虚拟机安装,及VirtualBox安装Ubuntu教程VirtualBox版本为VirtualBox-4.3.12-93733-Win.exe,Ubuntu版本为ubuntu- ...

  8. MySQL5.0版本的安装图解教程

    MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本. mysql 下载地址 http://www.jb51.net/softs/2193.html 下面的是M ...

  9. ENVI5.1安装破解教程

    原文地址:  ENVI5.1安装破解_百度经验 http://jingyan.baidu.com/article/020278118b5ded1bcd9ce57a.html   ENVI5.1_x86 ...

随机推荐

  1. 初学javascript《一》break和continue的标签问题

    <script>var iNum = 0;outermost:for (var i=0; i<3; i++) {   for (var j=0; j<3; j++) {     ...

  2. Redis的持久化

    Redis的持久化有两种方式: RDB方式(默认支持):在指定的时间间隔内将内存中的数据集快照写入磁盘 优势 整个Redis数据库将只包含一个文件,对于文件备份来说是完美的,系统出现灾难性的故障时容易 ...

  3. SQLSERVER 查询系统中的所有表的数量

    SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE (a.type = ...

  4. Python Iterables Iterators Generators

    container 某些对象包含其它对象的引用,这个包含其它对象引用的对象叫容器.例如list可以包含int对象,或者由其它数据类型(或数据结构)的对象组成一个list. 对其他对象的引用是容器值的一 ...

  5. 复旦大学2018--2019学年第一学期(18级)高等代数I期末考试第七大题解答

    七.(本题10分)  设 $V$ 为 $n$ 维线性空间, $\varphi,\psi$ 是 $V$ 上的线性变换, 满足 $\varphi\psi=\varphi$. 证明: $\mathrm{Ke ...

  6. iOS 与 Swift 方法互相调用

    1.OC调用swift 在OC项目中创建一个swift文件时,Xcode会提示 需要创建一个桥接文件,点击确定创建桥接文件,Xcode会自动创建一个桥接文件,名字:工程名-Bridging-Heade ...

  7. P5245 【模板】多项式快速幂

    思路 调了半天发现ln忘了清空数组了... 就是这个式子 \[ A^k(x) \equiv e^{k{\ln (A(x)) }} \] 代码 #include <cstdio> #incl ...

  8. 【NOIP2015普及组】推销员_详解

    题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...

  9. nDPI-dev分析

    目前在 分为两个层次:其一是应用分析,学会如何使用:其二是原理分析,看懂它如何实现. 1. 打包该数据帧,搜集l3.l4层报头信息 2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型) ...

  10. Redhat更换yum源

    redhat 默认自带的 yum 源需要注册,才能更新,所以对于我们来说需要替换掉redhat的yum源.下文更换为网易的. 删除原有的yum rpm -qa|grep yum|xargs rpm - ...