[发明专利]一种基于深度学习的无符号二进制间接控制流识别方法有效
申请号: | 202110363702.6 | 申请日: | 2021-04-02 |
公开(公告)号: | CN113204764B | 公开(公告)日: | 2022-05-17 |
发明(设计)人: | 王鹃;王蕴茹;杨梦达;王杰;钟璟 | 申请(专利权)人: | 武汉大学 |
主分类号: | G06F21/56 | 分类号: | G06F21/56;G06F8/41;G06K9/62;G06N3/04;G06N3/08 |
代理公司: | 武汉科皓知识产权代理事务所(特殊普通合伙) 42222 | 代理人: | 许莲英 |
地址: | 430072 湖*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 深度 学习 符号 二进制 间接 控制 识别 方法 | ||
1.一种基于深度学习的无符号二进制间接控制流识别方法,其特征在于,包括以下步骤:
步骤1:引入原始二进制代码文件,原始二进制代码文件中多个字节构成多个指令代码块,多个指令代码块构成多个基本块代码块,多个基本块代码块构成多个函数代码块,根据基本块代码块和函数代码块构建间接调用分支和函数序列,并进一步构建间接跳转的三元组样本、间接调用的三元组样本,对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集;
步骤2:构建神经网络间接跳转目标识别分类模型,将间接跳转训练集中每个间接跳转的三元组样本依次输入神经网络间接跳转目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接跳转样本标签和分类模型的预测标签构建神经网络间接跳转目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接跳转目标识别分类模型;构建神经网络间接调用目标识别分类模型,将间接调用训练集中每个间接调用的三元组样本依次输入神经网络间接调用目标识别分类模型,进一步分类得到对应的三元组样本预测结果,进一步结合间接调用样本标签和分类模型预测的标签建神经网络间接调用目标识别分类损失函数模型,通过优化训练得到网络的寻优化参数集,根据网络寻优化参数集构建训练后神经网络间接调用目标识别分类模型;
步骤3:将待检测的二进制文件通过步骤1提取待检测的二进制中指令代码块、待检测的二进制中基本块代码块、待检测的二进制中函数代码块,对于待检测的二进制中指令代码块,判别是否为间接跳转指令代码块或间接调用指令代码块。
2.根据权利要求1所述的基于深度学习的无符号二进制间接控制流识别方法,其特征在于,
步骤1所述原始二进制代码文件为:
texti={ci,1,ci,2,...,ci,L}
i∈[1,K]
其中,texti表示第i个原始二进制代码文件,K表示原始二进制代码文件的数量,L表示第i个原始二进制代码文件中字节的数量,ci,j表示第i个原始二进制代码文件中第j个字节,j∈[1,L];
步骤1所述原始二进制代码文件中多个字节构成多个指令代码块具体表示为:
Insi,k={ci,sins_k,ci,sins_k+1,...,ci,sins_k+nins_k-1}
k∈[1,Nins]
其中,Insi,k表示第i个原始二进制代码文件中第k个指令代码块,Nins表示第i个原始二进制代码文件中指令代码块的数量,sins_k为第k个指令代码块起始的字节的下标,nins_k表示第k个指令代码块中字节的数量,ci,sins_k+j表示第i个原始二进制代码文件中第k个指令代码块中第sins_k+j+1个字节,j∈[0,nins_k-1];
步骤1所述多个指令代码块构成多个基本块代码块具体表示为:
Bi,m={Insi,sbb_m,Insi,sbb_m+1,...,Insi,sbb_m+nbb_m-1}
m∈[1,Nbb]
其中,Bi,m表示第i个原始二进制代码文件中第m个基本块代码块,Nbb表示第i个原始二进制代码文件中基本块代码块的数量,sbb_m为第m个基本块代码块起始的指令代码块的下标,nbb_m表示第m个基本块代码块中指令代码块的数量,Insi,sbb_m+j表示第i个原始二进制代码文件中第m个基本块代码块中第sbb_m+j+1个指令代码块,j∈[0,nbb_m-1];
步骤1所述多个基本块代码块构成多个函数代码块的具体表示为:
Fi,n={Bi,sfunc_n,Bi,sfunc_n+1,...,Bi,sfunc_n+nfunc_n-1}
n∈[1,Nfunc]
其中,Fi,n表示第i个原始二进制代码文件中第n个函数代码块,Nfunc表示第i个原始二进制代码文件中函数代码块的数量,sfunc_n为第n个函数代码块起始的基本块代码块的下标,nfunc_n表示第n个函数代码块中基本块代码块的数量,Bi,sfunc_n+j表示第i个原始二进制代码文件中第n个函数代码块中第sfunc_n+j+1个基本块代码块,j∈[0,nfunc_n-1];
步骤1所述根据基本块代码块和函数代码块构建间接调用分支和函数序列为:
所述间接调用分支:
Bri,m={Bi,entry_m,e,Bi,entry_m+1,...,e,Bi,call_m}
m∈[1,Ncall]
其中,Bri,m为第i个原始二进制代码文件中第m个间接调用指令代码块所在的间接调用分支序列,Ncall表示第i个原始二进制代码文件中间接调用指令代码块的数量,entry_m为第m个间接调用分支序列的入口基本块的下标,entry_m+1为Bi,entry_m的后继基本块代码块的下标,call_m为第m个间接调用指令代码块所在基本块代码块的下标;
所述函数序列:
Fsi,n={Bi,sfunc_n,e,Bi,sfunc_n+1,...,e,Bi,sfunc_n+nfunc_n-1}
n∈[1,Nfunc]
其中,Fsi,n为函数Fi,n对应的函数序列,e为函数内部的控制流;
步骤1所述进一步构建间接跳转的三元组样本为:
Jdatai,k=(Bi,m,e,Bi,n)
k∈[1,Ndata_jmp]
其中,Jdatai,k表示第i个原始二进制代码文件生成的第k个间接跳转数据样本,即第i个原始二进制代码文件中第k个跳转表对应的样本,Ndata_jmp表示第i个原始二进制代码文件中间接跳转样本的数量,e表示函数代码块内部的控制流,Bi,m为第k个跳转表中间接跳转指令代码块所在的基本块代码块,Bi,n为第k个跳转表所在函数代码块中除Bi,m的任一基本块代码块,即假设Bi,m∈Fi,l,则Bi,n∈Fi,l-{Bi,m},m,n∈[1,Nbb];
上述Jdatai,k对应的第k个跳转表的构成为:
JTablei,k={Bi,m:{Bi,sjt_k,Bi,sjt_k+1,...,Bi,sjt_k+njt_k-1}}
其中,sjt_k为第k个跳转表起始的基本块代码块的下标,njt_k表示第k个跳转表中跳转条目的数量,Bi,sjt_k+j表示第i个原始二进制代码文件中第k个跳转表中第sjt_k+j+1个跳转条目,j∈[0,njt_k-1];
步骤1所述进一步构建间接调用的三元组样本为:
Cdatai,k=(Bri,k,E,Fsi,n)
k∈[1,Ndata_call]
其中,Cdatai,k表示第i个原始二进制代码文件生成的第k个间接调用数据样本,即第i个原始二进制代码文件中第k个间接调用指令代码块对应的样本,假设为Insi,l,Ndata_call表示第i个原始二进制代码文件中间接调用样本的数量,E表示函数代码块之间的控制流,Bri,k为第i个原始二进制代码文件中第k个间接调用指令代码块Insi,l所在的间接调用分支,基于宽度优先搜索算法构造Bri,k;Fsi,n为第i个原始二进制代码文件中的第n个函数Fi,n对应的函数序列,Fi,n为所在二进制代码内任意address-taken函数;
定义CTarget(Insi,l)为Insi,l实际调用的函数代码块列表,即:
CTarget(Insi,l)={Fi,ct1,Fi,ct2,...,Fi,ctn}
其中,Fi,ct1,Fi,ct2,...,Fi,ctn为Insi,l的实际目标函数;
步骤1所述对间接跳转的三元组样本和间接调用的三元组样本分别进行标记,生成间接跳转训练集、间接调用训练集为:
对于间接跳转的三元组样本即Jdatai,k=(Bi,m,e,Bi,n):
若Bi,n∈JTablei,k[Bi,m],则Jdatai,k的标签标记为Jlabeli_k,1,反之为Jlabeli_k,0;
对于间接调用的三元组样本即Cdatai,k=(Bri,k,E,Fsi,n):
若Fi,n∈CTarget(Insi,l),则该样本标记为Clabeli_k,1,反之为Clabeli_k,0;
步骤1所述生成间接跳转训练集,即:
JDATA={(Jdata1,1,Jlabel1_1,k1),(Jdata1,2,Jlabel1_2,k2),......,(JdataK,Ndata_jmp_k,JlabelK_Ndata_jmp_k,kNjmp)}
其中,JDATA为间接跳转训练集,(Jdata1,1,Jlabel1_1,k1)为数据集中的第一个样本,如前所述,Jdata1,1为第1个原始二进制代码文件中的第1个样本,Jlabel1_1,k1为Jdata1,1的标签,k1的取值为0或1;(Jdatai,j,Jlabeli_j,km)为数据集中第m个样本,Jdatai,j为第i个原始二进制代码文件中的第j个样本,Jlabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,K],j∈[1,Ndata_jmp_i],K为原始二进制代码文件的数量,Ndata_jmp_i表示第i个二进制的间接跳转样本总个数,Njmp为间接跳转训练集中的样本总数;
步骤1所述生成间接调用训练集,即:
CDATA={(Cdata1,1,Clabel1_1,k1),(Cdata1,2,Clabel1_2,k2),......,(CdataK,Ndata_call_k,ClabelK_Ndata_call_k,kNcall)}
其中,CDATA为间接调用训练集,(Cdata1,1,Clabel1_1,k1)为数据集中的第一个样本,如前所述,Cdata1,1为第1个原始二进制代码文件中的第1个样本,Clabel1_1,k1为Cdata1,1的标签,k1的取值为0或1;(Cdatai,j,Clabeli_j,km)为数据集中第m个样本,Cdatai,j为第i个原始二进制代码文件中的第j个样本,Clabeli_j,km为其对应的标签,m为该样本在数据集中的下标,其中,i∈[1,K],j∈[1,Ndata_call_i],K为原始二进制代码文件的数量,Ndata_call_i表示第i个二进制的间接跳转样本总个数,Ncall为间接跳转训练集中的样本总数。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于武汉大学,未经武汉大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110363702.6/1.html,转载请声明来源钻瓜专利网。