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

文档序号:6535825阅读:977来源:国知局
一种基于代码变形的二进制代码混淆方法
【专利摘要】本发明公开了一种基于代码变形的二进制代码混淆方法,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序;步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构。该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆,保护强度高、易于扩展。
【专利说明】一种基于代码变形的二进制代码混淆方法
【技术领域】
[0001]本发明属于计算机软件安全领域,特别是一种针对Windows系统中目标二进制代码的代码混淆方法。
【背景技术】
[0002]软件的广泛应用为社会带来巨大利益的同时,其安全问题也日益突出,软件防恶意逆向成为工业界和学术界急需解决的问题。软件攻击技术和逆向工具的发展为软件的逆向分析提供了便利;另外,软件往往运行于“白盒攻击”环境中(参见参考文献1),软件攻击者可以完全控制软件的执行过程,查看指令执行序列。因此,只要给定攻击者足够的时间,应该能够成功逆向分析该软件。
[0003]人在一定时间内处理的信息量是有限的,如果攻击者付出的代价超过所获得的信息的价值或分析过程的难度和复杂度导致攻击者放弃攻击,则采用的保护方法是有效的。因此软件保护的目的是提高攻击者逆向分析的难度,增加攻击者的攻击开销。针对二进制代码的保护不受编程语言的限制,相比源代码级别应用范围更广。
[0004]目前二进制代码保护技术主要有:①指令伪装技术,(参见参考文献2、3)由Kanzaki提出,大量的伪装代码在执行过程中被还原,增加动态分析的复杂度。2010年他对指令伪装技术进行了改进(参见参考文献4),结合代码块执行时间判定程序是否被调试或攻击,提高了程序反调试能力。Madou提出了基于代码变形的软件动态保护方法(参见参考文献5),抽取程序中相似的代码集成束,在程序执行过程中,通过Script依次还原束中的代码块。针对代码伪装技术,Wu和Dux (参见参考文献6、7)出了有效的攻击方法,降低了指令伪装技术的安全性。②控制流混淆技术,Birrer提出了基于程序切片的变形保护方法(参见参考文献8),基于动态切片的软件动态保护技术对程序进行切片,在程序执行时通过调用切片管理函数或者切片地址跳转表进行跳转控制。但是,一旦攻击者定位出管理函数或跳转表,就会大大降低控制流混淆的作用。③虚拟机软件保护技术,(参见参考文献9)将机器指令转换为字节码,执行时由虚拟机解释器解释执行。为软件提供高强度的保护,但是对软件性能消耗较大,通常只对软件中的部分关键代码进行保护。④代码混淆技术,1997由Collberg等人最早提出使用基于语义的自动化工具和代码变形技术进行代码混淆的思想(参见参考文献10)。混淆的基本原理是将一个程序转化为功能上等价,但在静态表示或执行过程却不一样的等价程序。而当前应用于二进制代码的混淆技术主要是通过花指令或垃圾指令进行保护,保护效果差,而且容易被发现和去除。

【发明内容】

