• 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]
      
      • 1

      会将 test_hi.apk 解包到 test_hi 目录

    • 打包 apk

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

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

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

        $ zipalign -p -f -v 4 [test_hi.apk] [test_hi_align.apk]
        
        • 1
        • 不对齐的情况下, 在 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]
        
        • 1

        签名参考 [签名 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 到工具即可

      image-20221020160031677


    使用 smali 工具

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

    • dex 解包出 smali

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

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

    • smali 打包成 dex

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

      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]
      
      • 1
      • 不能使用一下命令打包

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

        安装在 安卓 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
      
      • 1
      • 2

    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
      
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5

    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

      image-20220929141600475


    使用 jd-gui 查看 jar 代码 (不推荐)
    • 直接将 classes3-dex2jar.jar 拖入 jd-gui 即可

      image-20220928164212278

      使用 [使用 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
      
      • 1
    • class 转 dex

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

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

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

      d2j-dex2jar.bat dex文件
      
      • 1

    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 \
      ******
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    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]
        
        • 1
      • axml to xml

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

    命令行构建应用

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

  • 相关阅读:
    Unity读取写入Excel
    基于AAEncode编码的解密经历
    封装全局异常处理
    playwright自动化项目搭建
    多组学+机器学习+膀胱癌+分型+建模
    vue3 props传值默认类型
    卡车上的最大单元数
    分布式锁全家桶
    基于JAVA框架的报修系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    【我不熟悉的css】05. csc中使用变量,:root伪元素的应用
  • 原文地址:https://blog.csdn.net/yangxuan0261/article/details/128047885