库文件
- jar包:本质是一个zip格式的压缩包,里面存放的是编译后的java代码的class文件
- arr包:也是一个zip格式的压缩包,相比jar包,多了一些文件,比如:res目录、jni目录、libs目录等
APK文件目录
主要包含
- AndroidManifest.xml
编译好的AXML二进制格式,它的文件格式称之为‘AXML文件格式’,相比XML,主要是解决APK加载时的性能,二进制和纯文本相比,在分析速度和内存占用方面都有明显的优势。
对AXML的修改,主要是利用系统解析AXML的漏洞,构造畸形的AXML,这样将会让Apktool这类反编译工具无法运行。
- META-INF目录:
用于保存APK的签名信息
比如:
CERT.RSA:存放着开发者信息和签名信息,主要用来判断APK是否被篡改
MANIFEST.MF:签名清单文件,里面存放的是APK文件中所有包含的文件列表的SHA-1散列值的Base64值,从而保证在进行APK签名时APK中所有的文件均未被修改
- class.dex
程序的可执行代码,如果开启了MultiDex,则会有多个Dex文件
如果我们对class.dex进行修改,需要对checksum和signature进行重新修正,比如可以直接使用dex2jar这个工具的d2j-dex-recompute-checksum
ODEX文件:是对dex文件的一种优化,dalvik虚拟机在解析dex文件时,就会生成一个odex文件,并将这个文件存放在/data/dalvik/cache目录下,后续再继续运行这个程序的时候,将会直接加载odex文件,这样就大大节省了每次运行程序时在优化上耗费的时间
OAT文件:是优化过的、用于ART虚拟机执行的DEX文件,在APK第一次安装或系统升级、重启时,调用dex2oat命令,将dex文件编译成oat文件,并存放在/data/dalvik-cache或/data/app/package目录下,dex2oat将dex中的dalvik字节码编译成native机器码,以后在启动程序的时候,ART就会提高APK的启动速度
- res目录
程序中使用的资源文件
- resources.arsc
编译好的二进制资源文件,包含不同语言环境下res目录中所有的资源类型、名称与ID所对应的信息
- assets目录
如果使用Asset系统来存放Raw资源,所有的资源文件都会存放在这个目录
Dex文件修改
使用的工具:IDA Pro
使用的apk包:链接: pan.baidu.com/s/13dUXnpfK… 提取码: b9ck
通过zip解压后apk目录:
发现有3个dex文件,通过IDA Pro来每个dex文件的导出函数情况
- classes.dex
发现导出函数主要都是和系统相关的,根据之前定位的unsuccessed对应的id值为:0x7f0e0085进行搜索,发现搜索不到
- classes2.dex
发现主要都是和R文件相关的
- classes3.dex
在class3.dex中,发现我们自己定义的函数都是在这里,通过对0x7f0e0085进行搜索
定位到id所在的位置,将鼠标放在if-nez的位置,切换到Hex-View页面
对应的指令为39 00 0F 00 , 39 为if-nez指令的Opcode,相反,对应if-eqz的Opcode为 38,所以需要将 39 改为 38进行破解
步骤:
1)单击Edit -> Patch Program -> Change Byte...
2)单击Edit -> Patch Program -> Apply patches to input file...
确认ok保存
3)使用d2j-dex-recompute-checksum对checksum和signature进行修正
d2j-dex-recompute-checksum -f classes3.dex
4)对classes3-rechecksum.dex重命名为classes3.dex替换原来的classes3.dex文件
5)重新打包成apk,进行签名(注:这块作者没有写的很详细,网上很多方案都是直接打成zip包,然后修改成apk),笔者试过,发现安装失败,以下是报错信息
笔者使用的是方式是:使用的apktool来完成打包,然后根据错误提示,缺什么,补什么
1)
╰─➤ apktool b app-debug-change-dex
I: Using Apktool 2.6.1
brut.directory.PathNotExist: apktool.yml
手动添加apktool文件
2)
╰─➤ apktool b app-debug-change-dex
I: Using Apktool 2.6.1
I: Copying app-debug-change-dex classes.dex file...
I: Copying app-debug-change-dex classes3.dex file...
I: Copying app-debug-change-dex classes2.dex file...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/kotlin)
I: Copying libs... (/META-INF/services)
I: Building apk file...
I: Copying unknown files/dir...
java.io.FileNotFoundException: app-debug-change-dex/unknown/DebugProbesKt.bin (No such file or directory)
创建unknown目录,将app-debug-change-dex/DebugProbesKt.bin移动到unknown目录下
3)
╰─➤ apktool b app-debug-change-dex 1 ↵
I: Using Apktool 2.6.1
I: Checking whether resources has changed...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
打包成功
重签名:python repack_sign.py -i app-debug-change-dex-with-apktool.apk -o app-debug-change-dex-with-apktool-sign.apk
4)安装apk
╰─➤ adb install app-debug-change-dex-with-apktool-sign.apk
Performing Streamed Install
Success
安装成功之后,随便输入任何字符串,发现都提示注册成功