- Android中的Apk的加固(加壳)原理解析和实现
- [1. Apk是什么?](#1-apk是什么) - [2. Android分层中native是哪一层?其他层是什么?](#2-android分层中native是哪一层其他层是什么) - [3. 加壳程序项目:DexShellTools](#3-加壳程序项目dexshelltools) - [4. 脱壳程序项目:ReforceApk](#4-脱壳程序项目reforceapk)
Android中的Apk的加固(加壳)原理解析和实现
1. Apk是什么?
Apk是AndroidPackage的缩写,即Android安装包。Apk是类似Symbian sis或者sisx的文件格式。通过将apk文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把Android sdk编译的工程打包成一个安装程序文件,格式为apk。Apk文件其实是zip格式,但后缀名被修改为apk,可以通过WinRAR等压缩工具进行解压缩。
APK文件的结构如下图:
META-INF : 签名信息
res : 资源文件
- anim
- color
- drawable
- drawable-hdpi
- drawable-land
- drawable-land-hdpi
- drawable-mdpi
- drawable-port
- drawable-port-hdpi
- layout
- layout-land
- layout-port
- xml
AndroidManifest.xml :应用的名称,版本,权限,引用的库文件等
classes.dex :针对嵌入式优化
resources.arsc : 本地化,汉化资源存储
2. Android分层中native是哪一层?其他层是什么?
看到Android的分4层:java应用程序,java框架,本地框架和java运行环境,Linux内核空间。那么native层又是指什么?
在这个分层方式当中,Native层就是本地框架。
这些层大致如此区分:
Java应用程序无需过多解释,基本可以理解为各个App,由Java语言实现。
Java框架层就是常说的Framework,这层里东西很多也很复杂,比如说主要的一些系统服务如ActivityManagerService、PackageManagerService等,我们编写的Android代码之所以能够正常识别和动作,都要依赖这一层的支持。这一层也是由Java语言实现。
Native层这部分常见一些本地服务和一些链接库等。这一层的一个特点就是通过C和C++语言实现。比如我们现在要执行一个复杂运算,如果通过java代码去实现,那么效率会非常低,此时可以选择通过C或C++代码去实现,然后和我们上层的Java代码通信(这部分在android中称为jni机制)。又比如我们的设备需要运行,那么必然要和底层的硬件驱动交互,也要通过Native层。
Linux内核空间这部分顾名思义,就是Kernel部分哈~
3. 加壳程序项目:DexShellTools
通过对作者尼古拉斯赵四讲解的通读,加壳程序项目就是对源APK上进行加壳的操作,简单来说就是在源APK结束的末尾连接上给定的脱壳Dex,然后修改新Dex文件的文件的头信息。
在进行连接之前,为了源码的安全,需要用比较复杂的加密算法对其进行加密。
这里我们还需要两个输入文件:
1>、源Apk文件:ForceApkObj.apk 源程序编译之后的apk文件
2>、脱壳程序的Dex文件:ForceApkObj.dex 脱壳程序项目,在编译之后得到的classes.dex文件改个名字