CN107632832B - 一种面向dalvik字节码控制流混淆方法 - Google Patents

一种面向dalvik字节码控制流混淆方法 Download PDF

Info

Publication number
CN107632832B
CN107632832B CN201710890982.XA CN201710890982A CN107632832B CN 107632832 B CN107632832 B CN 107632832B CN 201710890982 A CN201710890982 A CN 201710890982A CN 107632832 B CN107632832 B CN 107632832B
Authority
CN
China
Prior art keywords
block
control flow
code
basic
structure block
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
Application number
CN201710890982.XA
Other languages
English (en)
Other versions
CN107632832A (zh
Inventor
张小松
牛伟纳
唐海洋
熊智鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Electronic Science and Technology of China
Original Assignee
University of Electronic Science and Technology of China
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Electronic Science and Technology of China filed Critical University of Electronic Science and Technology of China
Priority to CN201710890982.XA priority Critical patent/CN107632832B/zh
Publication of CN107632832A publication Critical patent/CN107632832A/zh
Application granted granted Critical
Publication of CN107632832B publication Critical patent/CN107632832B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开一种面向dalvik字节码控制流混淆方法,涉及软件保护领域,包括如下步骤:S1:将Android应用程序反编译成Smali代码,并以函数为单位对Smali代码进行存储,然后以结构块为节点对Smali代码进行混淆控制流图的构建;S2:对Smali代码进行混淆;混淆控制流图的过程具体包括插入多余控制流图、不可规约化控制流图、平展控制流图,在平展控制流图的过程中,根据混淆的深度来动态决定节点展开层次;S3:内存中经过混淆的结构块为输出单位,随机打乱结构块的输出位置,生成新的Smali代码。本发明解决了目前Android控制流混淆方法的混淆程度不高导致Android应用程序容易被还原,Android应用程序受保护的程度不高的问题。

Description

一种面向dalvik字节码控制流混淆方法
技术领域
本发明属于软件保护领域,具体涉及一种使用控制流插桩、不可归约化流图以及平展控制流对控制流混淆的方法。
背景技术
计算机软件在社会生活的各行各业发挥着越来越重要的作用,然而由于软件本身无边际成本、盗版成本低收益大等特点,软件盗版现象十分猖獗。根据IT桔子在2016年4月1号发步的数据统计,2015年全球因为软件盗版遭受的损失高达800亿美元,比上年增长了15%,行业急需相关软件保护技术的支持。
Android系统以其自身的开放性,自2007年问世后,便俘获了一大批开发者和硬件厂商的喜爱,平台上的应用软件数量也快速增加。美国一家市场调查机构发布了各大移动终端系统占有率情况,截止到2016年9月初,Android和苹果系统瓜分了手机系统的绝大数份额,其中Android系统份额为88.4%,苹果IOS份额为11.4%,其他的手机系统不足0.2%。与此同时,对应用程序的保护技术却处于起步阶段,许多PC平台下成熟的代码保护技术因为各种原因还未应用在Android平台上,应用程序遭遇二次重打包,知识产权侵犯、逆向破解等情况时有发生,严重破坏了软件开发商将软件移植到Android平台上的积极性。而且随着手机对人们的生活渗透越来越高,手机上包含着用户大量私人信息,如果不加强对Android平台的软件保护技术研究,用户的个人隐私保护将遭受巨大的考验。
由于成本低实用性强,代码混淆已成为最受青睐的应用程序保护技术。该技术目前大都应用在PC平台,但基于Android平台字节码级别的代码混淆技术研究还不成熟,常用的技术集中在变量名重命名等简单变换。
发明内容
本发明的目的在于:为解决目前Android控制流混淆方法的混淆程度不高导致Android应用程序容易被还原,Android应用程序受保护的程度不高的问题。
本发明的具体方案如下:
一种面向dalvik字节码控制流混淆方法,其特征在于,该方法包括如下步骤:
S1:将Android应用程序反编译成Smali代码,并以函数为单位对Smali代码进行存储,然后以结构块为节点对Smali代码进行混淆控制流图的构建;
S2:对Smali代码进行混淆;混淆控制流图的过程具体包括插入多余控制流图、不可规约化控制流图、平展控制流图,在平展控制流图的过程中,根据混淆的深度来动态决定结构块节点展开层次;
S3:以经过混淆的结构块为输出单位,随机打乱结构块的输出位置,生成新的Smali代码。
进一步地,在平展操作过程中,设平展后的case语句块数目为m,在平展过程中,需要对m设定一个阙值s;当m>=s时,停止对内层嵌套结构块的展开;当m<s时,在插入多余操作中,选择混淆的结构块后,判断Smali代码的基本块数目,若基本块数目t小于s,则插入s-t个基本块。
具体地,S1中,结构块包括循环结构块、for结构块、try结构块、switch结构块,
S1的具体步骤为:
S11:申请生成混淆过程的入口点entry以及空节点cfg_node,设置entry的后继节点为cfg_node,并把cfg_node设为当前结构块;
S12:静态扫描Smali代码,遇到如下指令进行如下操作:
if_type:
(1)该语句存入当前块、结束当前块;
(2)说明从该处开始,有一个If结构块或者循环结构块;
(3)区分If结构块和循环结构块,若是If结构块,可以暂时将整个Smali代码看成一个If语句组成的代码块,结束扫描;若是循环结构块,存储循环结构块,并从循环出口处继续扫描smali代码;并为识别出的结构块分配label,这个结构块即可能是If结构块又可能循环结构块;
label:
(1)结束当前块,创建一个空结点作为当前块,并将该if_type类型语句作为当前块的第一条语句;
(2)将该块设为前一结构块的后继节点,前一结构块设为该结构块前驱节点;
(3)其他跳转至该label的边,扫描到goto语句时处理;
swtich_type:
说明从该处开始了一个Switch结构块,存储该结构块,并从Switch出口接着扫描;
try_catch_type:
说明从该处开始了一个try结构块,存储该结构块;
goto label:
说明存在一条控制流跳转路径,将goto语句的目标结构块放入当前结构块的后继节点组中,当前结构块放入目标结构块的前驱节点中。
return:
(1)该语句存入当前块,结束当前块;
(2)将该块的后继节点设为null;
其他语句:
直接将该语句加入当前块。
S13:控制流图中没有后继结点的结构块,则说明是最后一个结构块。
进一步地,S2中,插入多余控制流图的具体步骤为:
扫描代码,得到结构块,构成程序代码S中的n个结构块集合B,B=(B1,B2,…,Bn);以k个垃圾基本块或者垃圾代码产生算法的候选集作为集合R,R=(R1,R2,…Rk);将B中所有的结构块分裂成基本块,在基本块之间随机插入不透明谓词,再根据用户输入的选择策略;从集合R中选择合适的垃圾基本块插入进不透明谓词的分支路径下,得到代码块集合BR;最后将结构块封装。
进一步地,S2中,不可规约化流图的具体步骤为:(1)分析所有结构块,查找出待不可规约化的循环结构块;(2)插入不透明谓词,其中不透明谓词的路径指向循环结构块内部;(3)再在循环结构块内部插入垃圾基本块;最后将结构块封装。
更具体地,不可规约化算法描述如下:
输入可归约流图G和基本块数组Code[],输出不可规约图G’;
(1)依据流图G和循环查找算法,查找流图G中的循环;记录所有循环的回边,放入数组Edge[],为每一个回边分配一个ID作为作循环的标志;
(2)设S1为循环入口基本块,将S1分割成S1a,S1b两个基本块;S1a为程序第一次进入循环前需要执行的代码,S1b后继基本块设置为循环条件基本块E;
(3)构造两个不透明谓词PF,QF,其中PF置为S1a的后继基本块,PF取值为False的分支后继基本块置为S1b,将True的分支后继基本块置为循环条件基本块E;
(4)从循环结构块中选择一个只有一个后继基本块的基本块S2,将S2分割成S2a,S2b两个基本块,在S2a与S2b之间插入QF,其中S2b为QF取值为False的分支后继基本块,取值为True的分支后继基本块为S1b;
(5)PF对应的代码块为if(PF)then E else S1b,QF对应的代码块为if(QF)then为S1b else S2b,在S1b S2b S1a S2b基本块的结尾插入垃圾代码。
具体地,S2中,平展控制流图的具体步骤为:分析所有结构块,判断循环嵌套结构块,再抽取垃圾基本块和源基本块,源基本块即为未插入垃圾基本块的基本块,再使用平展算法进行平展,最后再封装结构块。
进一步地,在S4之前,使用新版本的BakSmali反编译字节码后,在得到混淆后的Smali文件中,每个寄存器在代码程序在执行过程前已经标识出该寄存器的类型,再检查一个寄存器在一个方法内部是否持有不同类型对象的引用,如果持有,则为会冲突的数据类型分配辅助寄存器。这样方便统计出每个寄存器所持有的所有的类型,在一个未经混淆破坏的结构块中,寄存器一旦发生复用,则说明之前引用的变量生命周期已结束,所以只需要记录结构块出口处寄存器引用类型。
采用上述方案后,本发明的有益效果如下:
(1)实现了Dalvik字节码层次的控制流混淆,第一次实现了Dalvik字节码层次的控制流混淆,传统CFG的节点都是以基本块为单位,本文根据混淆需要,动态地决定控制流图的节点展开层次,实现了代码执行开销和混淆强度的平衡。
(2)在输出字节码文件时,以结构块为单位,将具有逻辑相关性的结构块位置随机打乱,进一步增加混淆强度。混淆过程中,随机选取结构块,再随机选取一个不透明谓词,如果不透明谓词取值为真,则构造一个与选取结构块语义等价的结构块作为多余分支,如若不透明谓词取值为假,则复制结构块,随机变动结构块的数据类型,使得结构块“以假乱真”。
(3)本发明成功解决了由于Android平台校验机制的存在而引起的字节码无法成功运行的问题。
附图说明
图1为本发明的流程示意图;
图2为不可规约流程图;
图3为混淆方法实施流程图。
具体实施方式
下面将结合附图与详细的实施例对本发明进行更加详细地说明。
一种面向dalvik字节码控制流混淆方法,该方法包括如下步骤:
S1:对混淆前的Android应用程序的源代码进行控制流分析;使用反编译工具ApkTool将Android应用程序反编译成Smali代码,并以函数为单位对Smali代码进行存储,然后以结构块为节点对Smali代码进行混淆控制流图的构建。另外,将Android应用程序反编译成Smali代码,也可采用BakSmali、Jeb等方法。
S2:对Smali代码进行混淆;混淆控制流图的过程具体包括插入多余控制流图、不可规约化控制流图、平展控制流图,在平展控制流图的过程中,根据混淆的深度来动态决定节点展开层次。
S3:以经过混淆的结构块为输出单位,随机打乱结构块的输出位置,生成新的Smali代码。
由于Android平台资源有限,若不加优化的将算法移植到Android平台则会对系统造成较大的性能压力,因此,具体地,在平展操作过程中,设平展后的case语句块数目为m,代码中的结构块通常都会相互嵌套,在平展过程中,需要对m设定一个阙值s;当m>=s时,停止对内层嵌套结构块的展开;当m<s时,在插入多余操作中,选择混淆的结构块后,判断Smali代码的基本块数目,若基本块数目t小于s,则插入s-t个基本块。
针对next变量常量分析问题,可以使用不透明表达式生成算法。用E=x表示不透明表达式值恒为x。经过测试,当case语句块数目为25时能较好平衡混淆强度和混淆带来的性能开销。考虑到这样的两个全局数组g=[1,2,3,4,5,6,7,8,9],q=[1],变量u=q[0],用g[x]*10+g[y]来表示100以内的任意整数,即E=g[x]*10+g[y]。现在问题转化为如何较为隐蔽的表示出x与y的取值。在每次使用完数组后,对数组g进行一次元素右移一位的转换,并记住1的下标k,使得q=[g[k]],即u=g[k]=1恒成立。可以据此得到2=g[(k+g[k])%10],3=g[(k+2)%10]=g[(k+g[(k+g[k])%10])%10]等。由于数组g和q是两个全局数组,也就意味可以在类中的任意方法中引用两个分组。此时,破解者如若进行切片分析来推断表达式值时,切片的结果将特别大,进行一个准确的过程间切片分析将会变很慢。如果程序中存在大量的引用,潜在的别名引用问题将会以指数形式暴涨。另外,破解者还需要破解数组转换算法,以及至多9次的查找表过程。
具体地,S1中,结构块包括循环结构块、for结构块、try结构块、switch结构块,S1的具体步骤为:
S11:申请生成混淆过程的入口点entry以及空节点cfg_node,设置entry的后继节点为cfg_node,并把cfg_node设为当前结构块。
S12:静态扫描Smali代码,遇到如下指令进行如下操作:
if_type:
(1)该语句存入当前块、结束当前块。
(2)说明从该处开始,有一个If结构块或者循环结构块。
(3)区分If结构块和循环结构块,若是If结构块,可以暂时将整个Smali代码看成一个If语句组成的代码块,结束扫描;若是循环结构块,存储循环结构块,并从循环出口处继续扫描smali代码;并为识别出的结构块分配label,这个结构块即可能是If结构块又可能循环结构块。
label:
(1)结束当前块,创建一个空结点作为当前块,并将该if_type类型语句作为当前块的第一条语句。
(2)将该块设为前一结构块的后继节点,前一结构块设为该结构块前驱节点。
(3)其他跳转至该label的边,扫描到goto语句时处理。
swtich_type:
说明从该处开始了一个Switch结构块,存储该结构块,并从Switch出口接着扫描。
try_catch_type:
说明从该处开始了一个try结构块,存储该结构块。
goto label:
说明存在一条控制流跳转路径,将goto语句的目标结构块放入当前结构块的后继节点组中,当前结构块放入目标结构块的前驱节点中。
return:
(1)该语句存入当前块,结束当前块。
(2)将该块的后继节点设为null。
其他语句:
直接将该语句加入当前块。
S13:控制流图中没有后继结点的结构块,则说明是最后一个结构块。
由于Java语言与虚拟机设计上的鸿沟,更低层次的语言能够表示任意的数据流。比如Java源码是不支持goto指令,但Dalvik虚拟机却支持该指令,通常使用结构化的跳转语句,如嵌套if-then-else、case-、while-do、for-语句编程,程序的控制流图就一定是可归约的,很容易使用将程序反编译成高级语言。但是如果在程序加上跳到循环内部的跳转,将控制流图变成不可规约的,破解者很难将这类代码反编译为结构化的高级语言,数据流分析的工作将会变得十分复杂。添加垃圾结构块扰乱破解者对程序真实控制流的还原。
因此,具体地,S2中,插入多余控制流图的具体步骤为:
扫描代码,得到结构块,构成程序代码S中的n个结构块集合B,B=(B1,B2,…,Bn);以k个垃圾基本块或者垃圾代码产生算法的候选集作为集合R,R=(R1,R2,…Rk);将B中所有的结构块分裂成基本块,在基本块之间随机插入不透明谓词,再根据用户输入的选择策略;从集合R中选择合适的垃圾基本块插入进不透明谓词的分支路径下,得到代码块集合BR;最后将结构块封装。
具体地,不可规约化流图的具体步骤为:分析所有结构块,查找出待不可规约化的循环结构块,插入不透明谓词,其中不透明谓词的路径指向循环结构块内部;再在循环结构块内部插入垃圾结构块;最后将结构块封装。
具体地,S2中,平展控制流图的具体步骤为:分析所有结构块,判断循环嵌套结构块,再抽取垃圾基本块和源基本块,再使用平展算法进行平展,最后再封装结构块。
在S4之前,使用新版本的BakSmali反编译字节码后,在得到Smali文件中,每个寄存器在使用前已经标识出该寄存器的类型,这样方便统计出每个寄存器所持有的所有的类型,在一个未经混淆破坏的结构块中,寄存器一旦发生复用,则说明之前引用的变量生命周期已结束,所以只需要记录结构块出口处寄存器引用类型。
Dalvik字节码的运行是由Dalvik虚拟机完成。Dalvik不仅需要解释执行字节码,也要对字节码进行输入校验。混淆后的字节码必须首要满足虚拟机对字节码的校验,校验工作保证了字节码的编译是使用了正确的静态变量和结构约束。尚没有一份有价值的文件揭示了校验具体是如何工作的,因此必须重新设计实验来观察字节码必须满足怎样的约束条件,更重要的是,无论如何,经过混淆的字节码必须能够被正确运行。
针对本发明提出的方案,使用控制流混淆时将会导致虚拟机报告一个寄存器类型冲突问题。虚拟机认为某个被使用的寄存器可能在不同的程序节点持有了两种不同类型的对象的引用。事实上这是由于本文提出的方案会有一个插入多余控制流的操作,此问题的根源在于虚拟机没有能力分辨出实际上插入的分支永远不会被执行,或者某个分支必然会被执行到。考虑到下面示例的Java代码。
Figure BDA0001421155030000081
这个方法的主要功能是打印变量a的绝对值和正反性,为了代码更紧凑,使用了两个辅助函数logChar()和printInt()。下表明了经过本文提出的混淆方案混淆后的Smali代码。
经过混淆后的Smali代码为:
Figure BDA0001421155030000091
Figure BDA0001421155030000101
当我们试图运行该程序时,从logcat可以看出虚拟机会报出以下错误。
Figure BDA0001421155030000102
从以上错误信息可以推断出,虚拟机执行了一次保守的静态程序分析,保证程序中没有潜在的寄存器类型冲突问题。在这个例子中,虚拟机的校验程序并不能正确推断出v2的值在执行完代码块obf_pswitch_2后已经正确地指向了一个字符串类型的对象,相反,虚拟机认为v2在代码块block 0有个整型变量的定义过程,所有推断出v2持有的是个整型类型。
根据以上分析,我们可以推断出Dalvik虚拟机允许寄存器在一个方法内部持有不同类型变量,甚至经常是完全不相容的类型引用。在没有混淆的原程序中,寄存器复用的前提是两种完全不相容的数据类型有着完全不重叠的生命周期,已知的编译理论能够确保编译器做到这一点,应用变量生命周期分析技术确保当一个寄存器为多个不同类型变量重用时,这些变量有着不重叠的生命周期。
但当应用控制流混淆技术时,不透明谓词的取值不仅对于破解者是不透的,而且也对于虚拟机的校验过程起到了迷惑作用,虚拟机可能发现某个寄存器指向的类型在起始的基本块还能通过类型检查,然而在结尾处的另一实际并不执行的基本块中却当作其他类型在处理。在每个方法执行前,虚拟机会追踪每个活跃的寄存器所持有的变量类型,一旦发现寄存器在同一程序节点持有不同类型的引用,就会报告寄存器类型冲突错误。
为了解决上述问题,本文提出寄存器类型隔离技术。在执行混淆前,该技术会首先检查一个寄存器在一个方法内部是否持有不同类型对象的引用,如果持有,则为会冲突的数据类型分配新的寄存器。需要指出的是,数据类型的寄存器能够持有所有数据型的变量引用,比如integer、float甚至是Boolean。这是因为Dalvik字节码会统一对数据型变量的操作。所以,只要对遭遇冲突的类型新分配一个寄存器即可。
在实现寄存器隔离技术时,还需要解决一个问题。每个方法使用的寄存器数目将会增加,一些虚拟机操作指令只接受前16个寄存器(v0-v15),比如movevA,vB,array-length vA,vB。当然这些操作可以用那些接受高位寄存器的等价操作代替,比如move操作可以用move/from16。然而有些指令没有等价的操作,对于这些指令,比如vA寄存器在某个基本块指向类A的某个对象,在另外一个实际上并不执行的基本块中,又指向类B的某个类象,最后作为类型A使用,虚拟机在校验时报错。本实施例提出的解决方案是,在vA=new A()语句下面插入一条语句“vAA=vA”,在vA=new B()语句下面插入一条语句“vBB=vA”,这样寄存器每个冲突的类型都有一个对应的辅助高位寄存器,最后如果vA需要作为类型A使用时,使用前先插入一条语句vA=vAA;即每个类型在使用高位寄存器前,先需要将高位寄存器的值转移至低位寄存器,如用move/from16转移32位宽的基本数据类型;用move-wide/from16转移64位宽的基本数据类型;用move-object/from16转移类类型。所有被利用的低位寄存器随后都将被视作操作数传递给操作指令。由于第二种方法对操作数必须是低位寄存器的指令也适用,所以在实现时统一用第二种方法实现。

Claims (6)

1.一种面向dalvik字节码控制流混淆方法,其特征在于,该方法包括如下步骤:
S1:将Android应用程序反编译成Smali代码,并以函数为单位对Smali代码进行存储,然后以结构块为节点对Smali代码进行混淆控制流图的构建;
S1中,结构块包括循环结构块、for结构块、try结构块、switch结构块;
S2:对Smali代码进行混淆;混淆控制流图的过程具体包括插入多余控制流图、不可规约化控制流图、平展控制流图,在平展控制流图的过程中,根据混淆的深度来动态决定结构块节点展开层次;
在平展操作过程中,设平展后的case语句块数目为m,在平展过程中,需要对m设定一个阙值s;当m>=s时,停止对内层嵌套结构块的展开;当m<s时,在插入多余操作中,选择混淆的结构块后,判断Smali代码的基本块数目,若基本块数目t小于s,则插入s-t个基本块;
S3:以经过混淆的结构块为输出单位,随机打乱结构块的输出位置,生成新的Smali代码。
2.根据权利要求1所述的一种面向dalvik字节码控制流混淆方法,其特征在于,S1的具体步骤为:
S11:申请生成混淆过程的入口点entry以及空节点cfg_node,设置entry的后继节点为cfg_node,并把cfg_node设为当前结构块;
S12:静态扫描Smali代码,遇到如下指令进行如下操作:
if_type:
(1)该if_type语句存入当前块、结束当前块;
(2)说明从该处开始,有一个If结构块或者循环结构块;
(3)区分If结构块和循环结构块,若是If结构块,暂时将整个Smali代码看成一个If语句组成的代码块,结束扫描;若是循环结构块,存储循环结构块,并从循环出口处继续扫描smali代码;并为识别出的结构块分配label,这个结构块既可能是If结构块又可能是循环结构块;
label:
(1)结束当前块,创建一个空结点作为当前块,并将该if_type类型语句作为当前块的第一条语句;
(2)将该块设为前一结构块的后继节点,前一结构块设为该结构块前驱节点;
(3)其他跳转至该label的边,扫描到goto语句时处理;
swtich_type:
说明从该处开始了一个Switch结构块,存储该结构块,并从Switch出口接着扫描;
try_catch_type:
说明从该处开始了一个try结构块,存储该结构块;
goto label:
说明存在一条控制流跳转路径,将goto语句的目标结构块放入当前结构块的后继节点组中,当前结构块放入目标结构块的前驱节点中;
return:
(1)该return语句存入当前块,结束当前块;
(2)将该块的后继节点设为null;
其他语句:
直接将该语句加入当前块;
S13:控制流图中没有后继结点的结构块,则说明是最后一个结构块。
3.根据权利要求1所述的面向dalvik字节码控制流混淆方法,其特征在于,S2中,插入多余控制流图的具体步骤为:
扫描代码,得到结构块,构成程序代码S中的n个结构块集合B,B=(B1,B2,…,Bn);以k个垃圾基本块或者垃圾代码产生算法的候选集作为集合R,R=(R1,R2,…Rk);将B中所有的结构块分裂成基本块,在基本块之间随机插入不透明谓词,再根据用户输入的选择策略;从集合R中选择合适的垃圾基本块插入进不透明谓词的分支路径下,得到代码块集合BR;最后将结构块封装。
4.根据权利要求1所述的面向dalvik字节码控制流混淆方法,其特征在于,S2中,不可规约化流图的具体步骤为:(1)分析所有结构块,查找出待不可规约化的循环结构块;(2)插入不透明谓词,其中不透明谓词的路径指向循环结构块内部;(3)再在循环结构块内部插入垃圾基本块;最后将结构块封装;
更具体地,不可规约化算法描述如下:
输入可归约流图G和基本块数组Code[],输出不可规约图G’;
(1)依据流图G和循环查找算法,查找流图G中的循环;记录所有循环的回边,放入数组Edge[],为每一个回边分配一个ID作为作循环的标志;
(2)设S1为循环入口基本块,将S1分割成S1a,S1b两个基本块;S1a为程序第一次进入循环前需要执行的代码,S1b后继基本块设置为循环条件基本块E;
(3)构造两个不透明谓词PF,QF,其中PF置为S1a的后继基本块,PF取值为False的分支后继基本块置为S1b,将True的分支后继基本块置为循环条件基本块E;
(4)从循环结构块中选择一个只有一个后继基本块的基本块S2,将S2分割成S2a,S2b两个基本块,在S2a与S2b之间插入QF,其中S2b为QF取值为False的分支后继基本块,取值为True的分支后继基本块为S1b;
(5)PF对应的代码块为if(PF)then E else S1b,QF对应的代码块为if(QF)then为S1belse S2b,在S1b S2b S1a S2a基本块的结尾插入垃圾代码。
5.根据权利要求1所述的面向dalvik字节码控制流混淆方法,其特征在于,S2中,平展控制流图的具体步骤为:分析所有结构块,判断循环嵌套结构块,再抽取垃圾基本块和源基本块,源基本块即为未插入垃圾基本块的基本块,再使用平展算法进行平展,最后再封装结构块。
6.根据权利要求1所述的一种面向dalvik字节码控制流混淆方法,其特征在于,使用新版本的BakSmali反编译字节码后,在得到混淆后的Smali文件中,每个寄存器在代码程序在执行过程前已经标识出该寄存器的类型,再检查一个寄存器在一个方法内部是否持有不同类型对象的引用,如果持有,则为会冲突的数据类型分配辅助寄存器。
CN201710890982.XA 2017-09-27 2017-09-27 一种面向dalvik字节码控制流混淆方法 Active CN107632832B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710890982.XA CN107632832B (zh) 2017-09-27 2017-09-27 一种面向dalvik字节码控制流混淆方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710890982.XA CN107632832B (zh) 2017-09-27 2017-09-27 一种面向dalvik字节码控制流混淆方法

Publications (2)

Publication Number Publication Date
CN107632832A CN107632832A (zh) 2018-01-26
CN107632832B true CN107632832B (zh) 2020-12-15

Family

ID=61103829

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710890982.XA Active CN107632832B (zh) 2017-09-27 2017-09-27 一种面向dalvik字节码控制流混淆方法

Country Status (1)

Country Link
CN (1) CN107632832B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446537A (zh) * 2018-02-12 2018-08-24 北京梆梆安全科技有限公司 基于不透明谓词的源代码混淆方法及装置
CN108416191B (zh) * 2018-02-12 2021-11-19 北京梆梆安全科技有限公司 基于不透明谓词和有限状态机加固源代码的方法及装置
CN109409036A (zh) * 2018-09-19 2019-03-01 苏州创旅天下信息技术有限公司 基于冗余代码的控制流混淆方法及装置、存储介质和终端
CN109739582B (zh) * 2018-12-12 2022-05-17 北京字节跳动网络技术有限公司 函数调用方法、装置、电子设备和计算机可读存储介质
CN109740313A (zh) * 2018-12-12 2019-05-10 北京字节跳动网络技术有限公司 计算机程序保护方法、装置、电子设备和计算机可读存储介质
CN110413283B (zh) * 2019-08-02 2023-05-30 北京智游网安科技有限公司 基于编译器前端的混淆方法、存储介质及终端设备

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9408073B2 (en) * 2013-09-11 2016-08-02 Oracle International Corporation Proximity and behavior-based enterprise security using a mobile device
CN103544414B (zh) * 2013-10-25 2015-08-19 江苏通付盾信息科技有限公司 一种Android系统应用的深度代码混淆方法

Also Published As

Publication number Publication date
CN107632832A (zh) 2018-01-26

Similar Documents

Publication Publication Date Title
CN107632832B (zh) 一种面向dalvik字节码控制流混淆方法
US11036614B1 (en) Data control-oriented smart contract static analysis method and system
US7380242B2 (en) Compiler and software product for compiling intermediate language bytecodes into Java bytecodes
Tan et al. Making k-object-sensitive pointer analysis more precise with still k-limiting
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
US9047583B2 (en) Ontology context logic at a key field level
CN100370425C (zh) 将本机函数内嵌到编译的Java代码中的方法和系统
CN103413075B (zh) 一种通过虚拟机保护java可执行程序的方法及设备
CN101853200B (zh) 一种高效动态软件漏洞挖掘方法
CN108139896A (zh) 扩展虚拟机指令集体系架构
Hou et al. Three control flow obfuscation methods for Java software
CN108537012B (zh) 基于变量和代码执行顺序的源代码混淆方法及装置
Miecznikowski et al. Decompiling Java using staged encapsulation
KR101234591B1 (ko) Jni를 이용한 안드로이드 난독화 방법
CN110673852B (zh) 一种基于编译器前端实现控制流平坦的方法、系统及设备
US20220107827A1 (en) Applying security mitigation measures for stack corruption exploitation in intermediate code files
Lin et al. Graph-based seed object synthesis for search-based unit testing
Cimato et al. Overcoming the obfuscation of Java programs by identifier renaming
You et al. A Comparative Study on Optimization, Obfuscation, and Deobfuscation tools in Android.
Mendis et al. Revec: program rejuvenation through revectorization
US11307962B2 (en) Method for semantic preserving transform mutation discovery and vetting
CN103677746A (zh) 指令重组方法及装置
US11886839B2 (en) Non-transitory computer-readable recording medium, function generation method, and information processing device
US20100095376A1 (en) Software watermarking
Hubbers et al. From finite state machines to provably correct java card applets

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