CN106228041A - 一种针对Android预编译的代码保护方法 - Google Patents
一种针对Android预编译的代码保护方法 Download PDFInfo
- Publication number
- CN106228041A CN106228041A CN201610579934.4A CN201610579934A CN106228041A CN 106228041 A CN106228041 A CN 106228041A CN 201610579934 A CN201610579934 A CN 201610579934A CN 106228041 A CN106228041 A CN 106228041A
- Authority
- CN
- China
- Prior art keywords
- file
- code
- android
- goal approach
- oat
- 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 114
- 238000013459 approach Methods 0.000 claims abstract description 115
- 230000009467 reduction Effects 0.000 claims abstract description 43
- 238000000605 extraction Methods 0.000 claims abstract description 35
- 238000005516 engineering process Methods 0.000 claims description 21
- 239000000284 extract Substances 0.000 claims description 15
- 230000006870 function Effects 0.000 claims description 7
- 230000000694 effects Effects 0.000 claims description 4
- 238000012545 processing Methods 0.000 claims description 3
- 230000008859 change Effects 0.000 claims description 2
- 238000011946 reduction process Methods 0.000 claims description 2
- 230000032258 transport Effects 0.000 claims 1
- 230000008569 process Effects 0.000 abstract description 9
- 238000003860 storage Methods 0.000 description 14
- 239000000203 mixture Substances 0.000 description 7
- 238000011161 development Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- GCKMFJBGXUYNAG-HLXURNFRSA-N Methyltestosterone Chemical compound C1CC2=CC(=O)CC[C@]2(C)[C@@H]2[C@@H]1[C@@H]1CC[C@](C)(O)[C@@]1(C)CC2 GCKMFJBGXUYNAG-HLXURNFRSA-N 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 230000002787 reinforcement Effects 0.000 description 2
- 206010008190 Cerebrovascular accident Diseases 0.000 description 1
- 241000282414 Homo sapiens Species 0.000 description 1
- 208000006011 Stroke Diseases 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 229910002056 binary alloy Inorganic materials 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 239000012467 final product Substances 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000009434 installation Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000003014 reinforcing effect Effects 0.000 description 1
- 238000005728 strengthening Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012795 verification 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/121—Restricting unauthorised execution of programs
- G06F21/125—Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
-
- 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/101—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM] by binding digital rights to specific entities
- G06F21/1015—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM] by binding digital rights to specific entities to users
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Stored Programmes (AREA)
- Storage Device Security (AREA)
Abstract
一种针对Android预编译的代码保护方法,通过构建提取处理单元、中间处理单元以及还原单元,对Android应用程序文件进行修改与处理,以保护代码。具体做法为在Android应用程序中增加.so文件作为还原单元;当应用程序安装后,通过提取处理单元获得目标方法的DEX代码和在OAT文件中的原生代码;通过中间单元对原生代码加密,嵌入到.so文件中,并清零DEX代码与原生代码;用户在运行Android应用程序目标方法时,输入密钥,经还原处理正常运行目标方法。本发明针对现有代码保护方法中DEX代码与OAT文件中的原生代码不能被彻底保护且不能使用口令进行动态还原的安全性缺陷,提出了一套切实可行的办法。
Description
技术领域
本发明涉及一种针对Android预编译的代码保护方法,尤其涉及一种针对Android预编译期间以JAVA类方法为单位进行代码保护的方法,属于软件安全以及通信技术领域。
背景技术
代码保护一直是软件开发领域的重要课题,软件破解、软件盗版与代码抄袭这些行为不仅严重破坏了开发者的既得利益,同时也使软件产业知识产权保护的完善变得愈加困难。因此,世界范围内的学者与开发者都在研究行之有效的代码保护方法。一般有两种常用的方法:一是注册验证,在运行前需要用户输入相应的序列号,软件经过校验,令用户拥有运行软件的权限,同时这一方法也保证用户使用未经篡改过的软件;另一种方法为代码加密,在用户不运行软件时,代码以加密形式存放,而在用户运行软件前,将其进行解密再执行,以保证代码的安全性。
Android系统是一种基于Linux的开放源代码的操作系统,搭载Android系统的移动设备如智能手机等,我们称之为Android智能设备。在Android4.4之前的版本中,Android系统上的应用程序是完全在虚拟机上运行的,Google为使用JAVA语言作为Android系统的官方开发语言,专门定制了Dalvik虚拟机,Dalvik虚拟机可以解析JAVA语言的组织形式JAVA类,并运行JAVA语言的代码实体JAVA类方法。当开发者使用JAVA语言开发一个应用程序时,Android编译工具先将JAVA代码编译为可以运行在Dalvik虚拟机上的DEX代码,将其生成为DEX文件,并打包到APK文件中;Android系统可以安装APK文件,提取DEX文件中的DEX代码并执行。在Android4.4之后到Android5.0的版本中,Google为了提高Android代码的执行效率,在安装APK文件的过程中,进行了一次预编译;具体实现为将JAVA生成的DEX代码预先编译为原生代码(即设备直接运行的机器码),存放在OAT文件之中,运行时,Dalvik虚拟机将DEX代码和OAT文件中的原生代码混合执行。
在Android5.0的后续版本中,Google依然采用预编译方式进行应用程序的运行,所不同的是,Android5.x完全抛弃了之前的Dalvik虚拟机运行模式,全部采用原生代码执行应用程序,只有个别调用会引用DEX代码中的内容。此外,原生代码的组织形式是以类方法为单位存放在OAT文件中的,当一个Android应用程序启动时,负责管理应用程序运行的Libart库会加载相应应用程序的OAT文件到内存中进行解析并执行;在Android程序运行时,Libart库控制着整个Android应用程序的正确运行,当运行到应用程序代码中的某个JAVA类方法时,首先解析DEX代码部分,并根据类方法名等信息找到JAVA类方法生成的原生代码在OAT文件中的位置,再经由寄存器跳转运行内存中已经加载好的OAT文件中的原生代码。
在上述过程中,这些代码的安全性是脆弱的,通过逆向分析,很容易获取DEX代码与OAT文件中的原生代码,使其泄露,如果在这些代码中注入恶意代码,就会对使用者造成损失。
目前,市面上的大多数Android软件加固解决方案都是针对APK文件来进行的,也就是说基本是针对DEX代码进行的加固,而对APK文件预编译后存放在OAT文件的原生代码的保护是欠缺的,另外,目前市面上的加固方案,也不具有使用口令动态解密使代码可执行的功能,黑客只需要在二进制文件中提取获得密钥,进行逆向操作,即可解密代码,这样的保护效果是打折扣的。
综上可知,在Android5.x系统下,要实现DEX代码与原生代码的彻底保护,并采用口令动态还原代码,用现有的加固方法是不能实现的,这就使现有加固方法存在着一定的安全性缺陷。
发明内容
本发明的目的在于针对现有代码保护方法中DEX代码与OAT文件中的原生代码不能被彻底保护且不能使用口令进行动态还原的安全性缺陷,提出了一种针对Android预编译的代码保护方法。
一种针对Android预编译的代码保护方法,简称本方法,包括Android应用程序预编译后的提取处理单元(简称“提取处理单元”)、Android应用程序预编译后的中间处理单元(简称“中间处理单元”)以及Android应用程序运行时的还原单元(简称“还原单元”);
本方法对代码的保护是保护Android应用程序中某一个JAVA类方法,本发明中被保护的JAVA类方法,又简称为目标方法;
Android应用程序预编译后的提取处理单元由C语言编写实现,使用C语言能够方便的解析DEX文件和OAT文件的结构;并根据解析结果提取目标方法的DEX代码和目标方法在OAT文件中的原生代码;提取处理单元的实现封装在artTool.dll文件中;
Android应用程序预编译后的中间处理单元对目标方法的DEX代码和目标方法在OAT文件中的原生代码进行清零、对目标方法在OAT文件中的原生代码进行加密、并保存在还原单元的封装文件.so文件中(原理见还原单元描述);中间处理单元不会改变存放DEX代码的DEX文件和OAT文件的结构;目标方法的DEX代码和目标方法在OAT文件中的原生代码被清零后,Android应用程序在运行目标方法时,在内存中加载的目标方法就是一块全零的区域;中间处理单元的清零与加密操作使用脚本语言自动完成,封装在artToolPack.py文件中;
Android应用程序运行时的还原单元是使用JNI技术实现的,JNI技术可以令JAVA程序调用C++语言编写好的子程序,子程序编译好之后,会生成.so文件以供Android应用程序调用;一个Android应用程序对其专有的.so文件的访问是允许的,利用这一特性,将中间单元生成的加密的目标方法在OAT文件中的原生代码存放在上述生成的.so文件中,以供用户运行应用程序时进行提取;在目标方法还原前,还原单元会请求用户输入密钥,并进行密钥的加载;还原单元的实现逻辑封装在.so文件中;
Android应用程序预编译后的提取处理单元的功能为:通过C语言对Android应用程序的DEX文件与OAT文件进行解析;对目标方法的DEX代码和目标方法在OAT文件中的原生代码进行提取;
Android应用程序预编译后的中间处理单元的功能为:将目标方法的DEX代码和目标方法在OAT文件中的原生代码清零,并将目标方法在OAT文件中的原生代码按特定密钥进行加密,并保存在.so文件中。
Android应用程序运行时的还原单元的功能是:当用户启动Andorid应用程序,并在Android应用程序中准备执行目标方法时,对存放在.so文件中存放的目标方法在OAT文件中的原生代码进行提取、解密,并拷贝到内存指定位置,令内存中加载为正确的目标方法;
本发明是通过以下技术方案实现的:
一种针对Android预编译的代码保护方法,包括以下步骤:
步骤A:由用户在Android应用程序中,添加密钥加载过程与目标方法解密还原过程(用JNI技术实现),并存放在JNI技术生成的.so文件中,即增加还原单元;
步骤B:用户将由步骤A中修改过得到的Android应用程序安装到Android系统,使用提取处理单元提取Android应用程序预编译生成的OAT文件以及存在于Android系统中作为缓存的APK文件;
其中,APK文件是指Android系统打包的Android应用程序安装包,存放着DEX代码的DEX文件也被打包在APK文件中;当此Android应用程序被安装后,Android系统中会缓存它的APK文件;
步骤C:用户使用提取处理单元解析步骤B输出的缓存APK文件中的DEX代码与OAT文件,并提取目标方法的DEX代码与目标方法在OAT文件中的原生代码;
其中,提取处理单元解析DEX代码与OAT文件需要了解DEX代码与OAT文件的布局结构;
提取处理单元解析DEX代码,具体为:先获得DEX代码中的字符串列表,通过JAVA类方法名匹配到需要的字符串并获取序列值,根据序列值,可以获取目标方法的DEX代码;
提取处理单元解析OAT文件的布局结构,具体为:获取OAT文件中存储某一特定JAVA类相关信息的结构,称为OAT Class结构,并根据此结构继续获取某一JAVA类方法的偏移地址集合,通过偏移地址集合,即可得知各个方法的原生代码在OAT文件中的存放位置,以提取目标方法在OAT文件中的原生代码;
步骤D:用户使用中间处理单元对步骤C提取的目标方法的DEX代码与目标方法在OAT文件中的原生代码进行清零,即将目标方法在OAT文件中的原生代码按代码长度写零,而在DEX代码中,仅保留某种指令,这种指令的类型称为invoke指令,其余指令均清零;
其中,保留的invoke指令有程序跳转作用,故需要保留;
步骤E:用户使用中间处理单元将步骤C提取的目标方法在OAT文件中的原生代码加密并嵌入到.so文件中;
步骤F:用户将步骤D与步骤E得到的DEX代码打包成APK文件、并与OAT文件、.so文件一起上传到Android系统的Andorid应用程序目录中,覆盖Android系统中原有的APK文件、OAT文件与.so文件;
步骤G:用户完成步骤A到F后,目标方法的DEX代码和目标方法在OAT文件中的原生代码已被保护;如用户想正常使用目标方法,则由用户启动Android应用程序,在执行目标方法前,由用户输入密钥,等待目标方法在OAT文件中的原生代码被还原单元还原后,即可正常执行目标方法;
在步骤G中,还原单元将用户提供的密钥加载到内存中;并通过获取的密钥调对目标方法的原生代码进行还原,在这之后,还原单元使用内存拷贝技术将目标方法的原生代码覆盖到目标方法的内存区域中,即可完成还原,使Android应用程序可以正常运行;
至此,从步骤A到步骤G,完成了一种针对Android预编译的代码保护方法。
有益效果
一种针对Android预编译的代码保护方法,与其他Android代码保护方法相比,具有如下有益效果:
1.本发明提取后的目标方法将按特定口令对目标方法的DEX代码和目标方法在OAT文件中的原生代码进行加密、清零,使得黑客或反编译人员看不到任何目标方法的相关代码,对目标方法的保护十分彻底。
2.用户可以自定义密钥,并在使用时输入密钥,动态解密目标方法并执行,大幅提高了此代码保护方法的安全性;
3.Android应用程序运行时的还原单元是通过使用JNI技术实现的,JNI技术编写的代码编译好之后,会生成.so文件以供应用程序调用,一个应用程序对其专有的.so文件的访问是允许的,将生成的加密代码存放在.so文件中,以供运行应用程序时进行提取,这样就解决了目标方法加密后的存放问题;
本方法通过对Android系统下预编译后Andorid应用程序的修改,改变Android加载目标方法的过程,使得目标方法的DEX代码以及在OAT文件中的原生代码被加密隐藏,并在运行前通过密钥解密加载执行,令黑客无法破获应用程序源代码,达到了方法代码保护的效果。
附图说明
图1本发明一种针对Android预编译的代码保护方法所依托的系统组成示意图;
图2本发明一种针对Android预编译的代码保护方法的步骤流程图;
图3为本发明一种针对Android预编译的代码保护方法中目标方法的原生代码嵌入到.so文件中后的结构;
图4为本发明一种针对Android预编译的代码保护方法中的OAT文件结构图;
图5为本发明一种针对Android预编译的代码保护方法中的DEX代码结构图;
图6为本发明一种针对Android预编译的代码保护方法中的提取处理单元对OAT文件解析的示意图;
图7为本发明一种针对Android预编译的代码保护方法中的中间处理单元运行情况图;
图8为本发明一种针对Android预编译的代码保护方法中的.so文件经处理后的文件内容;
图9为本发明一种针对Android预编译的代码保护方法中步骤D中目标方法在OAT文件中的原生代码被清零后OAT文件的内容片段;
图10为本发明一种针对Android预编译的代码保护方法中的还原单元密钥加载过程操作示意图;
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明一种针对Android预编译代码保护的方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
下面将按照上面所介绍的步骤,详细介绍各个步骤的具体实施方式。
在介绍实施例前,图1和图2示意了本发明一种针对Android预编译代码保护的方法所依托的系统组成示意图及本方法的步骤流程图。
由图1可以看出,本发明所提出的本系统包括提出处理单元、中间处理单元以及还原单元;
由图2可以看出,本方法包括如下步骤:增加.so还原单元;安装Android应用程序,提取OAT文件与APK文件;解析OAT文件与APK文件中的DEX代码;清零DEX代码与目标方法在OAT文件中的原生代码;将目标方法在OAT文件中的原生代码加密存储到.so文件中;将修改的OAT文件、.so文件上传到Android系统;用户输入密钥,正常执行Android应用程序。
实施例1
本实施例使用LG G4手机作为实施平台,LG G4手机采用Android系统,Android系统版本为Android5.1,实施本方法的Android应用程序为一个简单的Notepad应用,目的为保护其中的JAVA类TestActivity的onCreate方法,对应上文提到的目标方法。本实施例选用Android开发平台Android Studio进行还原单元与Android应用程序的生成,并使用C语言编写与生成提取处理单元,通过Python脚本编写并生成中间单元。实施例具体步骤如下:
步骤1:由用户在Android应用程序中,添加密钥加载过程与目标方法解密还原过程(用JNI技术实现),并存放在JNI技术生成的.so文件中,即增加还原单元;
1.在Android应用程序源代码中,引入JNI技术
在Android应用程序中使用JNI技术需要引入Android NDK,NDK的全称为NativeDevelopment Tool,NDK提供了Android系统的交叉编译工具与基础库,使用NDK,开发者可以在Android系统上使用C++实现而生成的代码。使用Android Studio引入好NDK后,在生成APK文件时,同时将产生一个由JNI技术生成的名为LibJniTest.so的.so文件,并打包到APK文件中,JNI技术正是以这个so库文件为依托执行的。
2.添加密钥加载过程
在Android应用程序的JAVA代码中,定义JNI技术下的方法(即JAVA类方法的JNI技术表现形式,简称JNI方法),JNI方法是以“Native”关键字作为标识的,只需在方法名前添加“Nativie”关键字即可。相应的,在C++代码中实现此JNI方法,令这一方法具体的参数为一个字符串,即密钥。当用户输入密钥时,调用此方法,将传入的密钥存储在内存中,以供下一步的解密还原过程使用。
3.添加目标方法解密还原的过程
同上述操作,定义目标方法解密还原的JNI方法,解密还原方法的具体流程为:首先要加载加密的目标方法的在OAT文件中的原生代码(此目标方法在OAT文件中的原生代码将会在步骤E中由中间单元嵌入到.so文件的固定位置处,通常是在文件末尾之后的某处),本实施例选用了.so文件的0x7000字节偏移位置。因此,本实施例的具体操作将使用C语言中的文件操作技术,打开.so文件,并在.so文件的0x7000处读取文件,将被加密的目标方法在OAT文件中的原生代码加载到内存中,并进行解密。为保证此方法可以解密多个类中多个方法,目标方法在OAT文件中的原生代码在.so文件中是按照一定格式存放的,由图3可以看到目标方法在OAT文件中的原生代码在.so文件中的格式。
步骤2:用户将由步骤1中修改过得到的Android应用程序安装到Android系统,使用提取处理单元提取Android应用程序预编译生成的OAT文件以及存在于Android系统中作为缓存的APK文件;
将Android应用程序的APK文件下载到LG G4手机上运行,可将Android应用程序安装到LG G4手机上。安装完成后,由DEX代码预编译生成的OAT文件会存放在LG G4手机的/data/dalvik-cache/arm/目录下,OAT文件的文件名为data@app@com.tomaszmarzeion.notep ad-1@base.apk.classes.dex。而作为缓存的APK文件会存放在/data/ap p/com.tomaszmarzeion.notepad-1/目录下,文件名为base.apk。之后的步骤会针对这两个文件进行,所以这里用户需使用提取单元将这两个文件提取到用户实行本方法的计算机上。
在提取处理单元中,进行APK文件和OAT文件提取操作的关键命令如下:
adb shell su-c"cp/data/dalvik-cache/arm/data@app@com.tomaszmarzeion.notepad-1@base.apk@classes.dex/storage/sdcard0/"
adb pull/storage/sdcard0/data@app@com.tomaszmarzeion.n otepad-1@base.apk@classes.dex
adb shell su-c"cp/data/app/com.tomaszmarzeion.notepa d-1/base.apk/storage/sdcard0/"
adb pull/storage/sdcard0/com.tomaszmarzeion.notepad-1/base.apk
提取处理单元中执行以上命令,即提取了所需文件到计算机中。
步骤3:用户使用提取处理单元解析步骤2输出的缓存APK文件中的DEX代码与OAT文件,并提取目标方法的DEX代码与目标方法在OAT文件中的原生代码;
提取处理单元的解析操作是建立在对OAT文件结构的理解之上的,故这里对OAT文件结构和解析步骤进行简要说明。从图4中,可以看到OAT文件结构,在OAT文件中,存放了一份完整的DEX文件,可以看到图中所示的结构OAT DEX文件头指向了DEX文件。在DEX文件的DEX代码中,按序存放了Android应用程序的所有JAVA类,另外,OAT DEX文件头也指向了OAT文件中原生代码的JAVA类结构,即图4中的OAT Class结构;因此,共有三个位置存放着JAVA类的信息,他们都是按序一一对应的。
根据OAT DEX文件头的结构,可以在此得到DEX文件中的DEX代码,由图5,可以看到DEX代码的结构。
解析DEX代码的过程是以JAVA类为导向的,即输入JAVA类的名称,搜素到该JAVA类的所有JAVA类方法信息以及其在OAT文件中的原生代码位置。流程如下:首先通过对OATDEX文件头进行解析,得到DEX代码的位置,接下来对DEX代码进行解析,获取JAVA类的位置,通过此位置,可以直接得到一一对应的OAT Class结构的序号,然后对Oat Class进行解析,即可得到目标方法在OAT文件中的原生代码位置,再通过Oat Class结构,可得到目标方法在OAT文件中的原生代码的尺寸,并将其进行精确提取;由图6,可以看到提取的流程示意。
以上解析操作使用手工进行非常困难,所以使用提取处理单元对上述操作进行封装。因此,提取处理单元使用C语言编写实现,并编译生成在artTool.dll文件中;提取处理单元运行时,可以输出目标方法相关的所有信息,包括目标方法的名称,目标方法的序号,目标方法的代码尺寸等等。其中,在这一步得到的目标方法的序号,简称方法序,可以用来作为还原单元中的参数,以确定还原的目标方法是哪一个;在本实施例中,目标方法为TestActivty的onCreate方法,onCreate的方法序为7,则在还原单元中,设定还原的方法序为7,即可还原目标方法。由图7可以看出提取处理单元运行的输出。
步骤4:用户使用中间处理单元对步骤3提取的目标方法的DEX代码与目标方法在OAT文件中的原生代码与进行清零,即将目标方法在OAT文件中的原生代码按代码长度写零,而在DEX代码中,仅保留invoke指令,其余指令均清零;
至此,准备工作已经完成,为了保证其他人无法从LG G4手机上的APK文件以及OAT文件获取任何目标方法的代码信息,需要对OA T文件,即上文提到的data@app@com.tomaszmarzeion.notepad-1@b ase.apk@classes.dex文件与base.apk文件进行代码清零。根据步骤3得到的目标方法相关信息,即目标方法的DEX代码与目标方法在OA T文件中的原生代码的位置与大小,通过中间处理单元将其清零;从图8可以看出清零后的文件内容的二进制表现。
中间处理单元中,关键的清零代码如下:
步骤5:用户使用中间处理单元将步骤3提取的目标方法在OAT文件中的原生代码加密并嵌入到.so文件中;
为将目标方法在OAT文件中的原生代码隐藏并保证其可以在Android应用程序运行时读取,需要将目标方法在OAT文件中的原生代码加密,并存放到.so文件中,因此,中间处理单元中会运行以下命令,将Android应用程序Notepad的.so文件从LG G4手机中提取:
adb shell su-c"cp/data/app/com.tomaszmarzeion.notepa d-1/lib/arm/libJniTest.so/storage/sdcard0/"
adb pull/storage/sdcard0/libJniTest.so
之后,将目标方法在OAT文件中的原生代码加密,使用密钥为“123”,并按照图1的结构将处理后的原生代码写入到.so文件中。这一操作由中间处理单元完成,关键代码如下所示:
首先填充字节0到.so文件的0x7000位置,之后在每一块加密的OAT文件中的原生代码前写入其指向的JAVA类原生代码的长度,JAVA类的名称长度(记录JAVA类的名称长度是为了还原单元可以方便的得到JAVA类的名称),与JAVA类的名称。这里的块加密的OAT文件中的原生代码包含了一个JAVA类所有方法的原生代码,当还原程序加载时,先找到类名,再根据步骤3得到的方法序找到相应的目标方法。从图9,可以看出处理后的.so文件的二进制内容情况。
步骤6:用户将步骤4与步骤5得到的DEX代码打包成APK文件、并与OAT文件、.so文件一起上传到Android系统的Andorid应用程序目录中,覆盖Android系统中原有的APK文件、OAT文件与.so文件;这一步骤由用户手动完成,其执行命令如下:
adb push/storage/sdcard0/data@app@com.tomaszmarzeion.n otepad-1@base.apk@classes.dex
adb shell su-c"cp/storage/sdcard0/data@app@com.tomaszmarzeion.notepad-1@base.apk@classes.dex/data/dalvik-cac he/arm/"
adb push/storage/sdcard0/com.tomaszmarzeion.notepad-1/base.apk
adb shell su-c"cp/storage/sdcard0/com.tomaszmarzeio n.notepad-1/base.apk/data/app/"
adb pull/storage/sdcard0/libJniTest.so
adb shell su-c"cp/storage/sdcard0/libJniTest.so/dat a/app/com.tomaszmarzeion.notepad-1/lib/arm/"
步骤7:用户完成步骤1到6后,目标方法的DEX代码和目标方法在OAT文件中的原生代码已被保护;如用户想正常使用目标方法,则由用户启动Android应用程序,在执行目标方法前,由用户输入密钥,等待目标方法的原生代码被还原单元还原后,正常执行目标方法。
目标方法为JAVA类TestActivty的onCreate方法,在没有还原单元的还原前,该方法是无法运行的,启动此Android应用程序并执行onCreate方法会直接导致Android应用程序崩溃;因此,需要由用户输入密钥,在Android应用程序Notepad中,当用户输入的记事本内容为“pwd123”时,从图10可以看出执行此操作下的显示界面,即可将密钥加载为“123”,并还原目标方法,之后JAVA类TestActivity的JAVA类方法onCreate即可正常运行。如果用户使用工具查看Android应用程序Notepad的目标方法的DEX代码和OAT文件中的原生代码,可以看到目标方法的DEX代码和目标方法在OAT文件中的原生代码均为空,即无法获取源代码,起到了代码保护的效果。
以上所述的具体描述,对发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种针对Android预编译的代码保护方法,其特征在于:
一种针对Android预编译的代码保护方法简称本方法,包括Android应用程序预编译后的提取处理单元(简称“提取处理单元”)、Android应用程序预编译后的中间处理单元(简称“中间处理单元”)以及Android应用程序运行时的还原单元(简称“还原单元”);
本方法对代码的保护是保护Android应用程序中某一个JAVA类方法,本发明中被保护的JAVA类方法,又简称为目标方法。
2.如权利要求1所述的一种针对Android预编译的代码保护方法,其特征还在于:
Android应用程序预编译后的提取处理单元由C语言编写实现,使用C语言能够方便的解析DEX文件和OAT文件的结构;并根据解析结果提取目标方法的DEX代码和目标方法在OAT文件中的原生代码;提取处理单元的实现封装在artTool.dll文件中;
Android应用程序预编译后的中间处理单元对目标方法的DEX代码和目标方法在OAT文件中的原生代码进行清零、对目标方法在OAT文件中的原生代码进行加密、并保存在还原单元的封装文件.so文件中(原理见还原单元描述);中间处理单元不会改变存放DEX代码的DEX文件和OAT文件的结构;目标方法的DEX代码和目标方法在OAT文件中的原生代码被清零后,Android应用程序在运行目标方法时,在内存中加载的目标方法就是一块全零的区域;中间处理单元的清零与加密操作使用脚本语言自动完成,封装在artToolPack.py文件中;
Android应用程序运行时的还原单元是使用JNI技术实现的,JNI技术可以令JAVA程序调用C++语言编写好的子程序,子程序编译好之后,会生成.so文件以供Android应用程序调用;一个Android应用程序对其专有的.so文件的访问是允许的,利用这一特性,将中间单元生成的加密的目标方法在OAT文件中的原生代码存放在上述生成的.so文件中,以供用户运行应用程序时进行提取;在目标方法还原前,还原单元会请求用户输入密钥,并进行密钥的加载;还原单元的实现逻辑封装在.so文件中。
3.如权利要求1所述的一种针对Android预编译的代码保护方法,其特征还在于:
Android应用程序预编译后的提取处理单元的功能为:通过C语言对Android应用程序的DEX文件与OAT文件进行解析;对目标方法的DEX代码和目标方法在OAT文件中的原生代码进行提取;
Android应用程序预编译后的中间处理单元的功能为:将目标方法的DEX代码和目标方法在OAT文件中的原生代码清零,并将目标方法在OAT文件中的原生代码按特定密钥进行加密,并保存在.so文件中。
Android应用程序运行时的还原单元的功能是:当用户启动Andorid应用程序,并在Android应用程序中准备执行目标方法时,对存放在.so文件中存放的目标方法在OAT文件中的原生代码进行提取、解密,并拷贝到内存指定位置,令内存中加载为正确的目标方法。
4.如权利要求1所述的一种针对Android预编译的代码保护方法,其特征还在于:
一种针对Android预编译的代码保护方法,包括以下步骤:
步骤A:由用户在Android应用程序中,添加密钥加载过程与目标方法解密还原过程(用JNI技术实现),并存放在JNI技术生成的.so文件中,即增加还原单元;
步骤B:用户将由步骤A中修改过得到的Android应用程序安装到Android系统,使用提取处理单元提取Android应用程序预编译生成的OAT文件以及存在于Android系统中作为缓存的APK文件;
步骤C:用户使用提取处理单元解析步骤B输出的缓存APK文件中的DEX代码与OAT文件,并提取目标方法的DEX代码与目标方法在OAT文件中的原生代码;
步骤D:用户使用中间处理单元对步骤C提取的目标方法的DEX代码与目标方法在OAT文件中的原生代码进行清零,即将目标方法在OAT文件中的原生代码按代码长度写零,而在DEX代码中,仅保留某种指令,这种指令的类型称为invoke指令,其余指令均清零;
步骤E:用户使用中间处理单元将步骤C提取的目标方法在OAT文件中的原生代码加密并嵌入到.so文件中;
步骤F:用户将步骤D与步骤E得到的DEX代码打包成APK文件、并与OAT文件、.so文件一起上传到Android系统的Andorid应用程序目录中,覆盖Android系统中原有的APK文件、OAT文件与.so文件;
步骤G:用户完成步骤A到F后,目标方法的DEX代码和目标方法在OAT文件中的原生代码已被保护;如用户想正常使用目标方法,则由用户启动Android应用程序,在执行目标方法前,由用户输入密钥,等待目标方法在OAT文件中的原生代码被还原单元还原后,即可正常执行目标方法;
至此,从步骤A到步骤G,完成了一种针对Android预编译的代码保护方法。
5.如权利要求4所述的一种针对Android预编译的代码保护方法,其特征还在于:
步骤B中,APK文件是指Android系统打包的Android应用程序安装包,存放着DEX代码的DEX文件也被打包在APK文件中;当此Android应用程序被安装后,Android系统中会缓存它的APK文件。
6.如权利要求4所述的一种针对Android预编译的代码保护方法,其特征还在于:
步骤C中,提取处理单元解析DEX代码与OAT文件需要了解DEX代码与OAT文件的布局结构;
提取处理单元解析DEX代码,具体为:先获得DEX代码中的字符串列表,通过JAVA类方法名匹配到需要的字符串并获取序列值,根据序列值,可以获取目标方法的DEX代码;
提取处理单元解析OAT文件的布局结构,具体为:获取OAT文件中存储某一特定JAVA类相关信息的结构,称为OAT Class结构,并根据此结构继续获取某一JAVA类方法的偏移地址集合,通过偏移地址集合,即可得知各个方法的原生代码在OAT文件中的存放位置,以提取目标方法在OAT文件中的原生代码。
7.如权利要求4所述的一种针对Android预编译的代码保护方法,其特征还在于:
步骤D中,保留的invoke指令有程序跳转作用,故需要保留。
8.如权利要求4所述的一种针对Android预编译的代码保护方法,其特征还在于:
在步骤G中,还原单元将用户提供的密钥加载到内存中;并通过获取的密钥调对目标方法的原生代码进行还原,在这之后,还原单元使用内存拷贝技术将目标方法的原生代码覆盖到目标方法的内存区域中,即可完成还原,使Android应用程序可以正常运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610579934.4A CN106228041B (zh) | 2016-07-21 | 2016-07-21 | 一种针对Android预编译的代码保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610579934.4A CN106228041B (zh) | 2016-07-21 | 2016-07-21 | 一种针对Android预编译的代码保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106228041A true CN106228041A (zh) | 2016-12-14 |
CN106228041B CN106228041B (zh) | 2018-11-20 |
Family
ID=57532281
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610579934.4A Expired - Fee Related CN106228041B (zh) | 2016-07-21 | 2016-07-21 | 一种针对Android预编译的代码保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106228041B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107690643A (zh) * | 2017-03-16 | 2018-02-13 | 深圳大趋智能科技有限公司 | 安卓apk启动时签名认证的方法及其装置 |
TWI648648B (zh) * | 2017-04-19 | 2019-01-21 | 大陸商北京梆梆安全科技有限公司 | 安卓平台上可執行程式的保護方法 |
CN109918872A (zh) * | 2019-01-28 | 2019-06-21 | 中国科学院数据与通信保护研究教育中心 | Android应用加固方法 |
CN110598402A (zh) * | 2019-09-09 | 2019-12-20 | 杭州天宽科技有限公司 | 一种基于安卓应用的运行保密系统 |
CN111090854A (zh) * | 2019-11-25 | 2020-05-01 | 上海达梦数据库有限公司 | 目标程序的执行与转换方法、装置、终端和存储介质 |
CN112052461A (zh) * | 2020-08-05 | 2020-12-08 | 北京智游网安科技有限公司 | 一种基于指令注入的代码处理方法、终端及存储介质 |
CN112052047A (zh) * | 2020-08-05 | 2020-12-08 | 北京智游网安科技有限公司 | 一种指令处理方法、终端及存储介质 |
CN118132344B (zh) * | 2024-05-06 | 2024-07-02 | 四川天邑康和通信股份有限公司 | Iptv机顶盒的运行控制方法和装置、机顶盒及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150269052A1 (en) * | 2014-03-21 | 2015-09-24 | Marvell World Trade Ltd | Method and apparatus for supporting performance analysis |
CN104965712A (zh) * | 2015-07-17 | 2015-10-07 | 北京奇虎科技有限公司 | 应用程序加固保护方法、装置及移动终端 |
CN105303072A (zh) * | 2015-10-26 | 2016-02-03 | 李晖 | 基于art模式的软件加固方法及装置 |
-
2016
- 2016-07-21 CN CN201610579934.4A patent/CN106228041B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150269052A1 (en) * | 2014-03-21 | 2015-09-24 | Marvell World Trade Ltd | Method and apparatus for supporting performance analysis |
CN104965712A (zh) * | 2015-07-17 | 2015-10-07 | 北京奇虎科技有限公司 | 应用程序加固保护方法、装置及移动终端 |
CN105303072A (zh) * | 2015-10-26 | 2016-02-03 | 李晖 | 基于art模式的软件加固方法及装置 |
Non-Patent Citations (3)
Title |
---|
史成洁: "Android平台应用软件保护技术的研究与实现", 《中国优秀硕士学位论文全文数据库》 * |
巫志文: "基于Android平台的软件加固方案的设计与实现", 《电子工程技术与标准化》 * |
张洪睿、张亚腾: "一种ART模式下应用加固方案", 《软件》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107690643A (zh) * | 2017-03-16 | 2018-02-13 | 深圳大趋智能科技有限公司 | 安卓apk启动时签名认证的方法及其装置 |
TWI648648B (zh) * | 2017-04-19 | 2019-01-21 | 大陸商北京梆梆安全科技有限公司 | 安卓平台上可執行程式的保護方法 |
CN109918872A (zh) * | 2019-01-28 | 2019-06-21 | 中国科学院数据与通信保护研究教育中心 | Android应用加固方法 |
CN110598402A (zh) * | 2019-09-09 | 2019-12-20 | 杭州天宽科技有限公司 | 一种基于安卓应用的运行保密系统 |
CN111090854A (zh) * | 2019-11-25 | 2020-05-01 | 上海达梦数据库有限公司 | 目标程序的执行与转换方法、装置、终端和存储介质 |
CN112052461A (zh) * | 2020-08-05 | 2020-12-08 | 北京智游网安科技有限公司 | 一种基于指令注入的代码处理方法、终端及存储介质 |
CN112052047A (zh) * | 2020-08-05 | 2020-12-08 | 北京智游网安科技有限公司 | 一种指令处理方法、终端及存储介质 |
CN118132344B (zh) * | 2024-05-06 | 2024-07-02 | 四川天邑康和通信股份有限公司 | Iptv机顶盒的运行控制方法和装置、机顶盒及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106228041B (zh) | 2018-11-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106228041A (zh) | 一种针对Android预编译的代码保护方法 | |
US20180260199A1 (en) | Method and apparatus for intermediate representation of applications | |
CN108733988B (zh) | 安卓平台上可执行程序的保护方法 | |
US20160203087A1 (en) | Method for providing security for common intermediate language-based program | |
WO2016078130A1 (zh) | 一种防逆向apk文件的动态加载方法 | |
CN102760219B (zh) | 一种Android平台软件保护系统、方法及设备 | |
US20090138863A1 (en) | Method And Apparatus For Protecting .NET Programs | |
CN107346401B (zh) | 用于安全地执行程序的信息保障系统 | |
CN106203006A (zh) | 基于dex与so文件动态执行的Android应用加固方法 | |
CN104317625A (zh) | 一种apk文件的动态加载方法 | |
US8615735B2 (en) | System and method for blurring instructions and data via binary obfuscation | |
CN112639778A (zh) | 指针认证及指针认证方案之间的动态切换 | |
CN105608346A (zh) | 基于arm指令虚拟化的elf文件保护方法及系统 | |
US20160239671A1 (en) | Method and device for protecting an application and method and device for executing a protected application thus protected | |
CN104408337A (zh) | 一种apk文件防逆向的加固方法 | |
CN105022936A (zh) | 一种类class文件加密解密方法和装置 | |
CN109840400B (zh) | 提供安全性的设备和方法以及针对通用中间语言执行安全性的设备和方法 | |
CN106897587A (zh) | 加固应用、加载加固应用的方法和装置 | |
CN107291485A (zh) | 动态链接库的加固方法、运行方法、加固装置和安全系统 | |
KR101536920B1 (ko) | Arm 프로세서 기반의 파일 난독화 방법 | |
KR102459774B1 (ko) | Dll 파일 암호화 방법, 이를 수행하는 dll 파일 암호화 시스템, 및 이를 저장하는 기록매체 | |
CN112528240B (zh) | 面向密码代码的自动化程序敏感数据保护方法 | |
KR101823226B1 (ko) | 코드 보호 방법 및 시스템 | |
CN107209815B (zh) | 用于使用返回导向编程的代码混淆的方法 | |
KR101667774B1 (ko) | 스크립트 프로그램을 위한 보안 제공 장치 및 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | 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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20181120 |