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]
- 不对齐的情况下, 在 Android 11+ (R+, sdk 30+) 机子安装 apk 会报错:
-
此时生成的 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.jar 和 smali-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 文件。使用该插件可以方便我们做如下事情:
-
对比java源文件学习smali语法
-
apk重打包过程中Smali插桩
使用插件
-
在 plugins 中搜索 java2smali 安装, 然后重启 as
-
打开 java 代码, Build -> compile to smali
使用 jd-gui 查看 jar 代码 (不推荐)
-
直接将 classes3-dex2jar.jar 拖入 jd-gui 即可
使用 [使用 jadx 工具查看 apk](#使用 jadx 工具查看 apk) 会更好, 反编译后跟接近 源代码
Dex、Smali、Class、Java、Jar 之间的相互转换
工具
工具 | 作用 |
---|---|
javac | java------>class |
ddx | class------>dex |
baksmali | dex------>smali |
smali | smali------>dex |
dex2jar | dex------>jar(class的压缩包) |
apktool | apk------>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, 运行正常
- 直接安装 aab, 报错找不到
解决办法:
- 在导出 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解包打包的主要内容,如果未能解决你的问题,请参考以下文章