基于SMALI流程混淆技术的ANDROID应用加固方法.pdf

上传人:b*** 文档编号:1306543 上传时间:2018-04-14 格式:PDF 页数:16 大小:830.99KB
返回 下载 相关 举报
摘要
申请专利号:

CN201611026123.8

申请日:

2016.11.18

公开号:

CN106650341A

公开日:

2017.05.10

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 21/14申请日:20161118|||公开

IPC分类号:

G06F21/14(2013.01)I

主分类号:

G06F21/14

申请人:

湖南鼎源蓝剑信息科技有限公司

发明人:

文伟平

地址:

410205 湖南省长沙市长沙高新开发区岳麓西大道588号芯城科技园2栋1108

优先权:

专利代理机构:

北京万象新悦知识产权代理事务所(普通合伙) 11360

代理人:

黄凤茹

PDF下载: PDF下载
内容摘要

本发明公布了一种基于smali流程混淆技术的Android应用加固方法,应用加密算法、动态加载技术、JNI编程技术、完整性校验技术和代码混淆技术等,通过改变源程序的加载流程,使得加固后的应用程序难以逆向,同时加固之后并不影响程序的正常执行;以达到保护版权,防止他人剽窃软件中的智力成果或对软件进行有目的的篡改的目的。包括:用AES加密算法加密真正的dex文件;编写so函数库decrytApp.so和Function.so;编写伪smali文件,达到混淆源程序的加载流程的目的,包括源程序的完整性检验和动态加载真正的dex文件。利用本发明提供的技术方案,能够有效地对安卓应用程序进行版权保护,防止其被逆向或篡改。

权利要求书

1.一种Android应用加固方法,基于smali流程混淆方法,应用加密、动态加载、JNI编
程、完整性校验和代码混淆方法,通过改变Android应用源程序的加载流程,使得加固后的
应用程序难以逆向,同时保证加固之后并不影响程序的正常执行;包括如下步骤:
1)在动态加载Android应用真正的dex文件之前,用AES加密算法加密真正的dex文件,
得到加密后的dex文件class.dex.jar;
2)编写so函数库,执行如下操作;
21)使用JNI编写解密库decrytApp.so,将解密函数写在动态链接库中,用于解密所述
加密后的dex文件;
22)使用JNI编写底层核心逻辑库Function.so,将程序的核心逻辑写在动态链接库中;
3)编写伪smali文件,用于程序的完整性校验和对加密后的dex文件class.dex.jar动
态加载,由此达到混淆源程序的加载流程的目的,执行如下操作:
31)进行源程序的完整性检验;
32)动态加载加密后的真正的dex文件class.dex.jar;
由此完成对Android应用的加固,达到保护应用程序的目的。
2.如权利要求1所述Android应用加固方法,其特征是,步骤1)所述AES加密算法通过循
环进行加密,包括多轮AES加密循环进行迭代运算;除最后一轮外,每轮AES加密循环都包含
以下步骤:
11)轮密钥加:明文区块中的每一个字节与该次回合密钥做异或运算;
12)字节代替:通过S盒变换方法,用查找表的方式对矩阵中的字节进行置换;
13)行移位:对矩阵中的行进行循环移位;
14)列混淆:对矩阵中的列进行混合变换。
3.如权利要求2所述Android应用加固方法,其特征是,所述AES加密算法的密钥长度设
定为128位,包括10轮迭代运算。
4.如权利要求1所述Android应用加固方法,其特征是,步骤2)具体使用Android NDK编
写decrytApp.so和Function.so,包括如下步骤:
a)编写java文件,声明本地文件中的函数;
b)新建decryptApp.c文件,编写解密函数;
c)编写JNI入口函数;
d)编写Android.mk文件;
e)编译生成so库,包括decrytApp.so和Function.so。
5.如权利要求1所述Android应用加固方法,其特征是,步骤21)用C或C++编写解密函
数,将解密函数写在动态链接库中。
6.如权利要求1所述Android应用加固方法,其特征是,步骤31)所述进行源程序的完整
性检验,具体包括如下步骤:
311)计算Android应用程序的校验和,在所述应用程序中加入哨兵函数;
312)在所述应用程序正式运行之前,先启动哨兵函数,重新计算应用程序的校验和,并
与之前的校验和进行对比;
313)当312)中重新计算得到校验和和311)中的校验和相同时,判断得到软件没有被篡
改,继续运行;当二者不同时,判断得到软件被篡改,即所述Android应用被二次打包,终止
运行。

