use bindiff to diff patch

本文介绍了一款由Google开源的二进制代码比较工具Bindiff,该工具主要用于对比可执行文件中汇编代码的变化,尤其适用于分析软件补丁的差异。文章详细介绍了Bindiff的安装配置过程及基本使用方法,并通过一个示例展示了如何使用Bindiff快速定位代码的修改之处。

看到google开源的一款2进制代码比较工具bindiff, 这软件以前还是商业版,google收购了人家的公司,现在变成免费版本了.

这工具主要用来比较增量的可执行文件里面汇编代码的差异, 软件的原始设计目的是比较MS的patch文件.

下载点

google-bindiff420-win-x86.zip

初级使用方法

软件是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静态分析相结合来决定逻辑实现。

总结

这工具相当好用,不管是第三方的增量还是自己开发的程序,找不同点都非常容易。
工作任务中,经常有这个版本好使,下个版本不好使了,那到底哪的代码实现被改挫了呢,一目了然。不用去一步一步的单步了.

### 如何生成和应用 `diff` 的 `patch` 文件 #### 生成 `patch` 文件 在 Linux 或 Git 中,可以通过多种方法生成 `patch` 文件。 1. **使用 `git diff` 命令** 当前工作目录与暂存区之间的差异可以通过 `git diff` 来捕获并保存到 `.patch` 文件中。 ```bash git diff > my_patch.patch ``` 此命令会将未提交的更改导出为一个补丁文件[^1]。 2. **使用 `git format-patch` 命令** 如果需要针对已提交的历史记录生成补丁,则可以使用 `git format-patch`。例如,生成最近一次提交对应的补丁: ```bash git format-patch -1 HEAD ``` 上述命令会在当前目录下生成类似于 `0001-commit-message.patch` 的文件[^1]。 3. **使用标准 `diff` 工具** 对于非版本控制下的文件或目录,可以直接通过 `diff` 命令生成补丁文件。以下是两种常见场景: - 单个文件间的差异: ```bash diff -u old_file new_file > changes.patch ``` - 整个目录结构的变化: ```bash diff -urN dir1 dir2 > directory_changes.patch ``` #### 应用 `patch` 文件 一旦生成了 `patch` 文件,就可以将其应用于目标环境。 1. **使用 `patch` 命令** 针对普通的 `diff` 补丁文件,可采用如下方式应用: ```bash patch -p1 < path/to/my_patch.patch ``` 参数 `-p1` 意味着忽略路径的第一层目录信息[^2]。 2. **使用 `git apply` 命令** 若补丁来源于 Git 版本控制系统,则推荐使用 `git apply` 方法: ```bash git apply my_git_patch.patch ``` 它能够更精确地处理由 Git 创建的补丁文件,并支持撤销操作(如 `git apply -R`)[^3]。 3. **冲突解决** 在某些情况下,可能遇到无法自动合并的情况。此时需手动编辑受影响区域以完成修复过程。具体步骤包括定位标记 (`<<<<<<<`, `=======`, `>>>>>>>`) 并决定保留哪些变更内容[^4]。 --- ### 示例代码 以下是一个完整的流程演示: ```bash # Step A: Generate a patch from uncommitted changes using git diff. git diff > example.patch # Step B: Apply the generated patch back to another repository or branch. patch -p1 < example.patch # Alternatively, use git apply for better compatibility with Git patches. git apply example.patch ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值