CN115016843B - 一种高精度的二进制代码相似性比对方法 - Google Patents
一种高精度的二进制代码相似性比对方法 Download PDFInfo
- Publication number
- CN115016843B CN115016843B CN202210566686.5A CN202210566686A CN115016843B CN 115016843 B CN115016843 B CN 115016843B CN 202210566686 A CN202210566686 A CN 202210566686A CN 115016843 B CN115016843 B CN 115016843B
- Authority
- CN
- China
- Prior art keywords
- function
- func
- num
- instructions
- simhash
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 37
- 238000004458 analytical method Methods 0.000 claims abstract description 7
- 230000006870 function Effects 0.000 claims description 405
- 238000000605 extraction Methods 0.000 claims description 23
- 238000012545 processing Methods 0.000 claims description 11
- 238000010586 diagram Methods 0.000 claims description 7
- 230000015654 memory Effects 0.000 claims description 6
- 238000012216 screening Methods 0.000 claims description 5
- 238000004364 calculation method Methods 0.000 claims description 4
- 238000011156 evaluation Methods 0.000 claims description 4
- 238000007781 pre-processing Methods 0.000 claims description 4
- 230000011218 segmentation Effects 0.000 claims description 3
- 238000010606 normalization Methods 0.000 claims description 2
- 230000007547 defect Effects 0.000 abstract description 5
- 239000000284 extract Substances 0.000 abstract description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 230000000694 effects Effects 0.000 description 2
- 101100217298 Mus musculus Aspm gene Proteins 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010367 cloning Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
- G06F8/751—Code clone detection
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种高精度的二进制代码相似性比对方法,属于代码比对领域。本发明利用SimHash算法进行比对检索,缩小二进制代码比对的范围,再利用二进制代码特征进行精准的相似性比对,实现二进制代码的快速、精确的比对,为二进制代码溯源、缺陷扫描分析提供支撑,满足不同场景下的二进制代码相似性比对的需求。本发明提出的方案,能够在兼顾对比效率的同时,保证二进制代码相似性比对的效率;本发明提取二进制代码函数特征,能够保证代码相似性比对的精确度;本发明采用基于SimHash的文本对比方法,能够提高二进制代码相似性比对的效率。
Description
技术领域
本发明属于代码比对领域,具体涉及一种高精度的二进制代码相似性比对方法。
背景技术
代码复用通常以函数为基本单位,即使被编译器高度优化仍然保留大量函数整体,所以,以函数为单位进行溯源更加符合复用场景。不同的编译器插入的函数与函数的插入位置均不同,需要大量经验与技巧能识别这些函数。复用函数对恶意代码分析与同源判定工作造成了很大干扰,目前,主要依靠恶意代码分析人员的经验识别,导致同源判定效率不高。快速识别复用函数将大大提高效率,并提升同源判定结论的可信度。
复用函数溯源的基础是相似函数判定,若在某样本中存在一个函数的相似函数,则说明该函数为复用函数。目前,大多相似函数判定技术具有很高的准确率与召回率,但是判定效率较低,不适应海量代码的复用函数溯源,一个函数源码的少量修改,编译选项、所在位置的不同都会造成逆向后汇编代码中指令顺序、寄存器、跳转位置等的差异,因此,若使散列等方法进行溯源将导致非常低的召回率。在函数中,代码块的跳转结构是相似判定的重要特征,而跳转关系提取、结构图的比对要耗费大量时间,是导致目前相似判定准确率、召回率与速度难以兼得的一个重要原因。
本方案提出了一种基于SimHash及函数特征的复用函数快速溯源方法。核心思想是先基于SimHash找到相似代码块缩小相似函数判定范围,再基于二进制代码特征的精确对比方法找出相似函数。
其中SimHash是局部敏感散列(LSH,localitysensitivehashing)算法的一种,最早由Charika等在2002年提出,谷歌的Manku等[18]在2007年将该算法用于海量相似网页去重,根据该算法为每个网页计算一个64bit的SimHash值,SimHash值的汉明距离在3以内的网页都认为是相似的,Manku还提出了基于抽屉原理的时间、空间均较优的特定汉明距离SimHash值的快速检索方法。目前,SimHash算法被应用在多个方面,尤其源代码克隆领域。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是如何提供一种高精度的二进制代码相似性比对方法,以解决二进制代码复用函数溯源、缺陷扫描中相似判定准确率、召回率与速度难以兼得的问题。
(二)技术方案
为了解决上述技术问题,本发明提出一种高精度的二进制代码相似性比对方法,该方法包括如下步骤:
S1、二进制代码反汇编及汇编代码预处理
通过对不同架构下指令集的解析,实现对多平台二进制代码的反汇编,生成不同架构下二进制代码的反汇编文件;依据汇编文件中的特殊标识,将汇编文件拆分成多个函数;依据函数中的跳转指令将函数切分为多个基本块;
S2、汇编代码标准化处理包括:依据规则对代码块中的指令进行标准化处理;
S3、汇编代码SimHash值计算
计算每个基本块对应的SimHash值;
S4、二进制代码的特征提取
提取二进制代码特征,包括基本块SimHash值、函数的SimHash值、函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量和函数的控制流图;
S5、构建代码特征关系库构架
建立文件信息表、函数信息表和基本块信息表,并建立相应的关系表;一个二进制文件包含至少一个函数、一个函数包含多个基本块,一条文件记录对应至少一条函数记录,一条函数信息记录对应多条基本块记录;
S6、基于文本相似性的二进制代码快速定位
待比较函数记为ObjFunc,比较ObjFunc与各函数的基本块,计算基本块的SimHash值之间的汉明距离,汉明距离小于3认为是相似基本块,将包含相似基本块比例超过一定阈值的函数记为相似函数;
S7、基于代码特征比对的代码相似性精确评估
选取函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图这13个特征进行比较,其中每个特征权重为1/13,筛选出相似函数中与待比较函数相似度最高的函数。
(三)有益效果
本发明提出一种高精度的二进制代码相似性比对方法,本发明具有以下技术效果:
(1)本发明提出的方案,能够在兼顾对比效率的同时,保证二进制代码相似性比对的效率;
(2)本发明提取二进制代码函数特征,能够保证代码相似性比对的精确度;
(3)本发明采用基于SimHash的文本对比方法,能够提高二进制代码相似性比对的效率。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合实施例,对本发明的具体实施方式作进一步详细描述。
本发明提供一种高精度的二进制代码相似性比对方法,利用SimHash算法进行比对检索,缩小二进制代码比对的范围,再利用二进制代码特征进行精准的相似性比对,实现二进制代码的快速、精确的比对,为二进制代码溯源、缺陷扫描分析提供支撑,满足不同场景下的二进制代码相似性比对的需求。
为解决二进制代码复用函数溯源、缺陷扫描中相似判定准确率、召回率与速度难以兼得的问题,本发明提出一种基于SimHash及函数特征的二进制代码相似性比对方案,通过基于SimHash找到相似代码块缩小相似函数判定范围,再基于二进制代码特征的精确对比方法找出相似函数,在兼顾对比效率的同时,保证二进制代码相似性比对的精准度,满足二进制代码复用函数溯源、缺陷扫描的实际应用需求。
为解决二进制代码复用函数溯源、缺陷扫描中相似判定准确率、召回率与速度难以兼得的问题,本发明提出一种基于SimHash及函数特征的二进制代码相似性比对方案,通过基于SimHash找到相似代码块缩小相似函数判定范围,再基于二进制代码特征的精确对比方法找出相似函数,提高二进制代码相似性比对的效率的精确度,主要内容包括:
S1、二进制代码反汇编及汇编代码预处理
通过对不同架构下指令集的解析,实现对多平台二进制代码的反汇编,生成不同架构下二进制代码的反汇编文件;依据汇编文件中的特殊标识,将汇编文件拆分成多个函数;依据函数中的jnz、jmp等跳转指令将函数切分为多个基本块。
S2、汇编代码标准化处理包括:依据规则对代码块中的指令进行标准化处理,以忽略由寄存器、内存地址等的不同造成的差异。
S3、汇编代码SimHash值计算
SimHash是局部敏感散列(LSH,locality sensitive hashing)算法的一种,计算每个基本块对应的SimHash值。
S4、二进制代码的特征提取
为保证二进制代码相似性比对的精确度,通过提取二进制代码特征,包括基本块SimHash值、函数的SimHash值、函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令(Branch Instruction)数目、函数的comp(Comp Instruction)指令数目、函数的Assign(Assign Instruction)指令数目、函数的bit(Bit Instruction)指令数目、函数的arithmatic(arithmatic Instruction)指令数目、函数的stack(stack Instruction)指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图等。提高二进制代码相似性比对的精确度。
S5、构建代码特征关系库构架
建立文件信息表、函数信息表、基本块信息表,并建立相应的关系表。一个二进制文件包含至少一个函数、一个函数包含多个基本块,因此一条文件记录对应至少一条函数记录,一条函数信息记录对应多条基本块记录。
S6、基于文本相似性的二进制代码快速定位
待比较函数记为ObjFunc,比较ObjFunc与各函数的基本块,计算基本块的SimHash值之间的汉明距离,汉明距离小于3认为是相似基本块,将包含相似基本块比例超过一定阈值(例如:50%)的函数记为相似函数。
SimHash值的汉明距离(对应位上数值不同的位数)在3以内的都可以认为相似,但是在海量的SimHash值列表中搜索汉明距离为3以内的SimHash值复杂度非常高,为提高效率,本发明提出兼顾时间与空间的多表索引方法。包括建立基本块SimHash表、查询基本块、代码块SimHash距离计算。
S7、基于代码特征比对的代码相似性精确评估
选取函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图等13个特征进行比较,其中每个特征权重为1/13,筛选出与待比较函数相似度最高的函数。
实施例1:
本发明提出一种基于SimHash及函数特征的二进制代码相似性比对方案,通过基于SimHash找到相似代码块缩小相似函数判定范围,再基于二进制代码特征的精确对比方法找出相似函数,提高二进制代码相似性比对的效率的精确度。
S1、二进制代码反汇编及汇编代码预处理
S11、通过对不同架构下指令集的解析,实现对Arm、PowerPC、X86等平台二进制代码的反汇编,实现不同架构下二进制代码的反汇编文件生成,表示为ASM;
S12、依据汇编文件标识,将其拆分成多个函数,函数用Func表示,一个汇编文件表示为多个函数的集合ASM={Func1,Func2,……,Funcn};
S13、依据函数中的jnz、jmp等跳转指令将函数切分为多个基本块,用BB表示,每个函数表示为多个基本块的集合Func={BB1,BB2,……,BBm}。
S2、汇编代码标准化处理包括:对代码块中的指令进行标准化处理,以忽略由寄存器、内存地址等的不同造成的差异,代码块标准化处理规则如下:
(1)内存如[eax]、[edi+8]等均表示为Memory;
(2)立即数如0、384Dh表示为Value;
(3)寄存器如eax、ax、al等依据所占位数分别标准化为reg_32、reg_16、reg_18;
(4)call指令调用外部的系统库函数时指令不做处理,调用内部函数如“callsub_134B4”时规范化为“call sub_xxx”;
(5)跳转指令如“jz short loc_134B4”规范化为“jump loc_xxx”。
S3、通用的SimHash值计算方法
SimHash是局部敏感散列(LSH,locality sensitive hashing)算法的一种,用于基本块、函数SimHash值的计算,SimHash值计算过程如下:
S31、创建一个64为变量SimH,并初始化为0。
S32、对汇编代码进行分词处理,一般有2种方式:n-gram字符串或n-gram单词,本方案采用n-gram单词方法进行分词。
S33、为每个分词(汇编语言标识符)赋予权值:通常基于频率,即分词出现的次数。
S34、对每个分词做散列处理,得出64bit散列值:通常使用MD5或SHA1散列算法,然后取其中64bit,每个分词对应一个中64bit散列值。
S35、加权合并各分词的散列值:对分词的散列值的每一位,如果该位为1,则加权值相应位的值加上该分词的权值,否则减去该分词的权值。
S36、降维:对加权值的每一位,若该位大于0,则设为1,否则设为0,形成一个64bit的基本块对应的SimHash值。
将每个基本块对应的SimHash值进行逻辑“与”操作,得到每个函数的SimHash值。
S4、二进制代码的特征提取
为保证二进制代码相似性比对的精确度,通过提取二进制代码特征,包括基本块SimHash值、函数的SimHash值、函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令(Branch Instruction)数目、函数的comp(Comp Instruction)指令数目、函数的Assign(Assign Instruction)指令数目、函数的bit(BitInstruction)指令数目、函数的arithmatic(arithmatic Instruction)指令数目、函数的stack(stack Instruction)指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图等。提高二进制代码相似性比对的精确度。
(1)基本块SimHash值提取:为每个标准化代码块计算SimHash值,SimHash值在本文表示为SimH。最终每个函数表示为SimHash值的集合Func0→{BB1,BB2,……,BBm}→{SimH1,SimH2,……,SimHm},BBm为第m个基本块对应的反汇编,SimHm为第m个基本块对应SimHash值。
(2)函数的SimHash值提取:由于每个函数表示为SimHash值的集合Func0→{BB1,BB2,……,BBm}→{SimH1,SimH2,……,SimHm},通过将每个基本块对应的SimHash值进行逻辑“与”操作,得到每个函数的SimHash值。每个函数的SimHash值表示为FSimH,每个汇编文件表示为SimHash值的集合ASM={Func1,Func2,……,Funcn}→{FSimH1,FSimH2,……,FSimHn},其中Funcn为第n个函数对应的反汇编,FSimHn为第n个函数对应的SimHash值。
(3)函数指令数目提取:计算每个函数指令数目,函数指令数目表示为Func-Instr-Num。每个汇编文件表示为函数指令数目的集合ASM={Func1,Func2,……,Funcn}→{Func-Instr-Num1,Func-Instr-Num2,……,Func-Instr-Numn}。
(4)函数的基本块数目提取:计算每个函数的基本块数目,函数基本块数目表示为BB-Num,每个汇编文件表示为函数基本块数目的集合ASM={Func1,Func2,……,Funcn}→{BB-Num1,BB-Num2,……,BB-Numn}。
(5)函数路径数量提取:计算每个函数的函数路径数量,函数路径数量表示为Path-Num,每个汇编文件表示为函数路径数量的集合ASM={Func1,Func2,……,Funcn}→{Path-Num1,Path-Num2,……,Path-Numn}。
(6)函数的分支指令(BranchInstruction)数目提取:计算每个函数的分支指令数目,分支指令数目表示为Bran-Num,每个汇编文件表示为分支指令数目的集合ASM={Func1,Func2,……,Funcn}→{Bran-Num1,Bran-Num2,……,Bran-Numn}。
(7)函数的比较(CompareInstruction)指令数目提取:计算每个函数的比较指令数目,比较指令数目表示为Comp-Num,每个汇编文件表示为比较指令数目的集合ASM={Func1,Func2,……,Funcn}→{Comp-Num1,Comp-Num2,……,Comp-Numn}。
(8)函数的Assign(AssignInstruction)指令数目提取:计算每个函数的Assign指令数量,Assign指令数量表示为Assign-Num,每个汇编文件表示为Assign指令数量的集合ASM={Func1,Func2,……,Funcn}→{Assign-Num1,Assign-Num2,……,Assign-Numn}。
(9)函数的Bit(BitInstruction)指令数目提取:计算每个函数的Bit指令数目,Bit指令数目表示为Bit-Num,每个汇编文件表示为Bit指令数目的集合ASM={Func1,Func2,……,Funcn}→{Bit-Num1,Bit-Num2,……,Bit-Numn}。
(10)函数的Arithmatic(arithmaticInstruction)指令数目提取:计算每个函数的Arithmatic指令数目,Arithmatic指令数目表示为Arith-Num,每个汇编文件表示为Arithmatic指令数目的集合ASM={Func1,Func2,……,Funcn}→{Arith-Num1,Arith-Num2,……,Arith-Numn}。
(11)函数的Stack(StackInstruction)提取:计算每个函数的Stack指令数目,Stack指令数目表示为Stack-Num,每个汇编文件表示为Stack指令数目的集合ASM={Func1,Func2,……,Funcn}→{Stack-Num1,Stack-Num2,……,Stack-Numn}。
(12)函数的Libc库函数的调用数量提取:计算每个函数的Libc库函数调用数量,Libc库函数调用数量表示为LibcF-Num,每个汇编文件表示为Libc库函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{LibcF-Num1,LibcF-Num2,……,LibcF-Numn}。
(13)函数的Indirect函数调用数量提取:计算每个函数的Indirect函数调用数量,Indirect函数调用数量表示为Indir-Num,每个汇编文件表示为Indirect函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{Indir-Num1,Indir-Num2,……,Indir-Numn}。
(14)函数的自定义函数调用数量提取:计算每个函数的自定义函数调用数量,自定义函数调用数量表示为UserF-Num,每个汇编文件表示为自定义函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{UserF-Num1,UserF-Num2,……,UserF-Numn}。
(15)函数的控制流图提取:提取每个函数的控制流图,并生成控制流图的向量表,控制流图向量表表示为Ctrl-graph,每个汇编文件表示为控制流图向量表的集合ASM={Func1,Func2,……,Funcn}→{Ctrl-graph1,Ctrl-graph2,……,Ctrl-graphn}。
S5、构建代码特征关系库构架
建立文件信息表、函数信息表、基本块信息表,并建立相应的关系表。一个二进制文件包含至少一个函数、一个函数包含多个基本块,因此一条文件记录对应至少一条函数记录,一条函数信息记录对应多条基本块记录。
S51、建立文件信息表file_table,存储二进制文件名称、SimHash信息;
S52、建立函数信息表func_tale,存储函数的二进制代码特征,包括函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令(Branch Instruction)数目、函数的comp(Comp Instruction)指令数目、函数的Assign(Assign Instruction)指令数目、函数的bit(Bit Instruction)指令数目、函数的arithmatic(arithmatic Instruction)指令数目、函数的stack(stack Instruction)指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图等信息;
S53、建立数据库基本块信息表basic block_table,本方案将每个SimHash值均分为8块,为所有的SimHash值创建8个表,不同的表存储不同位置的块。
S6、基于文本相似性的二进制代码快速定位
SimHash值的汉明距离(对应位上数值不同的位数)在3以内的都可以认为相似,但是在海量的SimHash值列表中搜索汉明距离为3以内的SimHash值复杂度非常高,为提高效率,本发明提出兼顾时间与空间的多表索引方法。
(1)建立基本块SimHash表
为提高检索效率,同时兼顾空间开销,将每个SimHash值均分为8块,为所有的SimHash值创建8个表sub_tabq(q取值1~8),不同的表存储不同位置的块,如第一个表存储0~7位,第二个表存储8~15位,第三个表存储16~23位等。
(2)汉明距离计算
汉明距离:将两个基本块对应的SimHash值进行异或操作,异或后的SimHash值包含1的个数,记为汉明距离;
汉明距离小于N(通常N为3,且N<8)计算:为了提高汉明距离的计算效率,若两个基本块对应的汉明距离为N,表示有N个bit对应的值不相同,由于SimHash值分成了8个子块,当N为3时,每个SimHash值对应的8个子块(每个块8bit)最少应有5个相同;
(3)查询基本块
当依据某SimHash检索汉明距离在3以内的其他SimHash值时,将该SimHash平分为8块(SimHash_bb1~SimHash_bb8),每块SimHash_bbq(q取值1~8)在相应的表sub_tabq(q取值1~8)寻找相似块,sub_tabq为各分块组成的列表,取相似块对应SimHash集合,筛选出至少在5个块相同的SimHash值。
(4)相似函数比较
计算基本块的汉明距离,通过比较两个函数的基本块,将包含相似基本块比例超过一定阈值(例如:50%)的函数记为相似函数,找出相似度较高的函数,用集合SimFunc={SimFunc1,SimFunc2,…,SimFuncp}表示,p为相似函数的数目。
7、基于代码特征比对的代码相似性精确评估
S71、选取函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图等13个特征进行比较,其中每个特征权重为1/13;
S72、将待比较函数记为ObjFunc,将ObjFunc与SimFunc={SimFunc1,SimFunc2,…,SimFuncp}相比,判断13个特征是否相等,将相似性结果记为SimV,若特征相等SimV加1/13,计算每个函数与ObjFunc的相似度,结果SimV={SimV1,SimV2,……SimVp};
S73、对相似度结果SimV={SimV1,SimV2,……SimVp}进行排序,选取相似度最大的三个作为相似度比对结果。
本发明具有以下技术效果:
(1)本发明提出的方案,能够在兼顾对比效率的同时,保证二进制代码相似性比对的效率;
(2)本发明提取二进制代码函数特征,能够保证代码相似性比对的精确度;
(3)本发明采用基于SimHash的文本对比方法,能够提高二进制代码相似性比对的效率。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (10)
1.一种高精度的二进制代码相似性比对方法,其特征在于,该方法包括如下步骤:
S1、二进制代码反汇编及汇编代码预处理
通过对不同架构下指令集的解析,实现对多平台二进制代码的反汇编,生成不同架构下二进制代码的反汇编文件;依据汇编文件中的特殊标识,将汇编文件拆分成多个函数;依据函数中的跳转指令将函数切分为多个基本块;
S2、汇编代码标准化处理包括:依据规则对代码块中的指令进行标准化处理;
S3、汇编代码SimHash值计算
计算每个基本块对应的SimHash值;
S4、二进制代码的特征提取
提取二进制代码特征,包括基本块SimHash值、函数的SimHash值、函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量和函数的控制流图;
S5、构建代码特征关系库构架
建立文件信息表、函数信息表和基本块信息表,并建立相应的关系表;一个二进制文件包含至少一个函数、一个函数包含多个基本块,一条文件记录对应至少一条函数记录,一条函数信息记录对应多条基本块记录;
S6、基于文本相似性的二进制代码快速定位
待比较函数记为ObjFunc,比较ObjFunc与各函数的基本块,计算基本块的SimHash值之间的汉明距离,汉明距离小于3认为是相似基本块,将包含相似基本块比例超过一定阈值的函数记为相似函数;
S7、基于代码特征比对的代码相似性精确评估
选取函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图这13个特征进行比较,其中每个特征权重为1/13,筛选出相似函数中与待比较函数相似度最高的函数。
2.如权利要求1所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S1具体包括:
S11、通过对不同架构下指令集的解析,实现对多平台二进制代码的反汇编,实现不同架构下二进制代码的反汇编文件生成,表示为ASM;
S12、依据汇编文件标识,将其拆分成多个函数,函数用Func表示,一个汇编文件表示为多个函数的集合ASM={Func1,Func2,……,Funcn};
S13、依据函数中的跳转指令将函数切分为多个基本块,用BB表示,每个函数表示为多个基本块的集合Func={BB1,BB2,……,BBm}。
3.如权利要求2所述的高精度的二进制代码相似性比对方法,其特征在于,多平台包括Arm、PowerPC和X86,跳转指令包括jnz和jmp。
4.如权利要求2所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S2中的标准化处理规则如下:
内存均表示为Memory;
立即数表示为Value;
寄存器依据所占位数分别标准化为reg_32、reg_16、reg_18;
call指令调用外部的系统库函数时指令不做处理,调用内部函数时规范化为“callsub_xxx”;
跳转指令规范化为“jump loc_xxx”。
5.如权利要求4所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S3具体包括:
S31、创建一个64为变量SimH,并初始化为0;
S32、采用n-gram字符串或n-gram单词方式对汇编代码进行分词处理;
S33、基于分词出现的次数为每个分词赋予权值;
S34、对每个分词做散列处理,得出64bit散列值,每个分词对应一个中64bit散列值;
S35、加权合并各分词的散列值:对分词的散列值的每一位,如果该位为1,则加权值相应位的值加上该分词的权值,否则减去该分词的权值;
S36、降维:对加权值的每一位,若该位大于0,则设为1,否则设为0,形成一个64bit的基本块对应的SimHash值。
6.如权利要求5所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S4具体包括:
基本块SimHash值提取:为每个标准化代码块计算SimHash值,SimHash值在本文表示为SimH;最终每个函数表示为SimHash值的集合Func0→{BB1,BB2,……,BBm}→{SimH1,SimH2,……,SimHm},BBm为第m个基本块对应的反汇编,SimHm为第m个基本块对应SimHash值;
函数的SimHash值提取:由于每个函数表示为SimHash值的集合Func0→{BB1,BB2,……,BBm}→{SimH1,SimH2,……,SimHm},通过将每个基本块对应的SimHash值进行逻辑“与”操作,得到每个函数的SimHash值;每个函数的SimHash值表示为FSimH,每个汇编文件表示为SimHash值的集合ASM={Func1,Func2,……,Funcn}→{FSimH1,FSimH2,……,FSimHn},其中Funcn为第n个函数对应的反汇编,FSimHn为第n个函数对应的SimHash值;
函数指令数目提取:计算每个函数指令数目,函数指令数目表示为Func-Instr-Num;每个汇编文件表示为函数指令数目的集合ASM={Func1,Func2,……,Funcn}→{Func-Instr-Num1,Func-Instr-Num2,……,Func-Instr-Numn};
函数的基本块数目提取:计算每个函数的基本块数目,函数基本块数目表示为BB-Num,每个汇编文件表示为函数基本块数目的集合ASM={Func1,Func2,……,Funcn}→{BB-Num1,BB-Num2,……,BB-Numn};
函数路径数量提取:计算每个函数的函数路径数量,函数路径数量表示为Path-Num,每个汇编文件表示为函数路径数量的集合ASM={Func1,Func2,……,Funcn}→{Path-Num1,Path-Num2,……,Path-Numn};
函数的分支指令数目提取:计算每个函数的分支指令数目,分支指令数目表示为Bran-Num,每个汇编文件表示为分支指令数目的集合ASM={Func1,Func2,……,Funcn}→{Bran-Num1,Bran-Num2,……,Bran-Numn};
函数的比较指令数目提取:计算每个函数的比较指令数目,比较指令数目表示为Comp-Num,每个汇编文件表示为比较指令数目的集合ASM={Func1,Func2,……,Funcn}→{Comp-Num1,Comp-Num2,……,Comp-Numn};
函数的Assign指令数目提取:计算每个函数的Assign指令数量,Assign指令数量表示为Assign-Num,每个汇编文件表示为Assign指令数量的集合ASM={Func1,Func2,……,Funcn}→{Assign-Num1,Assign-Num2,……,Assign-Numn};
函数的Bit指令数目提取:计算每个函数的Bit指令数目,Bit指令数目表示为Bit-Num,每个汇编文件表示为Bit指令数目的集合ASM={Func1,Func2,……,Funcn}→{Bit-Num1,Bit-Num2,……,Bit-Numn};
函数的Arithmatic指令数目提取:计算每个函数的Arithmatic指令数目,Arithmatic指令数目表示为Arith-Num,每个汇编文件表示为Arithmatic指令数目的集合ASM={Func1,Func2,……,Funcn}→{Arith-Num1,Arith-Num2,……,Arith-Numn};
函数的Stack指令提取:计算每个函数的Stack指令数目,Stack指令数目表示为Stack-Num,每个汇编文件表示为Stack指令数目的集合ASM={Func1,Func2,……,Funcn}→{Stack-Num1,Stack-Num2,……,Stack-Numn};
函数的Libc库函数的调用数量提取:计算每个函数的Libc库函数调用数量,Libc库函数调用数量表示为LibcF-Num,每个汇编文件表示为Libc库函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{LibcF-Num1,LibcF-Num2,……,LibcF-Numn};
函数的Indirect函数调用数量提取:计算每个函数的Indirect函数调用数量,Indirect函数调用数量表示为Indir-Num,每个汇编文件表示为Indirect函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{Indir-Num1,Indir-Num2,……,Indir-Numn};
函数的自定义函数调用数量提取:计算每个函数的自定义函数调用数量,自定义函数调用数量表示为UserF-Num,每个汇编文件表示为自定义函数调用数量的集合ASM={Func1,Func2,……,Funcn}→{UserF-Num1,UserF-Num2,……,UserF-Numn};
函数的控制流图提取:提取每个函数的控制流图,并生成控制流图的向量表,控制流图向量表表示为Ctrl-graph,每个汇编文件表示为控制流图向量表的集合ASM={Func1,Func2,……,Funcn}→{Ctrl-graph1,Ctrl-graph2,……,Ctrl-graphn}。
7.如权利要求6所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S5具体包括:
S51、建立文件信息表file_table,存储二进制文件名称、SimHash信息;
S52、建立函数信息表func_tale,存储函数的二进制代码特征,包括函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图信息;
S53、建立数据库基本块信息表basicblock_table,将每个SimHash值均分为8块,为所有的SimHash值创建8个表,不同的表存储不同位置的块。
8.如权利要求7所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S6具体包括:
建立基本块SimHash表:
将每个SimHash值均分为8块,为所有的SimHash值创建8个表sub_tabq,q取值1~8,不同的表存储不同位置的块;
汉明距离计算:
汉明距离:将两个基本块对应的SimHash值进行异或操作,异或后的SimHash值包含1的个数,记为汉明距离;若两个基本块对应的汉明距离为N,表示有N个bit对应的值不相同,由于SimHash值分成了8个子块,当N为3时,每个SimHash值对应的8个子块最少应有5个相同;
查询基本块:
当依据某SimHash检索汉明距离在3以内的其他SimHash值时,将该SimHash平分为8块,SimHash_bb1~SimHash_bb8,每块SimHash_bbq在相应的表sub_tabq寻找相似块,q取值1~8,sub_tabq为各分块组成的列表,取相似块对应SimHash集合,筛选出至少在5个块相同的SimHash值;
相似函数比较:
计算基本块的汉明距离,通过比较两个函数的基本块,将包含相似基本块比例超过一定阈值的函数记为相似函数,找出相似度较高的函数,用集合SimFunc={SimFunc1,SimFunc2,…,SimFuncp}表示,p为相似函数的数目。
9.如权利要求8所述的高精度的二进制代码相似性比对方法,其特征在于,所述阈值为50%。
10.如权利要求8所述的高精度的二进制代码相似性比对方法,其特征在于,所述步骤S7具体包括:
S71、选取函数指令数目、函数的基本块数目、函数路径数量、函数的分支指令数目、函数的comp指令数目、函数的Assign指令数目、函数的bit指令数目、函数的arithmatic指令数目、函数的stack指令数目、函数的Libc库函数的调用数量、函数的indirect函数调用数量、函数的自定义函数调用数量、函数的控制流图这13个特征进行比较,其中每个特征权重为1/13;
S72、将待比较函数记为ObjFunc,将ObjFunc与SimFunc={SimFunc1,SimFunc2,…,SimFuncp}相比,判断13个特征是否相等,将相似性结果记为SimV,若特征相等SimV加1/13,计算每个函数与ObjFunc的相似度,结果SimV={SimV1,SimV2,……SimVp};
S73、对相似度结果SimV={SimV1,SimV2,……SimVp}进行排序,选取相似度最大的三个作为相似度比对结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210566686.5A CN115016843B (zh) | 2022-05-23 | 2022-05-23 | 一种高精度的二进制代码相似性比对方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210566686.5A CN115016843B (zh) | 2022-05-23 | 2022-05-23 | 一种高精度的二进制代码相似性比对方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115016843A CN115016843A (zh) | 2022-09-06 |
CN115016843B true CN115016843B (zh) | 2024-03-26 |
Family
ID=83068745
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210566686.5A Active CN115016843B (zh) | 2022-05-23 | 2022-05-23 | 一种高精度的二进制代码相似性比对方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115016843B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106649218A (zh) * | 2016-11-16 | 2017-05-10 | 中国人民解放军国防科学技术大学 | 一种基于SimHash算法的二进制文件快速比较方法 |
CN110569629A (zh) * | 2019-09-10 | 2019-12-13 | 北京计算机技术及应用研究所 | 二进制代码文件溯源方法 |
CN112257068A (zh) * | 2020-11-17 | 2021-01-22 | 南方电网科学研究院有限责任公司 | 一种程序相似性检测方法、装置、电子设备和存储介质 |
CN113703773A (zh) * | 2021-08-26 | 2021-11-26 | 北京计算机技术及应用研究所 | 一种基于nlp的二进制代码相似性比对方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106682506B (zh) * | 2016-05-06 | 2020-03-17 | 腾讯科技(深圳)有限公司 | 一种病毒程序检测方法和终端 |
-
2022
- 2022-05-23 CN CN202210566686.5A patent/CN115016843B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106649218A (zh) * | 2016-11-16 | 2017-05-10 | 中国人民解放军国防科学技术大学 | 一种基于SimHash算法的二进制文件快速比较方法 |
CN110569629A (zh) * | 2019-09-10 | 2019-12-13 | 北京计算机技术及应用研究所 | 二进制代码文件溯源方法 |
CN112257068A (zh) * | 2020-11-17 | 2021-01-22 | 南方电网科学研究院有限责任公司 | 一种程序相似性检测方法、装置、电子设备和存储介质 |
CN113703773A (zh) * | 2021-08-26 | 2021-11-26 | 北京计算机技术及应用研究所 | 一种基于nlp的二进制代码相似性比对方法 |
Non-Patent Citations (2)
Title |
---|
代码抄袭检测技术研究及在实验教学中的应用;吴鑫君;梁宇;易超;;实验科学与技术;20111028(第S1期);全文 * |
基于simhash与倒排索引的复用代码快速溯源方法;乔延臣;云晓春;庹宇鹏;张永铮;;通信学报;20161125(第11期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN115016843A (zh) | 2022-09-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111324750B (zh) | 一种大规模文本相似度计算及文本查重方法 | |
CN110569629A (zh) | 二进制代码文件溯源方法 | |
CN111310178B (zh) | 跨平台场景下的固件漏洞检测方法及系统 | |
JPWO2010119615A1 (ja) | 学習データ生成装置、固有表現抽出システム、学習データ生成方法、及びプログラム | |
CN108491228A (zh) | 一种二进制漏洞代码克隆检测方法及系统 | |
WO2016130542A1 (en) | Code relatives detection | |
Sang et al. | Robust movie character identification and the sensitivity analysis | |
CN103020225B (zh) | 一种cpu型号识别方法和硬件检测系统 | |
CN113703773B (zh) | 一种基于nlp的二进制代码相似性比对方法 | |
CN115658080A (zh) | 一种软件开源代码成分的识别方法及系统 | |
CN111930610B (zh) | 软件同源性检测方法、装置、设备及存储介质 | |
CN115016843B (zh) | 一种高精度的二进制代码相似性比对方法 | |
CN113822059A (zh) | 中文敏感文本识别方法、装置、存储介质及设备 | |
CN113536308A (zh) | 软件基因视角下多粒度信息融合的二进制代码溯源方法 | |
CN114995880B (zh) | 一种基于SimHash的二进制代码相似性比对方法 | |
CN112748811A (zh) | 一种英文单词输入方法及装置 | |
CN113760891A (zh) | 一种数据表的生成方法、装置、设备和存储介质 | |
CN110807082A (zh) | 质量抽检项目确定方法、系统、电子设备及可读存储介质 | |
Li et al. | A novel approach to remote sensing image retrieval with multi-feature VP-tree indexing and online feature selection | |
CN114510717A (zh) | 一种elf文件的检测方法、装置、存储介质 | |
CN113836378A (zh) | 一种数据处理方法及装置 | |
CN114254069A (zh) | 域名相似度的检测方法、装置和存储介质 | |
CN113946365A (zh) | 页面识别方法、装置、计算机设备和存储介质 | |
CN110851517A (zh) | 一种源数据抽取方法、装置、设备及计算机存储介质 | |
CN110414228A (zh) | 计算机病毒的检测方法、装置、存储介质和计算机设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |