android-apk解包打包

Posted 蝶泳奈何桥.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android-apk解包打包相关的知识,希望对你有一定的参考价值。


title: android-apk解包打包
categories: Android
tags: [android, 加壳]
date: 2022-09-28 10:29:51
comments: false
mathjax: true
toc: true

android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行


前篇

  • android apk解包和打包 - https://blog.csdn.net/u011435933/article/details/89555328
  • apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程 - https://blog.51cto.com/u_15328720/3384769
  • apk解包修改后重新打包 (好文) - https://blog.csdn.net/qq_16692517/article/details/107220707
  • Android apk反编译,smali文件修改,重新打包 - https://blog.csdn.net/q610098308/article/details/105336399
  • java 反编译 修改smali和重新打包 (好文) - https://blog.csdn.net/weixin_28947723/article/details/115075813
  • 几种Android混淆和逆向工具介绍 - https://blog.51cto.com/u_15060511/4080326
  • Android反编译工具 apktool 、dex2jar、jd-gui、jadx的对比及使用 - https://zhuanlan.zhihu.com/p/389584833
  • https://developer.aliyun.com/article/534391
  • 相关工具下载
    • jd-gui 下载 - https://github.com/java-decompiler/jd-gui/releases
    • dex2jar - https://github.com/pxb1988/dex2jar
    • smali 与 baksmali 下载 - https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads
    • jadx - https://github.com/skylot/jadx/releases
    • apktool - https://bitbucket.org/iBotPeaches/apktool/downloads/
    • bundletool - https://github.com/google/bundletool/releases
      • 使用说明 - https://developer.android.com/studio/command-line/bundletool
    • AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads

反编译流程图