说明书

基于smali流程混淆技术的Android应用加固方法

技术领域

本发明涉及Android应用加固方法,尤其涉及一种基于smali流程混淆技术的
Android应用加固方法。

背景技术

在互联网时代,随着移动智能终端的日益普及以及网络宽带化的高速发展,我们
的生活几乎处处充满了互联网的气息。然而,兼具开发性与灵活性的终端系统,及其应用中
潜在的信息安全问题却可能对其用户、承载网络等各个环节造成影响,特别是软件逆向技
术。逆向分析技术可以被用来在不知道应用程序源代码的情况下分析应用程序的功能流
程、篡改应用程序的数据代码等,逆向分析技术如果被不加限制的恶意使用,利用者可以分
析获取应用程序的核心技术,也可以篡改应用程序的签名和作者信息,还可以将恶意代码
注入到已有的应用程序中并通过二次打包进行伪装,这些行为都极大的危害了应用程序开
发者的利益,严重损害了广大用户的隐私安全,甚至危及国家安全与社会稳定,阻碍其健康
发展。

在Android系统中,使用Java语言编写的应用程序,被编译成Java类文件(.class
格式);Android不会直接运行这些.class文件,而是将这些.class格式的类文件再次编译
成dex格式,交由Android平台运行。所以dex文件是应用程序的核心部分,为安装包中不可
或缺的部分。但是dex文件本质上是Java字节码,容易被反编译为Java源代码,如果没有经
过混淆处理,通过逆向工程可以轻易获取到可读的Java源码,进而达到窃取安卓应用程序
的核心逻辑代码。

代码混淆技术是近几年才发展并兴起的一种新技术。第一次对代码混淆进行系统
研究是在上世纪90年代末开始的,是Java语言的迅速发展引起了对混淆技术的研究热潮。
这是因为Java目标代码—字节代码(bytecode)很容易被反编译为Java源代码,这就迫切要
求有效的保护字节代码的方法。这一领域中的大部分工作是由Collberg、Thomborson、Low
和Chenxi Wang做出的。

Collberg第一次对混淆转换进行了详细的总结和分类,也首次提出了混淆转换的
有效性与性能的若干评价标准。他将混淆转换分为四类:外形混淆转换、控制混淆转换、数
据混淆转换以及预防性混淆转换。

Chenxi Wang在文献中实现了在C语言源代码上的若干种控制混淆转换与数据混
淆转换。Wang还给出了混淆转换造成的性能过载以及混淆转换对静态分析工具IBM NPIC
tool以及Rutger PAF toolkit的有效性。

Hohhl提出用带有时间限制的黑盒(time-limited black box)方法来保护移动
Agent。这里的黑盒就是指混淆转换过的Agent程序。对移动Agent进行逆向工程,做出有意
义的发现或修改需要一定的时间,据此,限制移动Agent在目的主机上运行的时间。在派发
移动Agent的之前,需要对其进行混淆转换,这增加了逆向工程的代价,从而延长在目的主
机上的运行时间。

Cullen Linn从另一个角度研究了目标代码混淆技术,通过对反汇编过程的分析,
采用一种混淆方法能够阻挠逆向工程,使得获取程序的汇编指令非常困难或不能正确得到
程序的汇编指令。

综上所述,现有工作虽然提出了一些加扰混淆方法,但只是增加了逆向阅读的难
度而已,而不能够真正地解决防止逆向的问题。

发明内容

为了克服上述现有技术的不足,本发明提供一种基于smali流程混淆技术的
Android应用加固方法,应用加密算法、动态加载技术、JNI(Java Native Interface,Java
本地接口)编程技术、完整性校验技术和代码混淆技术等,通过改变Android应用程序的加
载流程,使得加固后的应用程序难以逆向,另外,需保证加固之后并不影响程序的正常执
行;以达到保护版权,防止他人剽窃软件中的智力成果或对软件进行有目的的篡改的目的。

本发明提供的技术方案是:

