当前位置: 首页 > 专利查询>西北大学专利>正文

一种基于代码变形的二进制代码混淆方法技术

技术编号:10019593 阅读:293 留言:0更新日期:2014-05-08 18:52
本发明专利技术公开了一种基于代码变形的二进制代码混淆方法,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序;步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构。该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆,保护强度高、易于扩展。

【技术实现步骤摘要】
一种基于代码变形的二进制代码混淆方法
本专利技术属于计算机软件安全领域,特别是一种针对Windows系统中目标二进制代码的代码混淆方法。
技术介绍
软件的广泛应用为社会带来巨大利益的同时,其安全问题也日益突出,软件防恶意逆向成为工业界和学术界急需解决的问题。软件攻击技术和逆向工具的发展为软件的逆向分析提供了便利;另外,软件往往运行于“白盒攻击”环境中(参见参考文献1),软件攻击者可以完全控制软件的执行过程,查看指令执行序列。因此,只要给定攻击者足够的时间,应该能够成功逆向分析该软件。人在一定时间内处理的信息量是有限的,如果攻击者付出的代价超过所获得的信息的价值或分析过程的难度和复杂度导致攻击者放弃攻击,则采用的保护方法是有效的。因此软件保护的目的是提高攻击者逆向分析的难度,增加攻击者的攻击开销。针对二进制代码的保护不受编程语言的限制,相比源代码级别应用范围更广。目前二进制代码保护技术主要有:①指令伪装技术,(参见参考文献2、3)由Kanzaki提出,大量的伪装代码在执行过程中被还原,增加动态分析的复杂度。2010年他对指令伪装技术进行了改进(参见参考文献4),结合代码块执行时间判定程序是否被调试或攻击,提高了程序反调试能力。Madou提出了基于代码变形的软件动态保护方法(参见参考文献5),抽取程序中相似的代码集成束,在程序执行过程中,通过Script依次还原束中的代码块。针对代码伪装技术,Wu和Dux(参见参考文献6、7)出了有效的攻击方法,降低了指令伪装技术的安全性。②控制流混淆技术,Birrer提出了基于程序切片的变形保护方法(参见参考文献8),基于动态切片的软件动态保护技术对程序进行切片,在程序执行时通过调用切片管理函数或者切片地址跳转表进行跳转控制。但是,一旦攻击者定位出管理函数或跳转表,就会大大降低控制流混淆的作用。③虚拟机软件保护技术,(参见参考文献9)将机器指令转换为字节码,执行时由虚拟机解释器解释执行。为软件提供高强度的保护,但是对软件性能消耗较大,通常只对软件中的部分关键代码进行保护。④代码混淆技术,1997由Collberg等人最早提出使用基于语义的自动化工具和代码变形技术进行代码混淆的思想(参见参考文献10)。混淆的基本原理是将一个程序转化为功能上等价,但在静态表示或执行过程却不一样的等价程序。而当前应用于二进制代码的混淆技术主要是通过花指令或垃圾指令进行保护,保护效果差,而且容易被发现和去除。
技术实现思路
针对上述现有二进制代码保护技术存在的缺陷和不足,本专利技术的目的在于,提供一种基于代码变形的二进制代码混淆方法,该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆,保护强度高、易于扩展。为了实现上述目标,本专利技术采取如下的技术解决方案:一种基于代码变形的二进制代码混淆方法,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序:步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构。进一步的,所述步骤3的定位关键代码段是指在待变形文件中的关键代码段加上首标记和尾标记。进一步的,所述步骤4的具体步骤如下:(1)在待变形文件中找到关键代码段;(2)将关键代码段的二进制代码进行反汇编得到汇编指令,并按照汇编指令的地址,顺序地组成一个汇编指令序列,记为ins_list;(3)从指令序列ins_list中找出跳转指令及跳转指令的目的指令,如果目的指令的地址小于其对应的跳转指令,说明目的指令与其对应的跳转指令构成一个循环结构;以循环深度值表示循环结构中指令的嵌套深度,且规定位于最外层循环之外的指令的循环深度值为1,循环结构每增加一层嵌套,位于该层循环中的指令的循环深度值加1;得到指令序列ins_list的循环深度值序列;并统计循环深度值为x的指令的总数numx,并计算循环深度值为x的指令在指令序列的所有指令中的权重值weight(x),计算过程如下:当指令序列中所有指令的循环深度值都相等时,否则,式中,w为调节因子。进一步的,所述步骤(3)中,w取值为[0,1.5]。进一步的,所述步骤5的具体步骤如下:(1)取汇编指令序列ins_list中的第一条汇编指令作为当前指令,记为ins;(2)计算当前指令ins的变形次数阈值Ite;(3)对当前指令ins进行Ite次迭代等价变形,得到与当前指令ins等价的指令序列INS,然后使用指令序列INS替换汇编指令序列ins_list中的当前指令ins;(4)判断当前指令ins是否是指令序列ins_list中的最后一条,如果是,则汇编指令序列ins_list的等价变形结束,得到变形后得到的指令序列ins_list;否则,将当前指令ins更新为它的下一条指令,执行步骤(2)。进一步的,所述步骤(2)的具体步骤如下:从循环深度值序列中查找当前指令ins的循环深度值,找到该循环深度值对应指令的权重值weight,使用下式计算当前指令ins的变形次数阈值Ite:Ite=[itemax-(itemax-itemin)×weight]式中,itemin和itemax分别是用户用于计算变形次数阈值而选定的两个参数,1≤itemin≤itemax≤10。进一步的,所述步骤(3)的具体步骤如下:(3-1)、定义指令序列INS为对指令ins进行了c_ite次迭代变形后得到的指令序列;令INS={ins}、c_ite=0;(3-2)、判断c_ite是否小于变形次数阈值Ite,是则执行步骤(3-3);否则等价变形结束;(3-3)、从指令序列INS中随机选取一条指令,记为指令i,然后在变形模板库中查找指令i的变形模板;如果只有一个变形模板的目标指令I0与指令i相同,则选择该变形模板,执行步骤(3-4);如果有多个变形模板的目标指令I0与指令i相同,则随机选择一个变形模板,执行步骤(3-4);如果没有找到,执行步骤(3-5)。(3-4)、用步骤(3-3)中选出的变形模板对指令i进行变形,得到一个与指令i等价的指令序列seq;然后用指令序列seq替换指令序列INS中的指令i,用数学关系表示该替换过程,即为INS=INS–i+seq,替换过程保持INS中指令的前后顺序,即把指令序列seq中的指令顺序放到INS中指令i的位置上;然后记录指令序列seq中的每条指令的循环深度值都等于指令i的循环深度值。(3-5)、令c_ite=c_ite+1,执行步骤(3-2)。进一步的,所述步骤6中对指令序列的切片过程具体如下:(1)记ins_list中的指令的总数为total_num,取其中第一条指令作为当前指令,记为ins,令count=0,id=1;(2)根据当前指令的循环深度值,找到该循环深度值对应的指令的weight值,然后通过下式计算以当前指令为起始的代码片段的长度Fra:Fra=[framin+(framax-framin)×weight]式中,framin和framax分别是用户用于计算切片粒度而选定的两个参数,1≤fr本文档来自技高网
...
一种基于代码变形的二进制代码混淆方法