使用 apktool

  • 解包 apk

    $ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar d [test_hi.apk] -o [test_hi]
    

    会将 test_hi.apk 解包到 test_hi 目录

  • 打包 apk

    $ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar b [test_hi]
    

    test_hi 目录打包, 在 test_hi/dist 目录下生成 test_hi.apk

    • 打包完后需要 4 字节对齐

      $ zipalign -p -f -v 4 [test_hi.apk] [test_hi_align.apk]
      
      • 不对齐的情况下, 在 Android 11+ (R+, sdk 30+) 机子安装 apk 会报错: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
    • 此时生成的 apk 需要签名一下, 否安装报错

      adb: failed to install test_hi.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl2044401184.tmp/base.apk: Attempt to get length of null array]
      

      签名参考 [签名 apk 包](#签名 apk 包)


踩坑

apk 文件夹编译 apk 报资源错误

错误: Error: Resource is not public

解决办法: 在 反编译 apk 时, 可以通过 -r 参数来避免resc的反编译,见下图。这样在打包的时候就不会重新编译 resc 文件包括 xml

参考: 反编译工具apktool使用问题 - https://www.jianshu.com/p/47a5511e17bf


使用 jadx 工具查看 apk (推荐)

  • GitHub - https://github.com/skylot/jadx/releases

  • 使用, 直接拖动 apk, jar 到工具即可


使用 smali 工具

使用的是 baksmali-2.2.2.jarsmali-2.2.2.jar

  • dex 解包出 smali

    $ java -jar baksmali-2.2.2.jar d [classes.dex] -o [myout]
    

    解出 classes.dex 的 smali 会生成到 myout 目录下

  • smali 打包成 dex

    java -jar smali-2.2.2.jar assemble [myout] -o [my_classes.dex]
    

    myout 目录打包成 my_classes.dex 文件


签名 apk 包

  • 命令

    $ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks [证书文件.jks] --ks-key-alias [证书别名] --ks-pass pass:[证书密码] --key-pass pass:[别名密码] --out [out_sign.apk] --in [in_unsign.apk]
    
    • 不能使用一下命令打包

      $ jarsigner -verbose -keystore [证书文件.jks] -storepass [证书密码] -signedjar [签名后输出文件.apk] [需要签名的文件.apk] [证书别名]
      

      安装在 安卓 11+ 机子上会报错: ERROR: Target SDK version 32 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme


dex 转 jar

dex2jar 和 jd-gui 只是查看源码的工具

  • 使用 dex2jar 工具

    $ d2j-dex2jar.bat [classes3.dex] --force -o [aaa.jar]
    dex2jar classes3.dex -> aaa.jar
    

jar 装 dex

  • 先 cd 到 android sdk 构建工具目录下, 实测 30- 的才可以使用以下的命令

    $ cd android_sdk\\build-tools\\30.0.3
    $ dx.bat --dex --output=C:\\AndroidLib02.dex C:\\JavaLab.main.jar
    
    
    
    

java 转 smali

  • Android Studio配置超实用java转smali插件 - https://blog.csdn.net/u011426115/article/details/112855820

java2smali 插件一款 Android Studio 上非常实用的插件。通过该插件可以将 Java或者Kotlin 的源文件转为 smali 文件。使用该插件可以方便我们做如下事情:

  1. 对比java源文件学习smali语法

  2. apk重打包过程中Smali插桩

使用插件

  1. plugins 中搜索 java2smali 安装, 然后重启 as

  2. 打开 java 代码, Build -> compile to smali


使用 jd-gui 查看 jar 代码 (不推荐)

  • 直接将 classes3-dex2jar.jar 拖入 jd-gui 即可

    使用 [使用 jadx 工具查看 apk](#使用 jadx 工具查看 apk) 会更好, 反编译后跟接近 源代码


Dex、Smali、Class、Java、Jar 之间的相互转换

工具

工具作用
javacjava------>class
ddxclass------>dex
baksmalidex------>smali
smalismali------>dex
dex2jardex------>jar(class的压缩包)
apktoolapk------>smali

Android源代码从编译到运行

  • java 转 class

    javac Test.java
    
  • class 转 dex

    ddx --dex --output=Test.dex Test.class
    
  • dex 转 smali

    java -jar baksmali.jar -o [输出文件夹] dex文件
    
  • smali 转 dex

    java -jar smali.jar -o 目标dex文件 [smali文件夹] 
    
  • dex 转 jar

    d2j-dex2jar.bat dex文件
    

aab 与 apk 互转

  • Android apk和aab互相转换 - https://blog.51cto.com/u_12300179/5267430

aab 转 apk

  • a

apk 转 aab

  • apk 转 aab - https://juejin.cn/post/6982111395621896229
    • GitHub - https://github.com/37sy/build_aab_tool
  • APK2AAB - https://github.com/sensei-z/APK2AAB

37 手游构建工具使用
  • apk 转 aab - https://juejin.cn/post/6982111395621896229

实测:

  • 加固后的 apk 构建 aab

    • 直接安装 aab, 命令: java -jar E:/bundletool-all-1.12.1.jar install-apks --apks=I:\\base.apks

      闪退, 报错: Didn't find class "androidx.core.app.CoreComponentFactory"

    • 将 aab 解压出来的 apk, 运行正常

  • 未加固的 apk 构建 aab

    • 直接安装 aab, 报错找不到 libmain.so 动态库
    • 将 aab 解压出来的 apk, 运行正常

解决办法:

  • 在导出 apks 文件的命令中加入 --mode=universal 参数, 这样导出的 apks 无论是 加固 还是 不加固 的, 都能正常运行

aab签名

  • 37手游安卓团队 - apk转化aab格式 - https://juejin.cn/post/6982111395621896229

    • GitHub - https://github.com/37sy/build_aab_tool
  • 能使用 jarsigner 为 aab 签名。签名aab的时候不需要使用v2签名,使用JDK的普通签名就行。

    jarsigner -digestalg SHA1 -sigalg SHA1withRSA \\
    -keystore luojian37.jks \\
    -storepass ****** \\
    -keypass ****** \\
    base.aab \\
    ******
    

AndroidManifest.xml 的 解码 编码

  • 还原AndroidManifest.xml明文的方法 - https://blog.csdn.net/wwt831208/article/details/54692561

  • 下载 AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads

  • xml2axml (不错的转换工具) - https://github.com/codyi96/xml2axml

    • xml to axml

      java -jar xml2axml-2.1.0.jar e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
      
    • axml to xml

      java -jar xml2axml-2.1.0.jar d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]
      

命令行构建应用

  • 从命令行构建您的应用 - https://developer.android.com/studio/build/building-cmdline#bundletool-build

以上是关于android-apk解包打包的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中返回未打包的列表?

Wolf RPG Editor之 解包与打包

Android ROM包定制(解包,增删模块,打包)

如何解包/编辑/打包android系统的boot.img文件

使用apktool解包和打包apk

ToolsRDB打包工具详解