CN103413076B - 一种Android应用程序分块保护的方法 - Google Patents

一种Android应用程序分块保护的方法 Download PDF

Info

Publication number
CN103413076B
CN103413076B CN201310378841.1A CN201310378841A CN103413076B CN 103413076 B CN103413076 B CN 103413076B CN 201310378841 A CN201310378841 A CN 201310378841A CN 103413076 B CN103413076 B CN 103413076B
Authority
CN
China
Prior art keywords
application program
code
dex file
class
dex
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
Application number
CN201310378841.1A
Other languages
English (en)
Other versions
CN103413076A (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.)
Beijing Institute of Technology BIT
Original Assignee
Beijing Institute of Technology BIT
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 Beijing Institute of Technology BIT filed Critical Beijing Institute of Technology BIT
Priority to CN201310378841.1A priority Critical patent/CN103413076B/zh
Publication of CN103413076A publication Critical patent/CN103413076A/zh
Application granted granted Critical
Publication of CN103413076B publication Critical patent/CN103413076B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Storage Device Security (AREA)

Abstract

本发明涉及一种Android应用程序分块保护的方法,包括以下步骤:一、将需要保护的应用程序生成的classes.dex文件加密;二、在Java编译器中将需要保护的代码删除,并将初始的完全加密的Dex文件以资源形式存放在应用程序的APK中;三、在应用程序的APK中加入封装好的DexFile类;四、通过IDA工具查看原始dex文件类中方法的地址并做记录;五、在应用程序java代码中重写调用Dex文件类中方法的代码,使得程序运行的时候将Dex文件以字节的形式读入数组中,根据传入的类地址解密相关类并相应的修改Dex文件校验码和签名;六、根据重写的代码,重新生成应用程序的APK。本发明可以对Android应用程序的代码进行保护。<!-- 2 -->

Description