一种Android应用加固方法,基于smali流程混淆技术,应用加密、动态加载、JNI编
程、完整性校验和代码混淆方法,通过改变Android应用源程序的加载流程,使得加固后的
应用程序难以逆向,同时保证加固之后并不影响程序的正常执行;包括如下步骤:

1)在动态加载Android应用真正的dex文件之前,用AES加密算法加密真正的dex文
件,得到加密后的dex文件class.dex.jar;

2)编写so函数库,执行如下操作;

21)使用JNI编写解密库decrytApp.so,将解密函数写在动态链接库中,用于解密
所述加密后的dex文件;

22)使用JNI编写底层核心逻辑库Function.so,将程序的核心逻辑写在动态链接
库中;

3)编写伪smali文件,用于程序的完整性校验和对加密后的dex文件
class.dex.jar动态加载,由此达到混淆源程序的加载流程的目的,执行如下操作:

31)进行源程序的完整性检验;

32)动态加载加密后的真正的dex文件class.dex.jar;

由此完成对Android应用的加固,达到保护应用程序的目的。

针对上述Android应用加固方法,进一步地,步骤1)所述AES加密算法通过循环进
行加密,包括多轮AES加密循环进行迭代运算;除最后一轮外,每轮AES加密循环都包含以下
步骤:

11)轮密钥加,明文区块中的每一个字节与该次回合密钥做异或运算;

12)字节代替,S盒变换,用查找表的方式对矩阵中的字节进行置换;

13)行移位,将矩阵中的行进行循环移位;

14)列混淆,对矩阵中的列进行混合变换。

在本发明一实施例中,所述AES加密算法的密钥长度设定为128位,包括10轮迭代
运算。

针对上述Android应用加固方法,进一步地,步骤2)具体使用Android NDK编写
decrytApp.so和Function.so,包括如下步骤:

a)编写java文件,声明本地文件中的函数;

b)新建decryptApp.c文件,编写解密函数;

c)编写JNI入口函数;

d)编写Android.mk文件;

e)编译生成so库,包括decrytApp.so和Function.so。

针对上述Android应用加固方法,进一步地,步骤21)用C或C++编写解密函数,将解
密函数写在动态链接库中。

针对上述Android应用加固方法,进一步地,步骤31)所述进行源程序的完整性检
验,具体包括如下步骤:

311)计算Android应用程序的校验和,在所述应用程序中加入哨兵函数;

312)在所述应用程序正式运行之前,先启动哨兵函数,重新计算应用程序的校验
和,并与之前的校验和进行对比;

313)当312)中重新计算得到校验和和311)中的校验和相同时,判断得到软件没有
被篡改,继续运行;当二者不同时,判断得到软件被篡改,即所述Android应用被二次打包,
终止运行。

与现有技术相比,本发明的有益效果是:

本发明提供一种基于smali流程混淆技术的Android应用加固方法,应用加密算
法、动态加载技术、JNI编程技术、完整性校验技术和代码混淆技术等,通过改变源程序的加
载流程,使得加固后的应用程序难以逆向,另外,需保证加固之后并不影响程序的正常执
行;以达到保护版权,防止他人剽窃软件中的智力成果或对软件进行有目的的篡改的目的。
因此,利用本发明提供的技术方案,能够有效地对安卓应用程序进行版权保护,防止其被逆
向或篡改。

附图说明

图1是本发明提供的Android应用加固方法的流程框图。

图2是本发明实施例中完整性检验的流程框图。

具体实施方式

下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范
围。

本发明提供一种基于smali流程混淆技术的Android应用加固方法,应用加密算
法、动态加载技术、JNI编程技术、完整性校验技术和代码混淆技术等,通过改变源程序的加
载流程,使得加固后的应用程序难以逆向,另外,需保证加固之后并不影响程序的正常执
行;以达到保护版权,防止他人剽窃软件中的智力成果或对软件进行有目的的篡改的目的。

如图1所示,class.dex文件是真正的dex文件,用于实现程序的主要功能,加密成
class.dex.jar文件。Function.so核心库是动态链接库,为程序提供底层核心逻辑功能;
decrytApp.so主要用于实现对class.dex.jar的解密。

本发明方法编写伪smali文件,编译生成伪dex文件,主要负责程序的完整性校验
和对class.dex.jar动态加载。若程序没有被篡改,则采用动态加载的方式加载解密后的
dex文件,否则不能加载dex文件。

