CN103778355B - 一种基于代码变形的二进制代码混淆方法 - Google Patents
一种基于代码变形的二进制代码混淆方法 Download PDFInfo
- Publication number
- CN103778355B CN103778355B CN201410018508.4A CN201410018508A CN103778355B CN 103778355 B CN103778355 B CN 103778355B CN 201410018508 A CN201410018508 A CN 201410018508A CN 103778355 B CN103778355 B CN 103778355B
- Authority
- CN
- China
- Prior art keywords
- instruction
- ins
- code
- sequence
- ite
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 54
- 230000008569 process Effects 0.000 claims description 27
- 230000004087 circulation Effects 0.000 claims description 9
- 230000009191 jumping Effects 0.000 claims description 7
- 239000012634 fragment Substances 0.000 claims description 6
- 230000001105 regulatory effect Effects 0.000 claims description 6
- 230000004224 protection Effects 0.000 abstract description 27
- 238000012163 sequencing technique Methods 0.000 abstract 1
- 230000006870 function Effects 0.000 description 12
- 238000005516 engineering process Methods 0.000 description 9
- 238000004458 analytical method Methods 0.000 description 7
- 230000000694 effects Effects 0.000 description 6
- 238000002474 experimental method Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 230000001276 controlling effect Effects 0.000 description 2
- 239000002245 particle Substances 0.000 description 2
- 241000208340 Araliaceae Species 0.000 description 1
- 241000196324 Embryophyta Species 0.000 description 1
- 208000027534 Emotional disease Diseases 0.000 description 1
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 1
- 235000003140 Panax quinquefolius Nutrition 0.000 description 1
- 229910000831 Steel Inorganic materials 0.000 description 1
- 230000003321 amplification Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 229910002056 binary alloy Inorganic materials 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 235000008434 ginseng Nutrition 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000003199 nucleic acid amplification method Methods 0.000 description 1
- 230000010181 polygamy Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000010959 steel Substances 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于代码变形的二进制代码混淆方法,按下列步骤进行:步骤1,确定变形模板库;步骤2,PE文件检测;步骤3,定位关键代码段;步骤4,对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重;步骤5,对汇编指令序列中所有汇编指令的变形;步骤6,对汇编指令序列切片和乱序;步骤7,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码;步骤8,PE文件重构。该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆,保护强度高、易于扩展。
Description
技术领域
本发明属于计算机软件安全领域,特别是一种针对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≤framin≤framax≤20。
(3)如果count+Fra<total_num,将以当前指令为起始的Fra条指令作为第id个代码片段,令id=id+1,count=count+Fra,执行步骤(2);否则,将以当前指令为起始到指令序列ins_list结束的所有指令作为第id个代码片段,并结束切片,得到被切片后的指令序列ins_list,该指令序列包括id个代码片段。
进一步的,所述步骤6中对切片后的指令序列进行乱序的过程如下:
(1)令snippet_num=id;
(2)利用洗牌算法生成一个1~snippet_num的所有自然数的随机顺序数组;
(3)将随机顺序数组的元素依次分配给snippet_num个指令片段作为其序号,然后按照序号的大小顺序将各代码片段排列得到一个新的指令序列,在每个代码片段后面添加一条跳转指令,用于跳向它的下一个代码片段,在最后一个指令片段的末尾添加的跳转指令跳向PE文件中关键代码段中最后一条指令的下一条指令,得到被乱序后的汇编指令序列。
进一步的,所述步骤8的具体步骤如下:
将步骤7得到的二进制代码作为PE文件的一个新区段附加在原PE文件之后,将关键代码段在PE文件中的位置的起始处用一条无条件跳转语句填充,该跳转语句用于跳向新区段中第1个代码片段的起始地址处;然后将关键代码段的剩余部分用一些随机的数据进行填充。
本发明的基于代码变形的二进制代码混淆方法的优点如下:
1、适用性广,与所使用的编程语言无关;由于变形过程是单向的,因此很难被还原。
2、保护后生成的二进制程序具有多样性,对同一个二进制程序前后进行多次保护,每一次保护都会得到一个保护后的二进制程序,它们的代码会有明显的差异,但功能是相同的。
3、易于扩展,变形模板可根据需要方便地添加,便于增加保护效果的多样性和复杂性。
4、采用多次迭代变形对保护强度和性能开销具有可控性,通过变形次数的动态调节可平衡保护强度和性能消耗。
5、切片和乱序进一步增强保护强度。切片粒度不同使得代码片段的大小不同,且乱序时随机打乱各代码片的位置,也使得保护后的二进制程序具有多样性。
附图说明
图1是本发明的基于代码变形的二进制代码混淆方法的整体流程图。
图2是代码等价变形过程的示意图。
图3是一条指令的变形过程的流程图。
图4是汇编指令“pop eax”的3次迭代变形过程的示意图。
图5是N条指令进行变形后的切片和乱序示意图。
以下结合附图对本发明的具体内容作进一步详细说明。
具体实施方式
如图1所示,本发明的基于代码变形的二进制代码混淆方法,按下列步骤进行:
步骤1,确定变形模板库
变形模板是一个函数,该函数的输入为待变形的目标指令,输出为与目标指令的功能等价的指令或指令序列。变形模板由等价指令对构成,等价指令对是一个二元组<I0,I1>,其中,I0是一条目标指令,I1是指一条目标指令或一个指令序列,且I0和I1满足:在输入相同的情况下(即指令运行环境,包括寄存器、栈空间、内存数据都相同),分别执行I0和I1,会得到相同的输出,如图2所示。表1给出了5个等价指令对的示例。
表1 5个等价指令
变形模板库是变形模板的集合,本实施例中采用的变形模板库是NicolaouGeorge在“Applied Binary Code Obfuscation”(参见参考文献11)一文中列出的所有等价指令对的集合。
步骤2,PE文件检测:
验证输入的待变形文件是否是PE文件,是则执行下一步骤,否则退出。本发明中,PE文件指Windows平台上主流的可执行文件格式,如.exe文件、.dll文件、.sys文件。
步骤3,定位关键代码段:
关键代码段是指待变形文件中需要被保护的代码,通常是待变形文件中核心算法的实现代码或者对重要数据的操作代码。
在待变形文件中的关键代码段加上首标记和尾标记。本实施例中采用的首标记和尾标记如下:
实际操作时,将PROTECT_START和PROTECT_END两个宏定义复制到待变形文件的源文件中,并将这两个宏分别添加到关键代码段的首尾处,源文件编译后,即可实现首标记和尾标记的嵌入。
步骤4,对关键代码段进行反汇编,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重,具体操作如下:
1)根据首标记和尾标记在待变形文件中找到关键代码段,从而得到关键代码段的起始地址和结束地址;
2)利用反汇编工具(如xde、OllyDbg)将关键代码段的二进制代码进行反汇编得到汇编指令,并按照汇编指令的地址顺序组成一个汇编指令序列,记为ins_list;
3)从指令序列ins_list中找出跳转指令(包括条件跳转指令和无条件跳转指令)及跳转指令的目的指令,如果目的指令的地址小于其对应的跳转指令,说明目的指令与其对应的跳转指令构成一个循环结构。由于循环结构可能是嵌套的,以循环深度值表示循环结构中指令的嵌套深度,且规定位于最外层循环之外的指令(即不处于任何循环结构中的指令)的循环深度值为1,循环结构每增加一层嵌套,位于该层循环中的指令的循环深度值加1。
例如,指令序列{ins1,ins2,···,ins8,ins9}中的循环结构如下:
ins1((ins2,ins3)ins4)ins5(ins6,ins7,(ins8,ins9))
以“(”表示循环的开始,以“)”表示循环的结束,则指令序列{ins1,ins2,···,ins8,ins9}中第一条指令ins1的循环深度值为1,第二条指令ins2的循环深度值为3,…。得到指令序列{ins1,ins2,···,ins8,ins9}中的9条指令的循环深度值用序列{1,3,3,2,1,2,2,3,3}表示;根据得到的循环深度值序列,统计循环深度值为x的指令的总数numx,然后计算循环深度值为x的指令在指令序列的所有指令中的权重值weight(x),计算过程如下:
当指令序列中所有指令的循环深度值都相等时,否则,
式中,w为调节因子,用于调节各指令权重的计算过程。w值过大,根据计算Ite和Fra的公式,循环深度值大的指令的迭代次数Ite和切片粒度Fra都趋于最小值,而其他循环深度值的指令的迭代次数和切片粒度都趋于最大值,相当于所有的指令只被分成了两类,一类取Ite和Fra的最大值,一类取最小值,因此不能反映出处于各个循环深度的指令的迭代次数和切片粒度。经试验确定本发明中,w取值为[0,1.5]。
步骤5,对步骤4得到的汇编指令序列ins_list中所有汇编指令的变形,具体步骤如下:
(1)取汇编指令序列ins_list中的第一条汇编指令作为当前指令,记为ins;
(2)从循环深度值序列中查找当前指令ins的循环深度值,找到该循环深度值对应指令的权重值weight,使用下式计算当前指令ins的变形次数阈值Ite:
Ite=[itemax-(itemax-itemin)×weight]
式中,itemin和itemax分别是用户用于计算变形次数阈值而选定的两个参数,1≤itemin≤itemax≤10;
(3)对当前指令ins进行Ite次等价变形,得到与当前指令ins等价的指令序列INS,然后使用指令序列INS替换汇编指令序列ins_list中的当前指令ins;如图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)。
图4是对“pop eax”指令进行三次迭代变形的效果图。由上述过程可知,变形次数阈值Ite越大,指令序列INS的规模越大,保护的强度越高。
(4)判断当前指令ins是否是指令序列ins_list中的最后一条,如果是,则汇编指令序列ins_list的等价变形结束,得到变形后得到的指令序列ins_list;否则,将当前指令ins更新为它的下一条指令,执行步骤(2)。
步骤6,对指令序列ins_list切片和乱序:
切片是指将第5步得到的变形后的指令序列ins_list中的指令划分成多个代码片段的过程;每个代码片段中包括的指令条数为[1,20];乱序是指将代码片段在物理位置上的连续性打乱的过程,且为了保证程序的正确执行,打乱过程中在每个代码片段的末尾添加一条跳转指令,用于跳向打乱前该代码片段的物理位置上的下一个代码片段。由此可见,切片时每个代码片段中的指令越少,得到的代码片段的数量就越多,添加的跳转指令的条数就越多,得到的汇编指令的控制流程就越复杂,保护的强度也会越高。
图5为N条汇编指令进行变形后的切片乱序过程,图中ins i.1~ins i.m表示指令i在变形后得到的m条指令。
对变形后的指令序列ins_list的切片过程如下:
(1)记ins_list中的指令的总数为total_num,取其中第一条指令作为当前指令,记为ins,令count=0,id=1。
(2)根据当前指令的循环深度值,找到该循环深度值对应的指令的weight值,然后通过下式计算以当前指令为起始的代码片段的长度Fra(代码片段的长度是指代码片段包含指令的条数):
Fra=[framin+(framax-framin)×weight]
式中,framin和framax分别是用户用于计算切片粒度而选定的两个参数,1≤framin≤framax≤20。
(3)如果count+Fra<total_num,将以当前指令为起始的Fra条指令作为第id个代码片段,令id=id+1,count=count+Fra,执行步骤(2);否则,将以当前指令为起始到指令序列ins_list结束的所有指令作为第id个代码片段,并结束切片,得到被切片后的指令序列ins_list,该指令序列包括id个代码片段。
对切片后的指令序列ins_list进行乱序的过程如下:
(1)令snippet_num=id;
(2)利用洗牌算法生成一个1~snippet_num的所有自然数的随机顺序数组;
(3)将随机顺序数组的元素依次分配给snippet_num个指令片段作为其序号,然后按照序号的大小顺序将各代码片段排列得到一个新的指令序列,在每个代码片段后面添加一条跳转指令,用于跳向它的下一个代码片段,在最后一个指令片段的末尾添加的跳转指令跳向PE文件中关键代码段中该最后一条指令的下一条指令,得到被乱序后的汇编指令序列;
步骤7,汇编:
使用反汇编引擎xde或OllyDbg,将步骤6生成的新的汇编指令序列进行汇编,转换成二进制代码。
步骤8,PE文件重构:
将步骤7得到的二进制代码作为PE文件的一个新区段附加在原PE文件之后,并根据添加了新区段后的PE文件的大小修改新的PE文件的大小、区段数目(参考《加密与解密》中“PE文件格式”一章(参见参考文献12))。关键代码段在PE文件中的位置的起始处用一条无条件跳转语句填充,该跳转语句用于跳向新区段中第1个代码片段的起始地址处;然后将关键代码段的剩余部分用一些随机的数据进行填充(因为在用变形后的代码替换原关键代码进行执行时,原关键代码不会被执行,变成了无用的代码,用任意数据填充该部分,不会影响程序的功能,同时还能够起到迷惑攻击者的作用)。
为了验证变形的效果,本发明进行了以下实验,通过列出指令的执行时间和变形后得到的指令条数来说明保护的有效性,一般认为程序执行时间越长,指令条数越多,保护的强度越大。
实验环境:Win XP SP3操作系统,3.0GHz处理器,4GB内存,VC++6.0开发环境;
实验对象:四个排序程序,即冒泡排序(BubbleSort)、快速排序(QuickSort)、堆排序(HeapSort)和希尔排序(ShellSort)。分别对四种排序程序的核心算法进行保护,利用四种排序程序对同一组随机选取的5000个数据排序。
(1)实验1:迭代次数对时空开销的影响
设置不同迭代变形次数对程序进行保护,被保护的汇编指令条数(size)及被保护汇编指令的执行时间(time)如表2所示。从表2可以看出,指令条数随着迭代次数的增大而增加,与迭代次数没有呈现绝对线性关系是因为在迭代变形过程中,随机选择指令进行变形,有些指令有多个模板函数,且各指令变形模板函数包含不等的指令条数。被保护代码块执行时间也与迭代次数近似呈线性关系。执行时间的增加幅度要大于指令条数的增加幅度,是由于在测试用例中选取的关键代码块中有循环结构,时间开销增幅较大。冒泡排序算法对被保护指令的执行时间变化影响远大于其他排序算法,是因为冒泡排序算法中处于循环体内的被保护指令较多。
(2)实验2:切片粒度对时空开销的影响
当迭代次数为5,切片粒度范围为[a,b](每片有a到b条指令)时对程序进行保护。切片粒度为0,表示没有对迭代变形后的指令“切片”。被保护指令执行时间(time)及被保护指令条数(size)如表3所示。由表3可以看出,切片操作增加了指令条数,主要是因为每个代码片段末尾都添加了一条跳转指令。其中希尔排序在[1,5]范围时,比其他程序条数增加较多,是由于随机的切片粒度平均值较小引起的,同时也使得执行时间增长较大。
(3)实验3:循环对指令执行时间的影响
扫描分析冒泡排序中的被保护指令,统计各循环深度的汇编指令条数。当迭代次数区间与切片粒度区间均为[6,10],调节因子w取0.1和1时,对冒泡排序进行保护。首先对被保护指令迭代变形,然后切片乱序,分别获取变形后和切片乱序后被保护指令的条数和执行时间,如表4所示。由表4可以看出,不同的w值对不同循环深度指令的迭代次数和切片粒度的影响不同,通过w值调节指令的迭代次数和切片粒度。综合表2、表3和表4可以看出,通过对循环中指令迭代次数和切片粒度的控制,在指令增加幅度较大的时候,执行时间的增长幅度明显降低。可见,循环体中保护指令的控制有效降低了被保护指令时间开销的增加。
(4)变形的多样性效果验证
选择冒泡排序的部分指令,将其变形保护四次,每次保护的参数均设为:迭代次数区间与切片粒度区间均为[6,10],且w=1。对选取指令进行四次保护,保护后指令集合分别记为m1,m2,m3,m4。
Numm(mx)为mx中指令总条数。H(mx,my)记为mx与my中有差异的指令总条数,ΔH(mx,my)记为mx与my的差异度,且有:
经统计m1,m2,m3,m4包含的指令条数分别为1280,1241,1336,1308。利用BCompare对比工具分析可得H(mx,my),见表5。根据公式(5)及表5,可得平均差异度为:
因此,相同的指令块不同次保护后的指令也有较大差异,影响差异度的因素主要有指令对应的模板函数和迭代指令选取时的随机算法。每条指令对应的模板函数越多且模板函数中指令差异越大,在较好的随机算法作用下,相同指令块不同次保护后的差异度越大。
表2 迭代次数对指令条数size及执行时间time(ms)的影响
表3 切片粒度对指令条数size及执行时间time(ms)的影响
表4 调节因子w对指令条数size及执行时间time(ms)的影响
表5 H(mx,my)的统计结果
(m1,m2) | (m1,m3) | (m1,m4) | (m2,m3) | (m2,m4) | (m3,m4) | |
H(mx,my) | 411 | 357 | 402 | 391 | 457 | 386 |
参考文献
[1]S Chow,P Eisen,H Johnson,P Van Oorschot.A white-box DESimplementation for DRM applications[J].Lecture notes in computer science,2003,2696:1-15.
[2]Y Kanzaki,A Monden,M Nakamura,K Matsumoto.Exploiting self-modification mechanism for program protection[A].Proc.27th IEEE ComputerSoftware and Applications Conference[C],Dallas,USA:IEEE,2003:170-179.
[3]Y Kanzaki,A Monden,M Nakamura,K Matsumoto.Program Camouflage:ASystematic Instruction Hiding Method for Protecting Secrets[A].Proc.WorldCongress on Science,Engineering and Technology[C],Heidelberg,Germany,2009:557-563.
[4]Y Kanzaki,A Monden.A Software Protection Method Based on Time-Sensitive Code and Self-modification Mechanism[A].The IASTED InternationalConferences on Informatics2010Software Engineering and Applications(SEA2010)[C],Marina Del Rey,USA,2010:325-331.
[5]M Madou,B Anckaert,P Moseley,S Debray,B De Sutter,K DeBosschere.Software protection through dynamic code mutation[J].InformationSecurity Applications,2006,3786:194-206.
[6]Y Wu,Z Zhao,T Chui.An attack on SMC-based software protection[J].Information and Communications Security,2006,4307:352-368.
[7]B Dux,A Iyer,S Debray,D Forrester,S Kobourov.Visualizing thebehavior of dynamically modifiable code[A].13th International Workshop onProgram Comprehension(IWPC2005)[C],Louis,MO,USA,2005:337-340.
[8]B D Birrer,R A Raines,R O Baldwin,B E Mullins,R WBennington.Program Fragmentation as a Metamorphic Software Protection[A].IAS'07Proceedings of the Third International Symposium on Information Assuranceand Security[C]:IEEE Computer Society,2007:369-374.
[9]Code Virtualizer[OL].http://www.oreans.com/codevirtualizer.php,2013.
[10]C Collberg,C Thomborson,D Low.A taxonomy of obfuscatingtransformations[R].1173-3500.New Zealand:The University of Auckland,1997.
[11]Nicolaou George.Applied Binary Code Obfuscation.http://www.net-security.org/article.php?id=1204,2009.
[12]段钢.加密与解密.北京:电子工业出版社,2011:272-276,467-470
Claims (9)
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)、定义指令序列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)。
7.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤6中对指令序列的切片过程具体如下:
(1)记ins_list中的指令的总数为total_num,取其中第一条指令作为当前指令,记为ins,令count=0,id=1;
(2)根据当前指令的循环深度值,找到该循环深度值对应的指令的weight值,然后通过下式计算以当前指令为起始的代码片段的长度Fra:
Fra=[framin+(framax-framin)×weight]
式中,framin和framax分别是用户用于计算切片粒度而选定的两个参数,1≤framin≤framax≤20;
(3)如果count+Fra<total_num,将以当前指令为起始的Fra条指令作为第id个代码片段,令id=id+1,count=count+Fra,执行步骤(2);否则,将以当前指令为起始到指令序列ins_list结束的所有指令作为第id个代码片段,并结束切片,得到被切片后的指令序列ins_list,该指令序列包括id个代码片段。
8.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤6中对切片后的指令序列进行乱序的过程如下:
(1)令snippet_num=id;
(2)利用洗牌算法生成一个1~snippet_num的所有自然数的随机顺序数组;
(3)将随机顺序数组的元素依次分配给snippet_num个指令片段作为其序号,然后按照序号的大小顺序将各代码片段排列得到一个新的指令序列,在每个代码片段后面添加一条跳转指令,用于跳向它的下一个代码片段,在最后一个指令片段的末尾添加的跳转指令跳向PE文件中关键代码段中最后一条指令的下一条指令,得到被乱序后的汇编指令序列。
9.如权利要求1所述的基于代码变形的二进制代码混淆方法,其特征在于,所述步骤8的具体步骤如下:
将步骤7得到的二进制代码作为PE文件的一个新区段附加在原PE文件之后,将关键代码段在PE文件中的位置的起始处用一条无条件跳转语句填充,该跳转语句用于跳向新区段中第1个代码片段的起始地址处;然后将关键代码段的剩余部分用一些随机的数据进行填充。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410018508.4A CN103778355B (zh) | 2014-01-15 | 2014-01-15 | 一种基于代码变形的二进制代码混淆方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410018508.4A CN103778355B (zh) | 2014-01-15 | 2014-01-15 | 一种基于代码变形的二进制代码混淆方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103778355A CN103778355A (zh) | 2014-05-07 |
CN103778355B true CN103778355B (zh) | 2017-02-15 |
Family
ID=50570583
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410018508.4A Expired - Fee Related CN103778355B (zh) | 2014-01-15 | 2014-01-15 | 一种基于代码变形的二进制代码混淆方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103778355B (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104063635B (zh) * | 2014-07-02 | 2017-09-29 | 北京深思数盾科技股份有限公司 | 目标文件的保护方法及保护系统 |
CN104834837B (zh) * | 2015-04-03 | 2017-10-31 | 西北大学 | 一种基于语义的二进制代码反混淆方法 |
CN105681297A (zh) * | 2016-01-12 | 2016-06-15 | 西安电子科技大学 | 未知网络协议隐匿行为的指令序列聚类挖掘方法 |
CN106529224A (zh) * | 2016-10-27 | 2017-03-22 | 南京大学 | 基于rop攻击特点的二进制混淆方法 |
CN106529225A (zh) * | 2016-10-27 | 2017-03-22 | 努比亚技术有限公司 | 一种应用程序源代码保护装置及方法 |
CN106682460B (zh) * | 2016-11-25 | 2019-05-31 | 西北大学 | 一种基于两次变换的代码混淆方法 |
CN106951745B (zh) * | 2017-03-31 | 2019-10-18 | 北京深思数盾科技股份有限公司 | 一种指令重组方法和装置 |
CN107066890B (zh) * | 2017-04-25 | 2020-12-25 | 腾讯科技(深圳)有限公司 | 一种利用混淆处理对文件进行加密的方法及装置 |
CN107506623B (zh) * | 2017-08-15 | 2021-07-23 | 北京奇虎科技有限公司 | 应用程序的加固方法及装置、计算设备、计算机存储介质 |
CN109784008A (zh) * | 2017-11-14 | 2019-05-21 | 卓望数码技术(深圳)有限公司 | 一种用于移动代码的结构扁平方法和系统 |
CN108733990B (zh) * | 2018-05-22 | 2022-04-05 | 深圳壹账通智能科技有限公司 | 一种基于区块链的文件保护方法及终端设备 |
CN110210190A (zh) * | 2019-05-30 | 2019-09-06 | 中国科学院信息工程研究所 | 一种基于二次汇编的代码混淆方法 |
CN110555291B (zh) * | 2019-08-06 | 2021-08-27 | 苏宁云计算有限公司 | 网页脚本代码保护方法及装置 |
CN111488558B (zh) * | 2020-04-08 | 2022-07-22 | 腾讯科技(深圳)有限公司 | 脚本保护方法、装置、计算机可读存储介质和计算机设备 |
CN112528241B (zh) * | 2020-11-27 | 2021-09-14 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482907A (zh) * | 2009-02-18 | 2009-07-15 | 中国科学技术大学 | 基于专家系统的主机恶意代码行为检测系统 |
-
2014
- 2014-01-15 CN CN201410018508.4A patent/CN103778355B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482907A (zh) * | 2009-02-18 | 2009-07-15 | 中国科学技术大学 | 基于专家系统的主机恶意代码行为检测系统 |
Non-Patent Citations (1)
Title |
---|
基于变形引擎的目标代码混淆方法设计与实现;姜河;《中国优秀硕士学位论文全文数据库 信息科技辑》;20130515(第05期);I138-338 * |
Also Published As
Publication number | Publication date |
---|---|
CN103778355A (zh) | 2014-05-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103778355B (zh) | 一种基于代码变形的二进制代码混淆方法 | |
Blazytko et al. | Syntia: Synthesizing the semantics of obfuscated code | |
CN105205359B (zh) | 一种JavaScript代码保护方法及装置 | |
CN103544414B (zh) | 一种Android系统应用的深度代码混淆方法 | |
US8589897B2 (en) | System and method for branch extraction obfuscation | |
CN106682460B (zh) | 一种基于两次变换的代码混淆方法 | |
US8429637B2 (en) | System and method for conditional expansion obfuscation | |
CN105354449A (zh) | 一种面向Lua语言的加扰混淆方法和解密方法 | |
CN103065069A (zh) | 一种基于壳技术的软件保护方法 | |
CN104063635B (zh) | 目标文件的保护方法及保护系统 | |
CN107908933A (zh) | 一种基于中间语言的字符串加密方法 | |
CN104091100A (zh) | 一种基于编译中间结果的软件保护方法 | |
CN105787305A (zh) | 一种抵抗符号执行和污点分析的软件保护方法 | |
CN103413075A (zh) | 一种通过虚拟机保护java可执行程序的方法及设备 | |
CN105718765A (zh) | 一种利用有限自动机实现代码混淆的方法 | |
CN107967152B (zh) | 基于最小分支路径函数胎记的软件局部抄袭证据生成方法 | |
CN108537012B (zh) | 基于变量和代码执行顺序的源代码混淆方法及装置 | |
Pawlowski et al. | Probfuscation: an obfuscation approach using probabilistic control flows | |
EP2937803B1 (en) | Control flow flattening for code obfuscation where the next block calculation needs run-time information | |
Wang et al. | Tdvmp: Improved virtual machine-based software protection with time diversity | |
CN108021790B (zh) | 文件保护方法、装置、计算设备及计算机存储介质 | |
EP3380974B1 (en) | Method to generate a secure code | |
KR102430335B1 (ko) | 가상화 코드의 난독화를 강화하는 방법 및 그 장치 | |
CN106407751A (zh) | 对可执行文件进行保护的方法和装置 | |
Patel | Similarity tests for metamorphic virus detection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170215 Termination date: 20190115 |
|
CF01 | Termination of patent right due to non-payment of annual fee |