一种Android应用程序分块保护的方法
技术领域
本发明涉及一种Android应用程序分块保护的方法,属于数据安全技术领域。
背景技术
Android平台是Google公司研发的基于Linux开放性内核操作系统,它采用了软件堆层架构,底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发。Android平台因其开放性和跨平台特性深受用户的喜爱,用户可以在Android应用市场随意下载和安装应用程序,由于其开源性而拥有规模庞大的应用程序,因此开发者们对于Android程序代码保护也越来越关注。
Android应用程序是用Java语言实现,编译后转换成Dalvik字节码存放在Dex文件中。为了支持平台无关性,Android采用Dalvik字节码文件格式,而后在Dalvik虚拟机上解释执行。Dalvik虚拟机的指令集相对简单通用,每一个类编译成一个单独的文件,Class文件保留方法变量名称等大量语义信息。这些特点都导致Android字节码更容易被反编译为Android源代码。攻击者通过反编译技术,获得软件的全部或部分源代码,从而获取关键信息如核心算法、秘密信息等为自己所用。
发明内容
本发明的目的是提出一种Android应用程序分块保护的方法。
Android应用程序是用Java语言实现的,Java编译器首先将Java文件编译成.class文件,然后通过AndroidSDK提供的dx工具将所有的.class文件转化成一个classes.dex文件。本发明通过对应用程序生成的Dex文件进行加密,将程序中重要的代码隐藏起来,在程序运行时,只对需要的类进行解密并动态加载,没有用到的类还是以加密形式存在,等该类加载完成后再加密。这样即使程序被反编译,由于重要代码已经被隐藏在Dex文件中,并且已经被加密过,攻击者也不能获得关键信息。并且不管在程序运行的哪个时刻,都不存在完全被解密的原始的Dex文件。达到了对应用程序代码进行保护的作用。
本发明的目的是通过以下技术方案实现的:
一种Android应用程序分块保护的方法,包括以下步骤:
一、将需要保护的应用程序生成的classes.dex文件加密;
二、在Java编译器中将需要保护的代码删除,并将初始的完全加密的Dex文件以资源形式存放在应用程序的APK中;
三、在应用程序的APK中加入封装好的DexFile类;
四、通过IDA工具查看原始dex文件类中方法的地址并做记录;
五、在应用程序java代码中重写调用Dex文件类中方法的代码,使得程序运行的时候将Dex文件以字节的形式读入数组中,根据传入的类地址解密相关类并相应的修改Dex文件校验码和签名,从而可以使用分段解密后的Dex文件;
六、根据重写的代码,重新生成应用程序的APK。
有益效果
使用本发明的方法,即使程序被反编译,由于重要代码已经被隐藏在Dex文件中,并且已经被加密过,攻击者也不能获得关键信息。并且不管在程序运行的哪个时刻,都不存在完全被解密的原始的Dex文件。达到了对应用程序代码进行保护的作用。
附图说明
图1是Dex文件结构。
图2是分块加密解密示意图。
图3是加载一个类并调用其方法流程图。
具体实施方式
下面结合附图对本发明方法的实施方式做详细说明。
本发明主要包括以下两个方面:
一是对Dex文件加密和运行时分块解密:
加密解密算法在此不做详细说明。Dex文件的结构如附图说明1中所示,可以看到,Dex文件中数据并不是按Class类存放,所以一个类中不同的方法在Dex文件中的地址也是不同的。可以通过专门的工具如IDA来查看Dex文件中类中方法的地址,记录下来,在程序运行的时候将这个地址集合作为参数传递给解密函数,这样就实现了分块解密。仅仅解密还是不够的,由于Dex文件头中有校验码和SHA-1签名字段,如果改变Dex文件的数据,上述两个字段也应该随之变化,所以还需要根据解密后的Dex文件计算新的校验码和签名写回Dex文件中,这样才得到了真正的可以使用的分段解密后的Dex文件。附图说明2中形象的展示了是如何在程序运行的时候进行分块加密解密,以A、B两个类举例说明,为了更直观的展示,一个类以一个整体块表示。
二是动态加载Dex文件中的类。
初始的完全加密的Dex文件以资源形式存放在应用程序的APK中。程序运行的时候将Dex文件以字节的形式读入数组中,根据传入的类地址解密相关类并相应的修改Dex文件校验码和签名。使用System.Dalvik.DexFile类中提供的openDexFile(byte[])方法打开分段解密后的Dex字节数组,利用findClass()方法加载有关类,需要传入类的完全名称(包名+类名),类加载完成后,就可以利用Java的反射机制调用类中的方法。这里用到的openDexFile(byte[])和findClass()都是System.Dalvik.DexFile类中的私有方法,需要重新定义一些方法,把这些私有方法赋值给新定义的方法,这样我们在程序中就可以使用了,我们把跟打开Dex及加载类有关的操作都封装在DexFile类中。附图说明3中展示了动态加载一个类并调用其中方法的流程图。
以一个序列码验证的应用程序(validate.apk)为例进行说明,该应用的功能是验证用户是否合法,根据用户输入的用户名和序列码(16位数字和字母的组合区分大小写),经过两个验证函数(validate1,validate2),如果用户合法就返回true,否则返回false。我们对这两个验证函数的代码进行保护。该应用程序为开源程序。具体的操作步骤如下:
第一步,对validate.apk中的classes.dex文件加密。
第二步,在Eclipes中打开生成validate.apk的工程,将validate1和validate2函数体中的代码删除,并将第一步中加密的dex文件放入assets文件夹下。
第三步,将我们封装好的DexFile类加入代码中。
第四步,通过IDA工具查看原始dex文件并对validate1和validate2函数所在类的地址做记录。
第五步,在validate1和validate2函数体中重新写入代码。首先利用InputStream流从assets文件夹中读入dex文件到byteOfarr[]这个字节数组中,传入第四步中得到的函数所在类的地址,对dex文件进行部分解密,并相应的修改dex文件头的校验码和签名,然后实例化一个DexFile对象dexfile,用dexfile.openDexFile(byteOfarrr)方法打开dex文件,利用dexfile.getClass(name)加载类,返回加载后的类对象localClass,利用localClass.getConstructor()获取类的构造函数constructor,并实例化该构造函数constructor.newInstance()。利用localClass.getMethod(“validate1”)和localClass.getMethod(“validate1”)获取函数方法,利用Method.invoke()调用方法。
第六步,重新编译生成APK,能够正常运行。
至此就已经在该序列码验证实例上实现该发明阐述的方案,攻击者反编译重新生成后的APK,获得不了程序的关键代码,因为已经被加密。
本发明不仅限于以上实施例,凡是利用本发明的设计思路,做一些简单变化的方案,都应计入本发明的保护范围之内。

