2.1 APK及其基本结构
2.1.1 APK基本结构
Android os上程序安装文件格式
代码想在Android上运行,先编译,再打包成为一个Android os能识别的文件,即APK
一个APK内包含:
被编译的代码文件(.dex文件)
资源文件(resources)
assets
证书(certificates)
清单文件(manifest file)
2.1.2 classes.dex
class.dex 将程序中的类和逻辑代码编译成Dalvik虚拟机可以理解的dex文件格式,由Dalvik虚拟机加载并运行,主要
2.1.3 resources.arsc
包含了一些预编译的资源文件,如二进制的XML文档等。
2.1.4 META-INF目录
编译生成APK包以后,对所有打包文件做SHA-1校验计算,并把计算结果放在此目录下。
安装APK时,会校验决定是否安装
2.1.5 res目录
包含未编译入resources.arsc的资源文件
2.1.6 lib目录
包含指定处理器的已编译代码,是特定于处理器的软件层
Armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,Mips
2.1.7 assets目录
含有应用程序资源的目录,打包APK时不会做任何处理,但需要AssetManager来访问
2.1.8 AndroidManifest.xml
每个应用根目录都必须包含一个Android Manifest.xml文件,此清单文件提供有关应用的基础信息。
如应用名字,版本。。
打包时会被编译成二进制XML格式,可以使用工具反编译回XML文件格式
2.2 反编译
2.2.1 反编译Dalvik字节码文件
先将APk解压,找到class.dex文件。
1.反编译为smail代码
使用 apktool.jar 反编译APk文件
java -jar apktool.jar d APK 文件名 -o 输出目录
使用apktool反编译apk时报错
Exception in thread "main" org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile
: Not a valid dex magic value: cf 77 4c c7 9b 21 01 cd
提示很明显,就是非法Dex,这是因为apk里有加密过后的dex文件,比如有些apk的assets目录下有加密后的Dex文件,添加–only-main-classes参数即可
java -jar "%~dp0\apktool_2.4.1.jar" d -f Game.apk -only-main-classes
2.反编译为jar包
使用dex2jar反编译class.dex文件
可用JD-GUI工具查看
2.2.2 反编译共享库.so文件
.so文件也是ELF文件,可用IDA进行逆向分析
2.3 逻辑分析
Android系统有自己的虚拟机Dalvik。最终编译采用smali而不是java的class
所以反编译得到jar效果没smali更容易理解
下面了解smail的语法和规则
2.3.1 分析smail代码
类似汇编语言,涉及寄存器直接操作,可直接阅读,但难懂
smali在调用方法时,常见指令有
invoke-direct、invoke-virtual、 invoke-static、invoke-super、invoke-interface…
指令后花括号中是方法的参数。参数后面是被调方法所在的类;->方法名(参数类型)返回值类型
除此以外,对象最为常见,对象类型以“L”为开头表示
格式“Lpackage/ClassName;” 分号结束
java.lang.String -> Ljava/lang/String
一个实例
将p1,p2两个值中小的赋值为1
2.3.2 分析jar包
在APK未被混淆/加固的情况下,只需JD-GUI、JAD等工具反编译出源码,通过Java代码分析逻辑
2.3.3 分析共享库
需要汇编基础、C语言基础
2.4 重新打包
2.4.1 打包
使用apktool.jar编译并重打包回APK文件,命令格式为:
java -jar apktool.jar b 输出目录
2.4.2 签名
signapk.jar工具可以为APK进行签名,
java -jar signapk.jar publickey.x509[.pem] privatekey.pk8 in.apk out.apk
2.4.3 测试
有些APK有反篡改保护,重打包后不可用,所以测试是否能正常运行
2.5 动态调试
java环境
安装IntelliJ IDEA
2.6 工具的使用
2.6.1 Android Killer
2.6.2 JEB
2.7 保护措施
2.7.1 代码混淆
传统保护方式
常见混淆工具 ProGuard
最大限度优化字节码文件,重命名类、字段、方法,达到保护效果
混淆针对三类数据:类名、类中方法名、类中字段名
常用规则:
系统组件不能被混淆,自定义view,JNI调用不能被混淆
2.7.3 应用加固
第三方加固平台 APK加固
260加固,梆梆加固。。。
度优化字节码文件,重命名类、字段、方法,达到保护效果
混淆针对三类数据:类名、类中方法名、类中字段名
常用规则:
系统组件不能被混淆,自定义view,JNI调用不能被混淆
2.7.3 应用加固
第三方加固平台 APK加固
260加固,梆梆加固。。。