如何检查二进制文件是否由相同或相似源代码编译生成
非可复现构建场景下的二进制同源性校验方法
不可复现构建的正常差异范围
不可复现构建产生的合法差异通常仅占二进制总大小的 0.1%~5%,所有差异都属于非功能性的元数据或编译随机值,不会修改代码逻辑,常见差异类型包括:
- 构建嵌入信息:时间戳、构建机器路径、官方构建编号、版本标记
- 编译器随机输出:部分版本编译器的栈保护canary随机值、符号随机重排的结果、寄存器分配的微小差异
- 环境差异:编译环境的依赖库小版本差异、系统头文件宏定义差异带来的符号偏移变化
这些差异不会改变程序的控制流结构、函数调用关系和核心指令语义,和恶意插入的代码有非常明确的区分边界。
二进制比对的操作方案
不要直接用diff、cmp这类原始字节比对工具,要做结构化二进制差异分析,操作步骤如下:
- 先预处理两个比对样本(官方样本和待测样本):剥离调试信息、注释段、
.note段里的构建元数据,消除已知的固定差异点 - 提取两侧的
.text可执行代码段,比对函数级的控制流图结构:相同源码编译出的函数,基本块拆分、跳转逻辑、调用关系完全一致,只有少量立即数、偏移地址会有差异 - 用结构化比对工具做函数语义相似度匹配:正常同源函数的相似度普遍高于95%,如果出现相似度低于80%的函数,或是存在不在官方源码函数清单内的新增函数,就可以判定存在外来代码插入。
结论
按照上述流程执行规范的二进制diff操作,可以达到99%以上的置信度,确认二进制是否被插入未授权的外来代码。不可复现构建的常规微小差异不会对判定结果产生干扰,恶意插入的代码必然会留下新增函数、修改原有控制流的可识别特征。
内容的提问来源于stack exchange,提问作者hungrykitten
相关产品推荐
相关产品推荐