本发明的整体流程如图1所示,包括如下步骤:

1)在动态加载真正的dex文件前,用经典的加密算法AES(Advanced Encryption
Standard,高级加密标准)算法加密dex文件,得到加密后的dex文件;

AES加密算法通过循环进行加密,包括多轮AES加密循环。除最后一轮外,每轮AES
加密循环都包含以下四个步骤:

11)轮密钥加(AddRoundKey),矩阵中的每一个字节与当前轮密钥做异或运算;

12)字节代替(SubBytes),通过S盒变换的方法,用查找表的方式对矩阵中的字节
进行置换;

13)行移位(ShiftRow),将矩阵中的行进行循环移位;

14)列混淆(MixColumns),对矩阵中的列进行混合变换。

因此,在实现AES算法时,可以抽象四个函数,分别对应上面四个步骤:
AddRoundKey(state),SubBytes(state),ShiftRow(state)和MixColumns(state),其中
State为矩阵。

2)编写so函数库,执行如下操作:

Java程序经过编译会生成Java字节码。而Java字节码很容易被逆向工程,虽然可
以利用代码混淆技术增加逆向难度,但是,混潜技术并不能彻底阻止逆向工程。因此我们可
以使用C/C++编写程序中更重要的代码,利用其难被逆向的特点来达到保护程序源码的目
的。除此之外,使用C/C++编写的代码不需要Dalvik虚拟机的解释运行,具有更高的运行效
率,可以加快程序执行复杂任务时的运行速度。因此,本发明采用C/C++编写程序的底层链
接库,并且利用JNI技术在上层代码中调用这些底层动态链接库。

21.使用JNI编写解密库decrytApp.so,用于解密加密过后的dex文件;

本发明中对dass.dex.jar进行解密的函数用C/C++编写,最终编译成
decrytApp.so。之所以将解密函数写在动态链接库中,是因为如果直接将解密逻辑写在
Java文件中,攻击者可以通过反编译得到解密代码,从而获得解密的方法。

22.使用JNI编写底层核心逻辑库Function.so;

Function.so库中是应用程序的底层核心代码,是整个应用程序的关键所在。将程
序的核心逻辑写在动态链接库中,可以保护诸如重要算法、核心技术等不被逆向工程所窃
取。因此,在本发明加固方案中,将核心的逻辑写在Function.so中,防御反编译。

3)编写伪smali文件,伪smali主要负责程序的完整性校验和对class.dex.jar动
态加载,达到混淆源程序的加载流程的目的,执行如下操作:

31.进行源程序的完整性检验,具体步骤如图2;

完整性校验是一种防止软件被篡改的技术。主要机制就是事先计算应用程序的校
验和,然后在程序中加入哨兵函数,在程序正式运行之前,先启动哨兵函数,重新计算应用
程序的校验和,并与之前的校验和进行对比。如果两者一样,就判断软件没有被篡改,继续
运行;如果不一样,就认为软件被篡改,随即终止运行。

完整性校验可以很好地检测Android应用是否被二次打包。任何apk文件,哪怕只
是受到一点篡改,计算出来的校验和都会不一样。因此利用完整性校验,可以有效防止应用
被插入恶意代码、植入广告等攻击手段。

32.动态加载class.dex.jar;

程序的主体代码都在真正的dex文件中,而这个dex文件又不是程序启动的时候需
要运行的文件,所以可以对它进行加密,生成class.dex.jar,然后再动态地加载
class.dex.jar。经过加密的文件具有很高的安全性,如果攻击者没有密钥的话,很难破解
文件。这样,攻击者无法直接逆向分析经过加密的代码,从而达到保护应用程序的目的。

下面通过实例对本发明做进一步说明。

实施例:

AES算法:

AES算法的密钥长度很灵活,可以是128位、192位和256位中的任意一种。不同的密
钥长度对应不同的加密算法的运算轮数,通常128位密钥需运算10轮,192位需运算12轮,
256位需运算14轮。一般轮数越多,被破解的难度也就越大,但是运算的时间也越长。考虑到
本发明是基于Android平台,其内存和处理能力都十分有限,因此密钥长度不宜选得过长。
而在AES算法确立之初,6轮迭代运算便可抵抗当时世界上已知的所有攻击。因此在本发明
中,AES算法的密钥长度设定为128位。

