chapter4 常见android文件格式

544 阅读4分钟

库文件

  • 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目录:

image.png

发现有3个dex文件,通过IDA Pro来每个dex文件的导出函数情况

  • classes.dex

image.png

发现导出函数主要都是和系统相关的,根据之前定位的unsuccessed对应的id值为:0x7f0e0085进行搜索,发现搜索不到

  • classes2.dex

image.png

发现主要都是和R文件相关的

  • classes3.dex

image.png

在class3.dex中,发现我们自己定义的函数都是在这里,通过对0x7f0e0085进行搜索

image.png

定位到id所在的位置,将鼠标放在if-nez的位置,切换到Hex-View页面

image.png

对应的指令为39 00 0F 00 , 39 为if-nez指令的Opcode,相反,对应if-eqz的Opcode为 38,所以需要将 39 改为 38进行破解

步骤:

1)单击Edit -> Patch Program -> Change Byte...

image.png

2)单击Edit -> Patch Program -> Apply patches to input file...

确认ok保存

3)使用d2j-dex-recompute-checksum对checksum和signature进行修正

d2j-dex-recompute-checksum -f classes3.dex

image.png

4)对classes3-rechecksum.dex重命名为classes3.dex替换原来的classes3.dex文件
5)重新打包成apk,进行签名(注:这块作者没有写的很详细,网上很多方案都是直接打成zip包,然后修改成apk),笔者试过,发现安装失败,以下是报错信息

image.png

笔者使用的是方式是:使用的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                                         1I: 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

安装成功之后,随便输入任何字符串,发现都提示注册成功