Claims (1)

1.一种Android应用程序分块保护的方法,包括以下步骤:
一、将需要保护的应用程序生成的classes.dex文件加密;
二、在Java编译器中将需要保护的代码删除,并将初始的完全加密的Dex文件以资源形式存放在应用程序的APK中;
三、在应用程序的APK中加入封装好的DexFile类;
四、通过IDA工具查看原始dex文件类中方法的地址并做记录;
五、在应用程序java代码中重写调用Dex文件类中方法的代码,使得程序运行的时候将Dex文件以字节的形式读入数组中,根据传入的类地址解密相关类并相应的修改Dex文件校验码和签名,从而可以使用分段解密后的Dex文件;
六、根据重写的代码,重新生成应用程序的APK。
CN201310378841.1A 2013-08-27 2013-08-27 一种Android应用程序分块保护的方法 Expired - Fee Related CN103413076B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310378841.1A CN103413076B (zh) 2013-08-27 2013-08-27 一种Android应用程序分块保护的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310378841.1A CN103413076B (zh) 2013-08-27 2013-08-27 一种Android应用程序分块保护的方法

Publications (2)

Publication Number Publication Date
CN103413076A CN103413076A (zh) 2013-11-27
CN103413076B true CN103413076B (zh) 2016-03-02

Family

ID=49606087

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310378841.1A Expired - Fee Related CN103413076B (zh) 2013-08-27 2013-08-27 一种Android应用程序分块保护的方法

Country Status (1)

Country Link
CN (1) CN103413076B (zh)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104680039B (zh) * 2013-11-28 2019-02-26 腾讯科技(深圳)有限公司 一种应用程序安装包的数据保护方法及装置
CN104866740A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种防静态分析文件的方法及装置
CN104866741A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种Android安装包文件的保护方法及装置
CN104318135B (zh) * 2014-10-27 2017-04-05 中国科学院信息工程研究所 一种基于可信执行环境的Java代码安全动态载入方法
CN104317625A (zh) * 2014-11-09 2015-01-28 刘鹏 一种apk文件的动态加载方法
KR101518420B1 (ko) * 2014-11-11 2015-05-07 주식회사 에스이웍스 안드로이드 플랫폼에서의 apk 파일 관리 장치 및 방법
CN104462959B (zh) * 2014-12-04 2017-09-01 北京奇虎科技有限公司 一种安卓应用的加固保护方法、服务器和系统
CN107463420A (zh) * 2016-06-02 2017-12-12 深圳市慧动创想科技有限公司 一种在Android APK中植入代码的便捷方法
CN106203006A (zh) * 2016-08-31 2016-12-07 北京鼎源科技有限公司 基于dex与so文件动态执行的Android应用加固方法
CN106648740A (zh) * 2016-10-18 2017-05-10 努比亚技术有限公司 一种可执行文件的加载方法及终端
CN106650327A (zh) * 2016-11-24 2017-05-10 湖南鼎源蓝剑信息科技有限公司 基于动态恢复so文件的Android应用加固方法
CN106843919B (zh) * 2016-12-12 2021-02-23 北京奇虎科技有限公司 一种dex文件的存储方法和装置
CN107203721A (zh) * 2017-03-01 2017-09-26 广西发发科技有限公司 一种通用游戏反作弊系统
CN106934260B (zh) * 2017-03-14 2020-03-17 北京深思数盾科技股份有限公司 代码保护方法、装置、服务器及存储介质
CN107066842A (zh) * 2017-03-28 2017-08-18 福建天晴在线互动科技有限公司 一种加固sdk项目的方法及系统
CN110502874B (zh) * 2019-07-19 2021-05-25 西安理工大学 一种基于文件自修改的Android App加固方法
CN113190834A (zh) * 2021-01-29 2021-07-30 统信软件技术有限公司 一种文件签名方法、计算设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236757A (zh) * 2011-06-30 2011-11-09 北京邮电大学 一种适用于Android系统的软件保护方法及系统
CN102360412A (zh) * 2011-09-26 2012-02-22 飞天诚信科技股份有限公司 Java源代码的保护方法和系统
CN102708322A (zh) * 2012-05-12 2012-10-03 北京深思洛克软件技术股份有限公司 安卓系统中java应用程序的保护方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8589951B2 (en) * 2011-01-07 2013-11-19 International Business Machines Corporation Conserving memory by using objects that are selectably mutable during runtime

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236757A (zh) * 2011-06-30 2011-11-09 北京邮电大学 一种适用于Android系统的软件保护方法及系统
CN102360412A (zh) * 2011-09-26 2012-02-22 飞天诚信科技股份有限公司 Java源代码的保护方法和系统
CN102708322A (zh) * 2012-05-12 2012-10-03 北京深思洛克软件技术股份有限公司 安卓系统中java应用程序的保护方法

