Android反编译APK

反编译可以理解为逆向工程(Reverse Engineering)
通过反编译APK,可以更好的理解APK打包过程,可以验证特性和动态替换资源。使用工具ClassyShark

Base

APK(Application Package)

APK实质上为压缩包,可以直接解压,解压后可以获得的信息

  • AndroidManifest.xml:清单文件
  • classes.dex:Dex格式编译文件,classes压缩包
  • res:不需要编译的文件,一般都是系统资源文件
  • assets:AssetManager
  • META-INF:Jar包元数据,也包含应用签名

安装应用

adb install -r *.apk
-r 表示强制安装,覆盖当前版本

查看手机中的所有应用信息

adb shell pm list packages -f

导出手机中的apk(root 手机)

adb pull -p /data/app/me.chunyu.Pedometer-1/base.apk base.apk

AAPT(Android Assets Packaging Tool)

Android 打包工具

在Android sdk的build-tools文件夹中

获取apk信息

  • aapt list base.apk // 内容
  • aapt dump badging base.apk // 属性
  • aapt dump permissions base.apk // 权限
  • aapt dump resources base.apk // 资源

获取二进制xml信息

aapt dump xmltree base.apk AndroidManifest.xml

反编译

dex2jar

dex2jar是dex转换jar的工具,还需要使用Java包解析工具JD-GUI

使用步骤:

  1. apk解压后,可以获得classes.dex(有可能不止一个)
  2. 使用命令d2j-dex2jar classes.dex进行格式转换,得到classes-dex2jar.jar
  3. 得到的jar可以使用JD-GUI查看

apktool

进行资源的反编译,ApkTool Download Page

使用步骤:

  1. apktool d base.apk
  2. 执行完成后,就会生成包含资源文件的test文件夹:
    |.
    | original
    | res
    | smali
    | AndroidManifest.xml
    | apktool.yml

重打包

1. 既然已经顺利进行了反编译,修改之后,可以使用命令进行重新打包

1
2
apktool b test -o new_test.apk
// 执行完成之后,会生成一个new_test.apk

2. 重新打包之后的apk需要重新签名

1
2
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
// 其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量中才可以在任何位置执行此命令

3. 签名完成之后,需要对APK进行一次对齐操作

1
2
zipalign 4 new_test.apk new_test_aligned.apk
// 对齐操作使用的是zipalign工具,该工具在<Android SDK>/build-tools/<version>目录下

4. 验证apk签名是否成功

jarsigner -verify -verbose -certs new_test_aligned.apk

0%