【技术保护点】
一种基于代码变形的二进制代码混淆方法,其特征在于,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序:步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构。

【技术特征摘要】
1.一种基于代码变形的二进制代码混淆方法,其特征在于,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序:步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构;所述步骤4的具体步骤如下:(1)在待变形文件中找到关键代码段;(2)将关键代码段的二进制代码进行反汇编得到汇编指令,并按照汇编指令的地址,顺序地组成一个汇编指令序列,记为ins_list;(3)从指令序列ins_list中找出跳转指令及跳转指令的目的指令,如果目的指令的地址小于其对应的跳转指令,说明目的指令与其对应的跳转指令构成一个循环结构;以循环深度值表示循环结构中指令的嵌套深度,且规定位于最外层循环之外的指令的循环深度值为1,循环结构每增加一层嵌套,位于该层循环中的指令的循环深度值加1;得到的循环深度值序列;并统计循环深度值为x的指令的总数numx,并计算循环深度值为x的指令在指令序列的所有指令中的权重值weight(x),计算过程如下:当指令序列中所有指令的循环深度值都相等时,否则,式中,w为调节因子。2.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤3的定位关键代码段是指在待变形可执行文件中的关键代码段加上首标记和尾标记。3.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(3)中,w取值为[0,1.5]。4.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤5的具体步骤如下:(1)取汇编指令序列ins_list中的第一条汇编指令作为当前指令,记为ins;(2)计算当前指令ins的变形次数阈值Ite;(3)对当前指令ins进行Ite次迭代等价变形,得到与当前指令ins等价的指令序列INS,然后使用指令序列INS替换汇编指令序列ins_list中的当前指令ins;(4)判断当前指令ins是否是指令序列ins_list中的最后一条,如果是,则汇编指令序列ins_list的等价变形结束,得到变形后得到的指令序列ins_list;否则,将当前指令ins更新为它的下一条指令,执行步骤(2)。5.如权利要求4所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(2)计算当前指令ins的变形次数阈值Ite,具体步骤如下:从循环深度值序列中查找当前指令ins的循环深度值,找到该循环深度值对应指令的权重值weight,使用下式计算当前指令ins的变形次数阈值Ite:Ite=[itemax-(itemax-itemin)×weight]式中,itemin和itemax分别是用户用于计算变形次数阈值而选定的两个参数,1≤itemin≤itemax≤10。6.如权利要求4所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(3)对当前指令ins进行Ite次迭代等价变形,得到与当前指令ins等价的指令序列INS,然后使用指令序列INS替换汇编指令序列ins_list中的当前指令ins,具体步骤如下:(3-1)、定义指...

【专利技术属性】
技术研发人员:王怀军房鼎益李光辉张聪许广莲董浩王瑾榕党舒凡王琳姜河何路陈晓江
申请(专利权)人:西北大学
类型:发明
国别省市:陕西;61

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1