Also Published As

Publication number Publication date
CN103413076A (zh) 2013-11-27

Similar Documents

Publication Publication Date Title
CN103413076B (zh) 一种Android应用程序分块保护的方法
Alpernas et al. Secure serverless computing using dynamic information flow control
TWI648648B (zh) 安卓平台上可執行程式的保護方法
CN108932406B (zh) 虚拟化软件保护方法和装置
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
US20200159675A1 (en) Cryptographic pointer address encoding
US11263311B2 (en) Securing virtual-machine software applications
TWI530874B (zh) 生成應用程式安裝封包、執行應用程式的方法及裝置
Balachandran et al. Control flow obfuscation for android applications
CN107908392B (zh) 数据采集工具包定制方法、装置、终端和存储介质
US20090172820A1 (en) Multi virtual machine architecture for media devices
CN103914637B (zh) 一种安卓平台的可执行程序加密方法
WO2013170724A1 (zh) 安卓系统中java应用程序的保护方法
CN102043932A (zh) 一种防止Java程序被反编译的方法
CN105022936A (zh) 一种类class文件加密解密方法和装置
CN101957903A (zh) 一种保护类文件的方法和装置
CN103955635A (zh) 一种对.net可执行程序进行保护的方法和系统
CN111832014B (zh) 基于动态加载的Java SDK代码加解密方法及终端
US8656501B2 (en) Method and device for selectively protecting one of a plurality of methods of a class of an application written in an object-orientated language
CN110309630B (zh) 一种Java代码加密方法及装置
CN103971034A (zh) 一种保护Java软件的方法及装置
Bouffard et al. Reversing the operating system of a Java based smart card
CN105956425B (zh) 一种基于smali代码混淆的Android应用保护方法
KR101749209B1 (ko) 애플리케이션의 정보 은닉 방법 및 장치, 및 애플리케이션 실행 방법 및 장치
CN116611032A (zh) 一种jar包中嵌入和提取软件水印的方法、系统和存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C53 Correction of patent of invention or patent application
CB03 Change of inventor or designer information

Inventor after: Zhang Huan

Inventor after: Li Yuanzhang

Inventor after: Zhu Ruijin

Inventor after: Zhang Quanxin

Inventor after: Tan Yuan

Inventor before: Zhang Huan

Inventor before: Tan Yuan

Inventor before: Zhu Ruijin

Inventor before: Zhang Quanxin

Inventor before: Li Yuanzhang

COR Change of bibliographic data

Free format text: CORRECT: INVENTOR; FROM: ZHANG HUAN TAN YUAN ZHU RUIJIN ZHANG QUANXIN LI YUANZHANG TO: ZHANG HUAN LI YUANZHANG ZHU RUIJIN ZHANG QUANXIN TAN YUAN

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: 20160302

Termination date: 20210827

CF01 Termination of patent right due to non-payment of annual fee