[0005]针对上述现有二进制代码保护技术存在的缺陷和不足,本发明的目的在于,提供一种基于代码变形的二进制代码混淆方法,该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆,保护强度高、易于扩展。
[0006]为了实现上述目标,本发明采取如下的技术解决方案:[0007]—种基于代码变形的二进制代码混淆方法,按下列步骤进行:
[0008]步骤I,确定变形模板库;
[0009]步骤2,PE文件检测;
[0010]步骤3,定位关键代码段;
[0011]步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;
[0012]步骤5,对汇编指令序列中所有汇编指令的变形;
[0013]步骤6,对汇编指令序列切片和乱序:
[0014]步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;
[0015]步骤8,PE文件重构。
[0016]进一步的,所述步骤3的定位关键代码段是指在待变形文件中的关键代码段加上首标记和尾标记。
[0017]进一步的,所述步骤4的具体步骤如下:
[0018](I)在待变形文件中找到关键代码段;
[0019](2)将关键代码段的二进制代码进行反汇编得到汇编指令,并按照汇编指令的地址,顺序地组成一个汇编指令序列,记为ins_list ;
[0020](3)从指令序列ins_list中找出跳转指令及跳转指令的目的指令,如果目的指令的地址小于其对应的跳转指令,说明目的指令与其对应的跳转指令构成一个循环结构;以循环深度值表示循环结构中指令的嵌套深度,且规定位于最外层循环之外的指令的循环深度值为1,循环结构每增加一层嵌套,位于该层循环中的指令的循环深度值加I ;得到指令序列ins_list的循环深度值序列;并统计循环深度值为X的指令的总数numx,并计算循环深度值为X的指令在指令序列的所有指令中的权重值weight (X),计算过程如下:
[0021]当指令序列中所有指令的循环深度值都相等时,
【权利要求】
1.一种基于代码变形的二进制代码混淆方法,其特征在于,按下列步骤进行: 步骤I,确定变形模板库; 步骤2,PE文件检测; 步骤3,定位关键代码段; 步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重; 步骤5,对汇编指令序列中所有汇编指令的变形; 步骤6,对汇编指令序列切片和乱序: 步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码; 步骤8,PE文件重构。
2.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤3的定位关键代码段是指在待变形可执行文件中的关键代码段加上首标记和尾标记。
3.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤4的具体步骤如下: (1)在待变形文件中找到关键代码段; (2)将关键代码段的二进制代码进行反汇编得到汇编指令,并按照汇编指令的地址,顺序地组成一个汇编指令序列,记为ins_list ; (3)从指令序列ins_list中找出跳转指令及跳转指令的目的指令,如果目的指令的地址小于其对应的跳转指令,说明目的指令与其对应的跳转指令构成一个循环结构;以循环深度值表示循环结构中指令的嵌套深度,且规定位于最外层循环之外的指令的循环深度值为1,循环结构每增加一层嵌套,位于该层循环中的指令的循环深度值加I ;得到的循环深度值序列;并统计循环深度值为X的指令的总数numx,并计算循环深度值为X的指令在指令序列的所有指令中的权重值weight (X),计算过程如下: 当指令序列中所有指令的循环深度值都相等时,
4.如权利要求3所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(3)中,w 取值为[O, 1.5]。
5.如权利要求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 )。
6.如权利要求5所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(2)的具体步骤如下: 从循环深度值序列中查找当前指令ins的循环深度值,找到该循环深度值对应指令的权重值weight,使用下式计算当前指令ins的变形次数阈值Ite:
Ite = [Ueniax-Qteniax-Ueniin) Xweight] 式中,Uemin和Uemax分别是用户用于计算变形次数阈值而选定的两个参数,I ^ itemin ^ itemax ^ 10。
7.如权利要求5所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤(3)的具体步骤如下: (3-1)、定义指令序列INS为对指令ins进行了 c_ite次迭代等价变形后得到的指令序列;令 INS= {ins}、c_ite=0 ; (3-2)、判断c_ite 是否小于变形次数阈值Ite,是则执行步骤(3-3);否则等价变形结束; (3-3)、从指令序列INS中随机选取一条指令,记为指令i,然后在变形模板库中查找指令i的变形模板;如果只有一个变形模板的目标指令Itl与指令i相同,则选择该变形模板,执行步骤(3-4);如果有多个变形模板的目标指令Itl与指令i相同,则随机选择一个变形模板,执行步骤(3-4);如果没有找到,执行步骤(3-5)。 (3-4)、用步骤(3-3)中选出的变形模板对指令i进行变形,得到一个与指令i等价的指令序列seq ;然后用指令序列seq替换指令序列INS中的指令i,用数学关系表示该替换过程,即为INS=INS -1+seq,替换过程保持INS中指令的前后顺序,即把指令序列seq中的指令顺序放到INS中指令i的位置上;然后记录指令序列seq中的每条指令的循环深度值都等于指令i的循环深度值。
(3-5 )、令 c_i te=c_i te+Ι,执行步骤(3-2 )。
8.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤6中对指令序列的切片过程具体如下: (1)记ins_list中的指令的总数为total_num,取其中第一条指令作为当前指令,记为ins,令 Count=O, id= I ; (2)根据当前指令的循环深度值,找到该循环深度值对应的指令的weight值,然后通过下式计算以当前指令为起始的代码片段的长度Fra:
Fra = [framin+ (framax-framin) X weight] 式中,frafflin和framax分别是用户用于计算切片粒度而选定的两个参数,I ( framin ( fra隱(20。 (3)如果count+Fra< total_num,将以当前指令为起始的Fra条指令作为第id个代码片段,令id=id+l, count=count+Fra,执行步骤(2);否则,将以当前指令为起始到指令序列ins_list结束的所有指令作为第id个代码片段,并结束切片,得到被切片后的指令序列ins_list,该指令序列包括id个代码片段。
9.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤6中对切片后的指令序列进行乱序的过程如下:
(1)令snippet_num=id ; (2)利用洗牌算法生成一个I~snippet_num的所有自然数的随机顺序数组; (3)将随机顺序数组的元素依次分配给Snippet_num个指令片段作为其序号,然后按照序号的大小顺序将各代码片段排列得到一个新的指令序列,在每个代码片段后面添加一条跳转指令,用于跳向它的下一个代码片段,在最后一个指令片段的末尾添加的跳转指令跳向PE文件中关键代码段 中最后一条指令的下一条指令,得到被乱序后的汇编指令序列。
10.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤8的具体步骤如下: 将步骤7得到的二进制代码 作为PE文件的一个新区段附加在原PE文件之后,将关键代码段在PE文件中的位置的起始处用一条无条件跳转语句填充,该跳转语句用于跳向新区段中第I个代码片段的起始地址处;然后将关键代码段的剩余部分用一些随机的数据进行填充。
【文档编号】G06F21/14GK103778355SQ201410018508
【公开日】2014年5月7日 申请日期:2014年1月15日 优先权日:2014年1月15日
【发明者】王怀军, 房鼎益, 李光辉, 张聪, 许广莲, 董浩, 王瑾榕, 党舒凡, 王琳, 姜河, 何路, 陈晓江 申请人:西北大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1