CN112163195A - 一种基于堆栈隐藏的新型虚拟机软件保护方法 - Google Patents
一种基于堆栈隐藏的新型虚拟机软件保护方法 Download PDFInfo
- Publication number
- CN112163195A CN112163195A CN202011097261.1A CN202011097261A CN112163195A CN 112163195 A CN112163195 A CN 112163195A CN 202011097261 A CN202011097261 A CN 202011097261A CN 112163195 A CN112163195 A CN 112163195A
- Authority
- CN
- China
- Prior art keywords
- instruction
- module
- virtual machine
- function
- file
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 62
- 230000006870 function Effects 0.000 claims abstract description 147
- 238000013507 mapping Methods 0.000 claims abstract description 68
- 101001064096 Homo sapiens Protein disulfide-thiol oxidoreductase Proteins 0.000 claims abstract description 6
- 102100030728 Protein disulfide-thiol oxidoreductase Human genes 0.000 claims abstract description 6
- 101100269977 Arabidopsis thaliana APK2 gene Proteins 0.000 claims abstract description 4
- 238000004088 simulation Methods 0.000 claims description 39
- 238000006243 chemical reaction Methods 0.000 claims description 3
- 239000000284 extract Substances 0.000 abstract description 3
- 230000002787 reinforcement Effects 0.000 abstract description 3
- 238000012986 modification Methods 0.000 description 8
- 230000004048 modification Effects 0.000 description 8
- 238000005336 cracking Methods 0.000 description 5
- 230000007547 defect Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 239000011159 matrix material Substances 0.000 description 3
- 238000012545 processing Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 1
- 230000006837 decompression Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000009434 installation Methods 0.000 description 1
- 230000001172 regenerating effect Effects 0.000 description 1
- 230000003014 reinforcing effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
Images
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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45587—Isolation or security of virtual machine instances
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于堆栈隐藏的新型虚拟机软件保护方法,属于移动应用加固领域。首先对DEX文件解析为数据结构DexHelper,指令映射模块将每个被保护函数中添加混淆字节码指令,并将return指令随机插入混淆后的字节码指令中,统计混淆字节码的频率。指令映射模块将每条新的字节码映射指令中的字节码和操作数进行位操作或交换操作,构成新的重映射指令集合B。数据结构DexHelper中不被保护的函数集合和APK1中原有的SO文件写入数据文件S中并重新打包生成APK2并签名。Android端初始化模块从数据文件S中提取被保护App的DEX和SO文件,创建索引和关键函数的数据cache。由Android端虚拟机负责执行不被保护的函数,由自定义虚拟机执行被保护函数。本发明具有通用性、可移植性和安全性。
Description
技术领域
本发明属于移动应用加固领域,具体是一种基于堆栈隐藏的新型虚拟机软件保护方法。
背景技术
随着移动互联网时代的发展,人们越来越离不开智能移动设备。无论是通话、短信或娱乐等传统软件,还是支付、社交或工作等新兴软件,在人们的生活中发挥着越来越重要的作用。同时,移动软件中包含了大量的用户信息和软件核心业务逻辑,甚至是用户密码等隐私数据,由于Android平台的开源性,如果不对软件进行特殊保护,攻击者很容易就能获取用户信息和核心业务逻辑。
现有的软件加固方法都是基于动态加载实现的:即在类加载的过程中,对需要保护的类指令进行整体加密保护,但是该方法有两个严重缺陷:1)运行该类的指令时,内存中会出现明文指令序列;2)执行指令时,必须通过系统解释器解释执行。攻击者很容易从内存或者系统解释器入口获取明文指令序列。
虚拟机软件保护技术通过自定义解释器解释执行加密的指令序列,而无需解密还原为明文指令序列,避免了从内存和系统解释器入口获取明文指令序列。
但是,现有的虚拟机保护方法实现保护功能的做法是通过重新映射指令操作码,具体映射包括:1)通过置换矩阵生成标准指令操作码和自定义指令操作码的一一映射;2)预生成几套标准指令操作码和自定义指令操作码的映射,加固软件时随机选取其中的一套指令映射。
由于现有的虚拟机保护方法仍存在伪随机指令映射、调用JNI标准接口等缺陷,从而针对现有虚拟机保护的攻击方法应运而生,主要分为两种:1)破解虚拟机的逻辑从而还原出指令映射,从而将自定义指令序列还原为标准指令集序列;2)针对JNI接口调用,破解出加密指令序列的功能,从而还原出功能一样的替代函数,攻击者可以直接修改替代函数对软件进行攻击。
发明内容
为了有效避免虚拟机软件保护遭受攻击,本发明提供了一种基于堆栈隐藏的新型虚拟机软件保护方法;一方面可以有效的防止攻击者通过破解指令映射,获取标准指令序列,反编译出软件的核心业务逻辑;另一方面可以有效的防止攻击者通过JNI接口调用而猜测出加密指令序列的详细功能。同时本发明兼容其他保护方法,允许对已加固的软件使用本方法。此外,该方法不仅能够在App没有运行时保护关键函数的指令序列,而且能够在运行时动态的保护关键函数的指令序列和运行时数据。
所述的基于堆栈隐藏的新型虚拟机软件保护方法,基于PC端和Android端设定,PC端包括解释器模块、JNI接口模块、指令映射模块和DEX文件解析模块;Android端包括初始化模块、指令解释器模块、VM同步模块和模拟寄存器堆栈模块,具体步骤如下:
步骤一、对PC端上某个Android应用程序包APK1进行解压,DEX文件解析模块将解压目录中的DEX文件解析为数据结构DexHelper;
DEX文件解析模块包括修改数据接口,获取指令接口以及修改XML文件接口。
步骤二、针对数据结构DexHelper中的被保护函数集合A,用户调用配置文件对每个被保护函数逐个进行声明,对不需保护的函数不予处理;
具体为:配置文件的每一行分别声明一个被保护函数;声明的格式为:全类名#函数名:函数签名;
JNI接口模块通过解析配置文件,获取被保护函数的信息;
步骤三、指令映射模块将每个被保护函数中添加混淆字节码指令,并对各保护函数中的return指令随机插入混淆后的字节码指令中;
混淆字节码是指没用的字节码;
步骤四、指令映射模块使用获取指令接口获取被保护函数的混淆后的字节码指令,并统计指令中的混淆字节码的频率,重新生成新的字节码映射关系;
具体过程为:
首先,人为设定混淆字节码的频率阈值,将高于该阈值的混淆字节码频率进行M级映射,即将该频率同时映射到M个不同的自定义指令中,保证每个新的自定义指令中频率相同,最终生成一对多的指令映射关系,M大于等于10。
将低于该阈值的混淆字节码频率进行低级映射,是指将该频率映射至一个或少数N个不同的自定义指令中即可,N小于等于5。
步骤五、指令映射模块将每条新的字节码映射指令以bit为单位,对指令中的字节码和操作数进行位操作或交换操作,形成重映射指令,最终构成新的重映射指令集合B;
步骤六、将重映射指令集合B单独保存至自定义的数据文件S中;同时,根据被保护函数集合A与重映射指令集合B之间的转换关系,利用脚本生成指令解码模块的源码;
该源码要运行重映射指令集合B的自定义虚拟机的指令解码模块;
步骤七、DEX文件解析模块使用gcc将指令解码模块编译成动态链接库,保存至加固后的路径中;同时,DEX文件解析模块删除被保护函数集合A的函数定义和字节码序列,同时删除与被保护函数集合A有关的debug调试数据;
步骤八、DEX文件解析模块修改AndroidManifest.xml中的Application name为壳DEX文件,作为加载动态链接库的入口;
步骤九、DEX文件解析模块将重映射指令集合B,数据结构DexHelper中不被保护的函数集合和APK1中原有的SO文件写入数据文件S中并重新打包生成APK2并签名。
步骤十、Android端通过壳DEX文件加载动态链接库,初始化模块从数据文件S中提取被保护App的DEX和SO文件,添加到当前ClassLoader类中;
步骤十一、初始化模块初始化自定义虚拟机,重映射指令集合B中的指令序列,创建索引和关键函数的数据cache;
步骤十二、当执行不被保护的函数时由Android端虚拟机负责执行,当执行被保护函数时由自定义虚拟机执行;
首先,执行被保护函数前,初始化模块切换运行环境为自定义虚拟机环境,调用模拟寄存器堆栈模块的初始化接口实现初始化模拟堆栈和模拟寄存器;
然后,指令解释器模块获取模拟堆栈和模拟寄存器,解释执行自定义指令序列,执行指令过程中调用VM同步模块的数据同步接口来获取Android端虚拟机中的变量数据,根据不同的指令完成基本运算、函数调用和异常处理等操作;
步骤十三、函数执行完,指令解释器模块调用模拟寄存器堆栈模块的资源释放接口回收模拟堆栈和模拟寄存器的内存,最后完成函数返回,运行环境从自定义虚拟机环境切换至Android虚拟机环境。
本发明的优点在于:
1、一种基于堆栈隐藏的新型虚拟机软件保护方法,具有通用性,可以在已经加固的APP上使用本方法,且适用Android4.4以上机型。
2、一种基于堆栈隐藏的新型虚拟机软件保护方法,具有可移植性,不依赖底层的实现逻辑,可以在Android平台上大部分机型上直接使用。
3、一种基于堆栈隐藏的新型虚拟机软件保护方法,具有透明性,所述的指令重映射方法是透明的,用户只需要指定需要保护的函数即可。
4.一种基于堆栈隐藏的新型虚拟机软件保护方法,具有高性能,对运行时关键的数据建立缓存,较其他软件保护方法在运行效率上有了很大的提升。
5.一种基于堆栈隐藏的新型虚拟机软件保护方法,具有安全性,在指令映射时采用完全随机一对多映射,函数调用时采用JNI接口和模拟函数调用结合方式,减少大量的JNI接口调用,有效的防止攻击者根据JNI接口破解出指令映射关系。
附图说明
图1是本发明基于堆栈隐藏的新型虚拟机软件保护方法基于的PC端示意图;
图2是本发明基于堆栈隐藏的新型虚拟机软件保护方法基于的Android端示意图;
图3是本发明基于堆栈隐藏的新型虚拟机软件保护方法的流程图;
图4是本发明实施例中的混淆字节码添加花指令和return指令后的重定位图;
图5是本发明标准指令操作码与自定义指令操作码一对多随机映射图;
图6是本发明对自定义指令集每条指令的操作码和操作数进行按位重新映射的示意图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图对本发明作进一步的详细和深入描述。
本发明是一种基于虚拟机的软件保护方法,分为两部分实现:一部分是PC端,主要负责软件加固处理,即将原始的App加固处理为安全的App;第二部分是Android端,主要负责运行时环境的处理,即保证安全的App在Android平台正常运行。
PC端在处理完原始App之后产生一份自定义的格式的数据文件并被打包在APK安装包中,该文件中包含被保护方法的指令序列,Android端在运行时需要从该文件中获取被保护函数的数据,从而使得被保护的方法可以正常运行。
本发明具有以下特点:1)支持多个Android版本的运行环境;2)保证了关键函数指令序列的静态安全和运行时安全;3)文件系统中不存在明文数据,包括临时文件;4)指令映射关系没有出现在打包后的APK中;5)指令随机一对多映射;6)模拟函数调用,减少JNI接口泄漏运行时数据。
所述的基于堆栈隐藏的新型虚拟机软件保护方法,基于PC端和Android端设定,如图1所示,PC端包括解释器模块、JNI接口模块、指令映射模块和DEX文件解析模块;如图2所示,Android端包括初始化模块、指令解释器模块、VM同步模块和模拟寄存器堆栈模块,如图3所示,具体步骤如下:
步骤一、对PC端上某个Android应用程序包Apk1进行解压,DEX文件解析模块将解压目录中的DEX文件解析为数据结构DexHelper;
DEX文件解析模块负责将DEX文件解析为可修改的数据结构,为其他模块提供了各种修改DEX文件的接口;同时也负责重新生成修改后的DEX文件,包括修改数据接口,获取指令接口以及修改XML文件接口。其中修改数据接口和获取指令接口都是直接在数据结构DexHelper上封装一系列功能;由于DEX文件中采用大量的相对偏移和变长数据,因此一个值的修改将会影响后面所有的相对偏移值,因此该部分的工作量巨大。
现有的虚拟机保护方法都是将DEX文件反编译,然后修改smali(一种中间语言),最后在编译为DEX文件,这种方式也能实现修改DEX文件的目标,但是缺点是很致命的:1.必须要求原始App对DEX文件没有做任何修改——意味着反编译的这种方式与现有的软件保护方法不兼容。2.不能将debug的信息删除,debug信息提高了代码的可阅读行,使得攻击者很容易破解软件。本发明是通过直接解析DEX二进制文件的方式来修改DEX文件,难度较大且复杂,但是可以和其他的保护方案一同使用。
步骤二、针对数据结构DexHelper中的被保护函数集合A,用户调用配置文件对每个被保护函数逐个进行声明,对不需保护的函数不予处理;
具体为:配置文件的每一行分别声明一个被保护函数;声明的格式为:全类名#函数名:函数签名;如java.lang.String#hashCode:(V)I,函数签名规则采用标准的JNI函数签名规则,JNI接口模块通过解析配置文件,获取被保护函数的信息;JNI接口模块使用修改数据接口修改被保护函数的声明标志位为native_flag;
步骤三、指令映射模块将每个被保护函数中添加混淆字节码指令,并对各保护函数中的return指令随机插入混淆后的字节码指令中;
指令映射模块负责修改被保护函数的指令序列,包括:随机生成指令映射关系、添加混淆指令、return指令重定位以及操作码操作数重映射等。
现有的其他保护方法都是采用伪随机(随机生成3-5个指令映射,处理App时随机选其中的一个映射,缺点:破解难度只是一倍或两倍的难度,并没有从实际上提升破解的难度)和置换矩阵(256*256的矩阵,随机选取位置填1,其他位置为0,要求每行每列有且仅有一个1,缺点是每个字节码之间是一对一的关系,可以通过指令频率统计和一些特殊指令;如return指令为突破点,破解指令之间的映射关系,类似于古典密码学中的单表替换密码)
混淆字节码是指没用的字节码;某些指令通常会在固定的位置使用,如:return指令,出现的位置一般在函数尾部或者分支的尾部,本发明将此类指令随机插入到指令序列中,并配合goto指令,实现正常的执行流程,如添加花指令和return指令重定位图4所示。可以有效的防止攻击者以return指令这种特殊指令为突破口,破解自定义指令集合。
步骤四、指令映射模块使用获取指令接口获取被保护函数的混淆后的字节码指令,并统计指令中的混淆字节码的频率,重新生成新的字节码映射关系;
具体过程为:
首先,人为设定混淆字节码的频率阈值,将高于该阈值的混淆字节码频率进行M级映射,即将该频率同时映射到M个不同的自定义指令中,保证每个新的自定义指令中频率相同,最终生成一对多的指令映射关系,M大于等于10。
将低于该阈值的混淆字节码频率进行低级映射,是指将该频率映射至一个或少数N个不同的自定义指令中即可,N小于等于5。
如原始字节码中a出现2次,b出现4次,映射成自定义字节码时,a-->A(2次),b-->B(2次),b-->C(2次),从而使得自定义字节码A,B,C出现的频率相同。
在PC端中最重要的部分是对字节码序列的修改操作,本发明通过统计出字节码指令出现的频率,在生成随机映射关系时,频率较多的指令映射多个不同的自定义指令,频率较少的指令映射也要映射几个不同的自定义指令,最终生成一对多的指令映射关系,保证自定义指令集中每条指令出现的频率大致相同,可以有效避免指令的概率攻击,如标准自定义指令操作码与自定义指令操作码一对多随机映射如图5所示,该方法中以指令序列和时间戳为随机种子,可以保证每次处理App都可以产生随机的一对多指令映射关系。
步骤五、指令映射模块将每条新的字节码映射指令以bit为单位,对指令中的字节码和操作数进行位操作或交换操作,形成重映射指令,最终构成新的重映射指令集合B;
标准的字节码指令都是按照操作码、操作数的固定格式,本发明为了更好的隐藏指令的操作码,对自定义指令集每条指令的操作码和操作数进行了按位重新映射,如随机操作码操作数映射图6所示,从而使攻击者无法从自定义指令序列中提取自定义指令的操作码,极大的增加了破解的难度。
步骤六、将重映射指令集合B单独保存至自定义的数据文件S中;同时,根据被保护函数集合A与重映射指令集合B之间的转换关系,利用脚本生成指令解码模块的源码;
该源码要运行重映射指令集合B的自定义虚拟机的指令解码模块;
自定义格式的数据文件S是一种易读取、难修改的文件格式,其中包括保护函数的自定义指令序列、处理后的DEX文件以及APK1中包含的SO文件;
进一步,解释器模块主要根据指令映射模块生成的随机指令映射关系和操作码操作数重映射关系,生成自定义虚拟机中的解释指令的代码。
步骤七、DEX文件解析模块使用gcc将指令解码模块编译成动态链接库,保存至加固后的路径中;同时,DEX文件解析模块删除被保护函数集合A的函数定义和字节码序列,同时删除与被保护函数集合A有关的debug调试数据;
步骤八、DEX文件解析模块修改AndroidManifest.xml中的Application name为壳DEX文件,作为加载动态链接库的入口;
步骤九、DEX文件解析模块将重映射指令集合B,数据结构DexHelper中不被保护的函数集合和APK1中原有的SO文件写入数据文件S中并重新打包生成APK2并签名。
步骤十、Android端通过壳DEX文件加载动态链接库,初始化模块从数据文件S中提取被保护App的DEX和SO文件,添加到当前ClassLoader类中;
Android系统是用java语言实现的,java在执行某个函数之前需要加载这个函数所在的类,ClassLoader用来完成类加载。
初始化模块负责自定义虚拟机运行环境的初始化和关键函数执行环境的初始化。在启动自定义虚拟机时,该模块将自定义文件中的被保护函数的指令序列解析成运行时的数据结构,并根据方法签名建立索引,极大的提高了查找被保护函数指令序列的效率。在执行被保护函数时需要将运行时环境从Android虚拟机切换至自定义虚拟机,同时负责初始化寄存器、初始化调用堆栈、初始化被保护函数的指令序列以及一些关键变量的初始化,如PC指针、异常处理表等。
步骤十一、初始化模块初始化自定义虚拟机,重映射指令集合B中的指令序列,创建索引和关键函数的数据cache;
步骤十二、当执行不被保护的函数时由Android端虚拟机负责执行,当执行被保护函数时由自定义虚拟机执行;
首先,执行被保护函数前,初始化模块利用被保护函数的JNI接口函数切换运行环境为自定义虚拟机环境,调用模拟寄存器堆栈模块的初始化接口实现初始化模拟堆栈和模拟寄存器;
进一步,PC端上的JNI接口模块通过解析配置文件,获取被保护函数的信息;负责生成被保护函数的JNI接口函数,并在接口函数中完成Android虚拟机运行环境与自定义虚拟机运行环境的切换。通过修改被保护函数的声明标志位,把被保护函数从Java函数声明为native函数,从而进入自定义虚拟机中执行被保护函数的指令序列。
然后,指令解释器模块获取模拟堆栈和模拟寄存器,解释执行自定义指令序列,执行指令过程中调用VM同步模块的数据同步接口来获取Android端虚拟机中的变量数据,根据不同的指令完成基本运算、函数调用和异常处理等操作;
自定义虚拟机利用模拟寄存器来保存函数运行时的临时变量,利用模拟堆栈可以在自定义虚拟机内部完成函数调用的过程。如func1中调用func2和func3,对函数func1保护之后,调用func2和func3的过程是通过模拟堆栈来实现,对于Android系统来说只有func1在执行,可以隐藏func1中的函数调用。
指令解释器模块负责解释执行自定义指令序列,根据不同指令的功能实现基本运算、函数调用、异常处理等。
VM同步模块负责与Android虚拟机通信,提供了获取变量和修改变量的接口,可以避免调用JNI接口来获取Android虚拟机中的数据,从而使攻击者无法根据JNI接口推断出被保护函数的功能。
步骤十三、函数执行完,指令解释器模块调用模拟寄存器堆栈模块的资源释放接口回收模拟堆栈和模拟寄存器的内存,最后完成函数返回,运行环境从自定义虚拟机环境切换至Android虚拟机环境。
模拟寄存器堆栈模块负责提供被保护函数运行时的模拟寄存器和函数调用堆栈,当被保护函数A调用被保护函数B时,本发明没有采用JNI接口,而是通过模拟堆栈的方法,直接执行被保护方法B,仅需简单的修改几个运行时指针变量就可以构造出被保护方法B的执行环境,既避免的JNI接口的调用,使攻击者无法针对JNI接口进行攻击,又提高了自定义虚拟机的执行效率,减少运行环境切换带来的损耗。同时,更能有效的阻止攻击者利用函数调用堆栈来还原自定义虚拟机的实现逻辑和被保护方法的指令序列。
本发明PC端的处理流程如下:(1)APK解压;(2)DEX文件解析模块将原始App的DEX文件解析为可以直接修改的数据结构——DexHelper;该数据结构为自定义的数据结构,方便DEX文件的修改。由于DEX文件中很多数据都是相对偏移,所以修改难度较大。(3)JNI接口模块使用DEX文件解析模块的修改数据接口修改被保护函数的声明标志位为native_flag;(4)指令映射模块使用DEX文件解析模块的获取指令接口获取被保护函数的原始字节码,并统计被保护函数的原始字节码的频率,重新随机生成新的字节码映射关系;(5)指令映射模块将被保护函数中添加混淆字节码指令,并对return指令随机插入混淆后的字节码指令中;(6)指令映射模块将每条指令以bit为单位,对操作码和操作数进行重映射;(7)指令映射模块根据(4)和(6)中的重映射关系,对被保护函数的指令序列进行转换,结果单独保存至自定义格式的数据文件中;(8)指令映射模块根据(4)和(6)中的重映射关系,生成自定义虚拟机的指令解码模块;(9)JNI接口模块生成被保护函数的JNI接口,将(8)生成的指令解码模块和自定义虚拟机的模块重新编译生成动态链接库,保存至加固后的路径中;(10)DEX文件解析模块删除DEX文件中的被保护函数的函数定义和字节码序列,同时删除所有函数的debug调试数据;(11)修改AndroidManifest.xml中的Application name为壳DEX文件,用于加载自定义虚拟机的功能;(12)将处理后的DEX文件也写入自定义格式的文件中;(13)重新打包生成APK并签名;最后将原始的App转换为安全的App。
Android端的执行流程如下:(1)Android系统加载自定义虚拟机的动态链接库;(2)初始化模块从自定义格式的数据文件中提取被保护App的DEX、SO文件,添加到当前ClassLoader类中,保证被保护的App可以正常运行;(3)初始化模块初始化自定义虚拟机,初始化指令序列,创建索引和关键函数的数据cache;(4)当执行普通函数时由Android虚拟机负责执行,当执行被保护方法时由自定义虚拟机执行;(5)执行被保护函数前,初始化模块切换运行环境为自定义虚拟机环境,调用模拟寄存器堆栈模块的初始化接口实现初始化模拟堆栈和模拟寄存器等;(6)指令解释器模块获取(5)中的模拟堆栈和模拟寄存器,解释执行自定义指令序列,执行指令过程中调用VM同步模块的数据同步接口来获取Android虚拟机中的变量数据,根据不同的指令完成基本运算、函数调用和异常处理等操作;(7)函数执行完,指令解释器模块调用调用模拟寄存器堆栈模块的资源释放接口回收模拟堆栈和模拟寄存器的内存,最后完成函数返回。
在解释执行自定义指令序列时,自定义解释器为被保护的函数构造了运行时环境:需要保证字节码在自定义虚拟机中实现和Android虚拟机中过程和结果都是相同的,从而保证函数可以被正确地执行。在运行时环境中,维护了该函数运行时的一些环境变量和三个工具模块——VM同步模块、模拟寄存器堆栈模块、指令解释模块。通过该运行时环境,自定义虚拟机可以摆脱JNI接口的限制,可以执行正确地执行自定义指令序列,甚至是未被保护函数的指令序列。
本发明针对软件虚拟机的主要攻击方式做了严格保护:对于字节码映射攻击,修改了字节码的结构,真正实现字节码的真随机一对多映射;在字节码随机映射的前提下,对字节码中的操作数和操作码重新映射,并通过添加混淆逻辑和重定位关键指令的方式,使得攻击者无法从自定义指令序列中分离操作码和操作数,加大了还原字节码的难度。另外,针对JNI接口攻击,本发明实现了自己的VM同步接口和函数调用逻辑,通过自己维护调用堆栈的方式来避免JNI接口的调用。本发明不仅在软件安全上做了很好的保护,而且在执行效率方面也做了大量的优化,可以实现将被保护函数的整个调用过程都在自定义虚拟机中执行,甚至是底层Android系统中的函数,从而给被保护函数提供一个安全的闭环执行环境。
Claims (5)
1.一种基于堆栈隐藏的新型虚拟机软件保护方法,其特征在于,具体步骤如下:
步骤一、对PC端上某个Android应用程序包APK1进行解压,DEX文件解析模块将解压目录中的DEX文件解析为数据结构DexHelper;
步骤二、针对数据结构DexHelper中的被保护函数集合A,用户调用配置文件对每个被保护函数逐个进行声明,对不需保护的函数不予处理;
步骤三、指令映射模块将每个被保护函数中添加混淆字节码指令,并对各保护函数中的return指令随机插入混淆后的字节码指令中;
混淆字节码是指没用的字节码;
步骤四、指令映射模块使用获取指令接口获取被保护函数的混淆后的字节码指令,并统计指令中的混淆字节码的频率,重新生成新的字节码映射关系;
具体过程为:
首先,人为设定混淆字节码的频率阈值,将高于该阈值的混淆字节码频率进行M级映射,即将该频率同时映射到M个不同的自定义指令中,保证每个新的自定义指令中频率相同,最终生成一对多的指令映射关系,M大于等于10;
将低于该阈值的混淆字节码频率进行低级映射,是指将该频率映射至一个或少数N个不同的自定义指令中即可,N小于等于5;
步骤五、指令映射模块将每条新的字节码映射指令以bit为单位,对指令中的字节码和操作数进行位操作或交换操作,形成重映射指令,最终构成新的重映射指令集合B;
步骤六、将重映射指令集合B单独保存至自定义的数据文件S中;同时,根据被保护函数集合A与重映射指令集合B之间的转换关系,利用脚本生成指令解码模块的源码;
该源码要运行重映射指令集合B的自定义虚拟机的指令解码模块;
步骤七、DEX文件解析模块使用gcc将指令解码模块编译成动态链接库,保存至加固后的路径中;同时,DEX文件解析模块删除被保护函数集合A的函数定义和字节码序列,同时删除与被保护函数集合A有关的debug调试数据;
步骤八、DEX文件解析模块修改AndroidManifest.xml中的Application name为壳DEX文件,作为加载动态链接库的入口;
步骤九、DEX文件解析模块将重映射指令集合B,数据结构DexHelper中不被保护的函数集合和APK1中原有的SO文件写入数据文件S中并重新打包生成APK2并签名;
步骤十、Android端通过壳DEX文件加载动态链接库,初始化模块从数据文件S中提取被保护App的DEX和SO文件,添加到当前ClassLoader类中;
步骤十一、初始化模块初始化自定义虚拟机,重映射指令集合B中的指令序列,创建索引和关键函数的数据cache;
步骤十二、当执行不被保护的函数时由Android端虚拟机负责执行,当执行被保护函数时由自定义虚拟机执行;
步骤十三、函数执行完,指令解释器模块调用模拟寄存器堆栈模块的资源释放接口回收模拟堆栈和模拟寄存器的内存,最后完成函数返回,运行环境从自定义虚拟机环境切换至Android虚拟机环境。
2.如权利要求1所述的一种基于堆栈隐藏的新型虚拟机软件保护方法,其特征在于,该方法基于PC端和Android端设定,PC端包括解释器模块、JNI接口模块、指令映射模块和DEX文件解析模块;Android端包括初始化模块、指令解释器模块、VM同步模块和模拟寄存器堆栈模块。
3.如权利要求1或2所述的一种基于堆栈隐藏的新型虚拟机软件保护方法,其特征在于,所述的DEX文件解析模块包括修改数据接口,获取指令接口以及修改XML文件接口。
4.如权利要求1所述的一种基于堆栈隐藏的新型虚拟机软件保护方法,其特征在于,所述的步骤二具体为:
配置文件的每一行分别声明一个被保护函数;声明的格式为:全类名#函数名:函数签名;
JNI接口模块通过解析配置文件,获取被保护函数的信息。
5.如权利要求1所述的一种基于堆栈隐藏的新型虚拟机软件保护方法,其特征在于,所述的步骤十二具体为:
首先,执行被保护函数前,初始化模块切换运行环境为自定义虚拟机环境,调用模拟寄存器堆栈模块的初始化接口实现初始化模拟堆栈和模拟寄存器;
然后,指令解释器模块获取模拟堆栈和模拟寄存器,解释执行自定义指令序列,执行指令过程中调用VM同步模块的数据同步接口来获取Android端虚拟机中的变量数据,根据不同的指令完成基本运算、函数调用和异常处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011097261.1A CN112163195B (zh) | 2020-10-14 | 2020-10-14 | 一种基于堆栈隐藏的虚拟机软件保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011097261.1A CN112163195B (zh) | 2020-10-14 | 2020-10-14 | 一种基于堆栈隐藏的虚拟机软件保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112163195A true CN112163195A (zh) | 2021-01-01 |
CN112163195B CN112163195B (zh) | 2022-08-05 |
Family
ID=73868248
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011097261.1A Active CN112163195B (zh) | 2020-10-14 | 2020-10-14 | 一种基于堆栈隐藏的虚拟机软件保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112163195B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112765633A (zh) * | 2021-01-26 | 2021-05-07 | 上海蛮犀科技有限公司 | 一种移动应用代码虚拟化的加固技术 |
CN113283215A (zh) * | 2021-07-15 | 2021-08-20 | 北京华云安信息技术有限公司 | 一种基于utf-32编码的数据混淆方法及装置 |
CN113836531A (zh) * | 2021-09-25 | 2021-12-24 | 上海蛮犀科技有限公司 | 一种移动应用代码内存动态还原的检测方法 |
CN115033871A (zh) * | 2022-06-06 | 2022-09-09 | 北京熵核科技有限公司 | 应用程序的运行环境生成方法及装置 |
CN115935302A (zh) * | 2022-12-13 | 2023-04-07 | 深圳市探鸽智能科技有限公司 | 安卓安装包的生成方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6463538B1 (en) * | 1998-12-30 | 2002-10-08 | Rainbow Technologies, Inc. | Method of software protection using a random code generator |
CN107729725A (zh) * | 2017-10-09 | 2018-02-23 | 南京南瑞集团公司 | 一种基于虚拟机指令修改的Android应用加固系统及方法 |
CN107992723A (zh) * | 2017-11-29 | 2018-05-04 | 南京莱斯信息技术股份有限公司 | 一种基于动态链接库的Java源码保护方法 |
CN109697339A (zh) * | 2017-10-20 | 2019-04-30 | 南京理工大学 | 一种基于动态虚拟指令变换的Android应用安全保护方法 |
CN110245467A (zh) * | 2019-05-13 | 2019-09-17 | 西北大学 | 基于Dex2C与LLVM的Android应用程序保护方法 |
-
2020
- 2020-10-14 CN CN202011097261.1A patent/CN112163195B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6463538B1 (en) * | 1998-12-30 | 2002-10-08 | Rainbow Technologies, Inc. | Method of software protection using a random code generator |
CN107729725A (zh) * | 2017-10-09 | 2018-02-23 | 南京南瑞集团公司 | 一种基于虚拟机指令修改的Android应用加固系统及方法 |
CN109697339A (zh) * | 2017-10-20 | 2019-04-30 | 南京理工大学 | 一种基于动态虚拟指令变换的Android应用安全保护方法 |
CN107992723A (zh) * | 2017-11-29 | 2018-05-04 | 南京莱斯信息技术股份有限公司 | 一种基于动态链接库的Java源码保护方法 |
CN110245467A (zh) * | 2019-05-13 | 2019-09-17 | 西北大学 | 基于Dex2C与LLVM的Android应用程序保护方法 |
Non-Patent Citations (1)
Title |
---|
高琦 等: "基于自修改字节码的Android软件保护技术研究", 《计算机应用与软件》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112765633A (zh) * | 2021-01-26 | 2021-05-07 | 上海蛮犀科技有限公司 | 一种移动应用代码虚拟化的加固技术 |
CN113283215A (zh) * | 2021-07-15 | 2021-08-20 | 北京华云安信息技术有限公司 | 一种基于utf-32编码的数据混淆方法及装置 |
CN113836531A (zh) * | 2021-09-25 | 2021-12-24 | 上海蛮犀科技有限公司 | 一种移动应用代码内存动态还原的检测方法 |
CN115033871A (zh) * | 2022-06-06 | 2022-09-09 | 北京熵核科技有限公司 | 应用程序的运行环境生成方法及装置 |
CN115935302A (zh) * | 2022-12-13 | 2023-04-07 | 深圳市探鸽智能科技有限公司 | 安卓安装包的生成方法和装置 |
CN115935302B (zh) * | 2022-12-13 | 2023-09-15 | 深圳市探鸽智能科技有限公司 | 安卓安装包的生成方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112163195B (zh) | 2022-08-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112163195B (zh) | 一种基于堆栈隐藏的虚拟机软件保护方法 | |
CN108733988B (zh) | 安卓平台上可执行程序的保护方法 | |
CN108932406B (zh) | 虚拟化软件保护方法和装置 | |
CN103324872B (zh) | 基于指令混淆的Android应用程序保护方法及系统 | |
CN108681457B (zh) | 基于代码下沉与残码解释的Android应用程序保护方法 | |
CN104680039B (zh) | 一种应用程序安装包的数据保护方法及装置 | |
CN110929234B (zh) | 一种基于代码虚拟化的Python程序加密保护系统与方法 | |
KR101490047B1 (ko) | 자가변환 기반 애플리케이션 코드 난독화 장치 및 그 방법 | |
CN100474253C (zh) | .Net程序保护方法及装置 | |
CN108733379B (zh) | 基于dex字节码抽离映射混淆的安卓应用加固方法 | |
CN108491235B (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
CN106326694A (zh) | 一种基于C源代码的混淆的Android应用加固方法 | |
CN109684794B (zh) | 一种代码保护虚拟机kvm系统实现方法、装置、计算机设备及存储介质 | |
CN107480476B (zh) | 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法 | |
CN104834838B (zh) | 防止dex文件从内存中转存的方法及装置 | |
CN111563237B (zh) | 一种智能合约安全增强方法 | |
CN103413074B (zh) | 一种通过api实现软件保护的方法和装置 | |
KR102482880B1 (ko) | 무기체계 임베디드 sw 보호를 위한 역공학 방지 시스템 및 그 방법 | |
CN110245467A (zh) | 基于Dex2C与LLVM的Android应用程序保护方法 | |
CN101030241A (zh) | 基于Keil C51的软件保护开发的方法和系统 | |
CN109598107A (zh) | 一种基于应用安装包文件的代码转换方法及装置 | |
CN113704706B (zh) | 代码加固方法、装置 | |
CN112052433B (zh) | 一种Jar文件的虚拟化保护方法、终端及存储介质 | |
CN109697339A (zh) | 一种基于动态虚拟指令变换的Android应用安全保护方法 | |
CN106960141A (zh) | 虚拟机指令的编码、解码方法及装置、虚拟机保护系统 |
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 |