AES算法一共需要经过10轮迭代运算,而每轮运算都是由四个步骤组成,因此可以
按如下方式把加/解密的过程用C语言代码实现,代码如下。

(1)加密



(2)解密



Android系统支持NDK(Native Development Kit,安卓原生开发工具包)编程,本
发明中使用JNI编程技术将解密函数写在动态链接库decryptApp.so中,在程序运行的时
候,对dex文件进行动态解密。这样既能提高解密的效率,又能利用C语言的特性,保证解密
过程的安全。

so函数库:

我们使用Android NDK开发decrytApp.so和Function.so的大概过程如下所示:

1.编写java文件,声明本地文件中的函数(以decrytApp.so库为例)

System.loadLibrary(“decryApp”);//加载动态链接库decrytApp.so

native boolean jnicheckApp();//声明与decrytApp.c中相对应的原生函数

2.新建decryptApp.c文件,编写解密函数

在文件中声明如下函数,函数的作用是解密class.dex.jar,根据Android系统中
JNI调用的规则,函数名需要与Java文件中的函数名相对应:JNIEXPORT jboolean NICALL
Java_com_bupt_testjni_decrytAppJnicheckApp(JNIENV*env,jobject this){};

3.编写JNI入口函数

JNI—OnLoad()与JNI_OnUnLoad()函数是动态链接库的入口函数,当Dalvik虚拟
机执行到System.loadLibrary()函数时,会首先执行C文件中的入口函数,它会告诉
Dalvik虚拟机使用哪一个JNI版本,如果动态链接库中没有入口函数,虚拟机会默认使用最
老的JNI1.1版本。而且我们也需要在入口函数中进行一些一些初始化的操作。JNI—OnLoad
函数的编写格式如下:


4.编写Android.mk文件

Android.mk文件向NDK编译系统描述工程的本地源,主要是传递如下几个参数:

LOCAL_PATH:=$(call my-dir)/project//工程路径

LOCAL_SRC_FILES:=decrytApp.c//本地C文件的名称

LOCAL_MODULE:=decrytApp//要编译的动态链接库的名称

5.编译生成so库

运行工程目录下的ndk编译脚本,编译本地C/C++代码。编译脚本"ndk-build"文件
位于NDK文件的根目录下,运行的时候需指定路径。运行完成后,就会在工程的libs目录下
生成decrytApp.so库。

6.编译打包应用

最后像编译普通应用程序一样,用SDK中的工具编译工程。SDK编译工具将会把so
库打包进应用程序的apk文件中,然后就可以正常运行应用程序了。

采用NDK编程的方式,可以把重要代码保存在C/C++动态链接库中,然后在Java代
码中采用JNI技术调用底层的so库。这样既可以实现应用的功能,又能杜绝使用Java语言编
写的代码容易被逆向的隐患,是一种变向的软件保护措施。除此之外,把重要代码写到so库
中,还能增加代码的重用性,下次在其他应用中,可以直接引入现成的so库,免去了二次幵
发的麻烦。

完整性校验:

Android系统中提供的应用签名机制,本质上就是一种完整性校验。而且,Android
系统规定,所有安装到Android设备中的应用都必须经过签名。因此,我们可以利用应用签
名机制,来实现完整性校验的功能。

数字签名需要一份数字证书,但这个数字证书并不需要权威的数字证书签名机构
认证,它只是用来让应用程序包自我认证的,因此可以使用Android SDK自带的签名工具
keytool和signapk为应用程序签名。Android将数字证书用来标识应用程序的作者和在应
用程序之间建立信任关系。数字证书的私钢保存在程序幵发者的手中,公钥随应用一起打
包进apk中。

鉴于数字证书是开发者自己生成的,因此,软件发行者的身份只能由自己持有,是
唯一的。其他人如果没有开发者的密钥,无法制造出与开发者一样的数字证书。因此,开发
者可以在程序中加入检测发行者身份的方法,在程序真正运行之前,验证程序的发行者,如
果符合,则继续运行;如果不符合,程序退出运行。

利用对比发行者身份的完整性校验技术,判断一个应用是否被篡改的步骤如图2
所示:

1)获取应用程序的签名

Android提供了获取应用程序签名信息的方法,通过调用PackageManager的
getPackageInfo(packageName,PackageManager.GET_SIGNATURES)方法,就可以得到应用
的签名信息。核心代码如下:

Packagelnfo pinfo=this.getPackageManager().getPackageInfo
(packageName,PackageManager.GET_SIGNATURES);

Signature[]s=pInfo.signatures;

Signature sign=signs[0];

sign中存储的就是应用程序的签名信息。

2)获得应用的签名证书的发行者的信息;

应用的作者在发布应用时,都会为应用签名。签名所用的证书,是作者在本地利用
keytool生成,因此证书的发行者是作者本人。如果程序被二次打包,经过重新编译,那么k
次签名所用的证书就是攻击者的证书,证书的发行者就变成了攻击者。因此我们可以通过
比较证书的发行者,来判断应用是否被二次打包。

所以我们需要得到证书的发行者,核心代码如下:

CertificateFactory certFactory=CertificateFactory.getInstance("
X.509");

X509Certificate cert=(X509Certificate)
certFactory.generateCertificate(new

ByteArrayInputStreain(sign.toByteArray());

String Issuer=cert.getIssuerDN().toString();

Issuer就是数字证书的发行者。

3)获得应用的原始证书的发行者的信息,对比两个发行者的信息,判断应用是否
被二次打包;

我们可以将原始证书的发行者信息以字符串的形式保存在文件中。但是这样存在
安全隐患,可能会被攻击者“找到”,从而被修改成攻击者自己构造的信息。因此,我们从服
务端实时获取原始证书的发行者信息,或者把原始证书的发行者信息加密,将密文存储在
本地,当需要对比的时候,先进行解密。

对比两个发行者的信息,根据当前应用携带的证书的发行者与官方获得发行者的
比较结果,判断应用是否被二次打包。如果两者不一样,则判断当前应用已经被修改,哨兵
函数就可以中止程序的运行。

动态加载dex文件,得到其中的类:

Dalvik虚拟机不同于标准的Java虚拟机,标准Java虚拟机运行的是Java字节码,
而Dalvik虚拟机运行的经过转换的Dalvik字节码,即.dex格式的文件。因此,不能像标准
Java虚拟机那样,直接通过Java中的ClassLoader来实现类的动态加载。Dalvik虚拟机通过
DexClassLoader和PathClassLoader两个类实现类的动态加载。

动态加载的实现过程大致如下:

1)拿到经过加密的待载入的dex文件。dex文件可以存放在SD卡中,也可以从服务
端下载,还可以以资源文件的形式打包在应用中。

2)运行伪程序,对dex文件进行解密处理。

3)为程序通过DexClassLoader类动态加载解密后的dex文件。

4)通过Java反射机制,获得类的实例。

动态加载类的实例代码如下所示:

(1)动态加载代码




(2)反射调用工具类



通过上面的步骤,就实现了程序在运行时动态加载dex文件,并得到其中的类,进
而执行程序的主体代码。

需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技
术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是
可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求
书界定的范围为准。

基于SMALI流程混淆技术的ANDROID应用加固方法.pdf_第1页
第1页 / 共16页
基于SMALI流程混淆技术的ANDROID应用加固方法.pdf_第2页
第2页 / 共16页
基于SMALI流程混淆技术的ANDROID应用加固方法.pdf_第3页
第3页 / 共16页
点击查看更多>>
资源描述

《基于SMALI流程混淆技术的ANDROID应用加固方法.pdf》由会员分享,可在线阅读,更多相关《基于SMALI流程混淆技术的ANDROID应用加固方法.pdf(16页珍藏版)》请在专利查询网上搜索。

本发明公布了一种基于smali流程混淆技术的Android应用加固方法,应用加密算法、动态加载技术、JNI编程技术、完整性校验技术和代码混淆技术等,通过改变源程序的加载流程,使得加固后的应用程序难以逆向,同时加固之后并不影响程序的正常执行;以达到保护版权,防止他人剽窃软件中的智力成果或对软件进行有目的的篡改的目的。包括:用AES加密算法加密真正的dex文件;编写so函数库decrytApp.so和。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 >


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1