万字长文带你APK反编译重签名aabapks转换

Android反编译

反编译(Decompilation)是将已编译的程序(比如二进制代码)转换回更高级别的编程语言代码的过程。这通常用于理解程序的工作原理,进行软件审计,恢复丢失的源代码,或者进行教学研究。反编译的难度和效果取决于原程序的编译过程中丢失了多少信息(比如变量名、注释等)。

Android应用通常是用Java或Kotlin编写的,并且打包成APK文件。由于Android应用的这一特性,反编译Android应用通常涉及到多个步骤,包括反编译APK文件以获取其DEX(Dalvik Executable)文件,然后将DEX文件转换为Java源代码。

通常用到的反编译软件如下:

  • Apktool

    • 下载地址: https://apktool.org/docs/install 点击latest version选择需要的版本进行下载。
    • 功能:用于反编译Android APK文件,可以解码资源文件以查看其原始形式,并重新编译修改后的文件回APK。
    • 使用场景:查看和编辑Android应用的资源文件,如XML布局和字符串资源。
  • jadx

    • 安装包地址:https://github.com/skylot/jadx/releases

    • 功能:一个命令行和图形用户界面应用程序,可以将DEX文件直接反编译成Java源代码,无需先转换为JAR。

    • 使用场景:快速查看APK文件的源代码,也支持对APK文件进行编辑和调试。

Java环境部署

参考博客:

JDK下载:Java Downloads | Oracle

安装

需要在电脑中新建一个文件夹,注意,路径不能有中文。

比如我的是:

D:
 |- Z_Enviroment
  |-- Java
   |--- jdk1.8.0_251
   |--- jre1.8.0_251

images/Pasted%20image%2020231103181210.png

安装到这个位置,选择更改为我们新建的jdk1.8.0_251目录(注意此处是jdk)

在这里插入图片描述

安装到这个位置,选择更改为我们新建的jre1.8.0_251目录 (注意此处是jre)

在这里插入图片描述

之后一路点击下一步安装完成即可。

配置JAVA_HOME环境变量

1、打开设置 -> 系统 -> 高级系统设置 -> 环境变量 - > 系统变量(S) -> 点击新建 -> 新建内容如下:

变量名(N): JAVA_HOME
变量值(V):D:\Z_Enviroment\Java\jdk1.8.0_251

在这里插入图片描述

2、上一步点击确认后,在系统变量(S)中找到path,双击点开,继续新建添加变量。

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

在这里插入图片描述

验证Java环境

打开cmd命令行窗口,使用如下两个命令进行验证。

java
javac

如下图所示,则是配置环境变量成功。

  • java

在这里插入图片描述

  • javac

在这里插入图片描述

jadx-gui反编译工具使用

1、下载jadx-gui工具

下载地址:https://apktool.org/docs/install 点击latest version选择需要的版本进行下载。

2、使用jadx-gui工具

双击运行jadx-gui-1.4.7.exe

在这里插入图片描述

3、使用打开文档或者将apk包或者aab包直接拖进应用界面,待反编译完成后即可查看相关信息

在这里插入图片描述

这个软件会自动编译好我们打开的apk包,在下方可以用不同的方式查看这个文件的内容,如:代码、Samli、Simple、Fallback

一般来说,我们软件接入的SDK都会在com这个包下面,需要自己一个层级一个层级的去查找。

jadx命令行的使用

地址: https://github.com/skylot/jadx

参数:

jadx[-gui] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab)  
选项:  
  -d, --output-dir                    - 输出目录  
  -ds, --output-dir-src               - 来源输出目录  
  -dr, --output-dir-res               - 资源输出目录  
  -r, --no-res                        - 不解密资源  
  -s, --no-src                        - 不反编译源代码  
  --single-class                      - 反编译一个单一的类,全名,原始名或别名  
  --single-class-output               - 如果要反编译一个单一的类,则写入文件或目录。  
  --output-format                     - 可以是'java''json',默认:java  
  -e, --export-gradle                 - 保存为 android gradle 项目  
  -j, --threads-count                 - 处理线程数,默认:4  
  -m, --decompilation-mode            - 代码输出模式:  
                                         'auto' - 尝试最佳选项(默认)。  
                                         'restructure' - 恢复代码结构(正常的 java 代码)  
                                         'simple' - 简化指令(线性,有 goto )  
                                         'fallback' - 未经修改的原始指令  
  --show-bad-code                     - 显示不一致的代码(不正确的反编译)  
  --no-imports                        - 禁止使用导入,总是写整个包的名称  
  --no-debug-info                     - 禁用调试信息  
  --add-debug-lines                   - 如果有的话,添加带有调试行号的注释  
  --no-inline-anonymous               - 禁用内联匿名类  
  --no-inline-methods                 - 停用内联方法  
  --no-finally                        - 不抽出最后一块  
  --no-replace-consts                 - 不要用匹配的常量字段替换常量值  
  --escape-unicode                    - 转义字符串中的非拉丁字符 (使用 \u)  
  --respect-bytecode-access-modifiers - 不要改变原来的访问修改器  
  --deobf                             - 激活去混淆功能  
  --deobf-min                         - 名称的最小长度,如果更短则重命名,默认:3  
  --deobf-max                         - 名称的最大长度,如果更长则重命名,默认:64  
  --deobf-cfg-file                    - 反混淆映射文件,默认:与输入文件相同的目录和名称,扩展名为“.jobf”  
  --deobf-cfg-file-mode               - 句柄去混淆映射文件的设置模式:  
                                         'read' - 如果找到则读取,不保存(默认)  
                                         'read-or-save' - 如果找到则读取,否则保存(不要覆盖)  
                                         'overwrite' - 不读取,永远保存  
                                         'ignore' - 不读取也不保存  
  --deobf-use-sourcename              - 使用源文件名作为类名别名  
  --deobf-parse-kotlin-metadata       - 将 kotlin 元数据解析为类和包名称  
  --deobf-res-name-source             - 更好的资源名称来源:  
                                         'auto' - 自动选择最佳名称(默认)  
                                         'resources' - 使用资源名称  
                                         'code' - 使用 R 类字段名称  
  --use-kotlin-methods-for-var-names  - 使用 kotlin 内在方法重命名变量,取值:disable、apply、apply-and-hide,默认:apply  
  --rename-flags                      - 修复选项(逗号分隔列表):  
                                         'case' - 修复区分大小写的问题(根据 --fs-case-sensitive 选项),  
                                         'valid' - 重命名 java 标识符以使其有效,  
                                         'printable' - 从标识符中删除不可打印的字符,  
                                        或单个 'none' - 禁用所有重命名  
                                        或单个 'all' - 启用所有(默认)  
  --fs-case-sensitive                 - 将文件系统视为区分大小写,默认为 false  
  --cfg                               - 将方法控制流程图保存到点文件  
  --raw-cfg                           - 保存方法控制流程图(使用原始指令)  
  -f, --fallback                      - 将“--decompilation-mode”设置为“fallback”(已弃用)  
  --use-dx                            - 使用 dx/d8 转换 java 字节码  
  --comments-level                    - 设置代码注释级别,取值:error、warn、info、debug、user-only、none,默认:info  
  --log-level                         - 设置日志级别,值:quiet,progress,error,warn,info,debug,默认:progress  
  -v, --verbose                       - 详细输出(将 --log-level 设置为 DEBUG)  
  -q, --quiet                         - 关闭输出(将 --log-level 设置为 QUIET)  
  --version                           - 打印 jadx 版本  
  -h, --help                          - 打印此帮助  
  
Plugin 选项 (-P<name>=<value>):  
 1) dex-input: 加载 .dex 和 .apk 文件  
    - dex-input.verify-checksum       - 加载前验证 dex 文件校验和,值:[yes, no],默认值:yes  
 2) java-convert: 转换 .class, .jar 和 .aar 文件到 dex  
    - java-convert.mode               - 转换模式,值:[dx, d8, both],默认值:both  
    - java-convert.d8-desugar         - 在 d8 中使用 desugar,值:[yes, no],默认值:no  
  
示例:  
  jadx -d out classes.dex  
  jadx --rename-flags "none" classes.dex  
  jadx --rename-flags "valid, printable" classes.dex  
  jadx --log-level ERROR app.apk  
  jadx -Pdex-input.verify-checksum=no app.apk
jadx -d "aaa" "aaa/www.apk"
# -d 表示输出目录,后面接的"aaa"表示和jadx根目录下的aaa目录,后面"aaa/www.apk"表示解析的是一个名字为www.apk的包文件路径。

输出如下

D:\D_Working\jadx-1.4.7-cli\bin>jadx -d "aaa" "aaa/www.apk"
INFO  - loading ...
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
INFO  - processing ...
ERROR - finished with errors, count: 197

反编译之后会有两个文件夹

aaa
	- resources
	- sources
		- 这个文件夹下就可以找到我们接入的SDK信息
		- 比如看是否接入了vungle-ads:aaa\sources\com\vungle\ads

这里显示的和在jadx-gui里面显示的为一致

AndroidStudio反编译

Android Studio本身是作为Android应用开发的集成开发环境(IDE),其主要用途是编写、调试和发布Android应用。虽然Android Studio不直接提供反编译Android应用的功能,但它提供了一些工具和插件支持,可以帮助开发者在一定程度上理解和分析APK文件。

AndroidStudio下载安装

下载

官方下载网址: Download Android Studio & App Tools - Android Developers

在这里插入图片描述

下载好之后双击即可安装。

安装

1、一路点击下一步,遇到需要选安装目录的时候,请选择非C盘纯英文盘符目录进行安装。

2、由于前面我们装了JDK,所以AndroidStudio会默认帮你选择之前安装的目录,一路点击下一步即可。

3、如果本机没有装个Android SDK , 会提示你安装,记得依然是选择非C盘纯英文盘符目录进行安装。

4、耐心等待自动安装完成。

随便创建一个空文件项目

在这里插入图片描述

如何查看反编译内容

在上一步中,我们创建好了一个空项目,这个时候只要拖着我们的apk直接丢到这个项目右侧的黑不拉几的位置就可以了。

在这里插入图片描述

1、红框里面的dex文件就是我们对应编译出来的文件

2、鼠标左键单击对应的dex文件可以查看里面的具体内容

在这里插入图片描述

3、需要注意的是,字体显示是斜体的,并不是真正的内容,需要找正正的字体的文件才是正确的

4、当你找到了对应的文件后,右键单击选择Show Bytecode可以查看该文件的内容,这个文件默认是Smail后缀。

在这里插入图片描述

为什么有工具还要用AndroidStudio进行查看

jadx-gui工具虽然也可以查看Smail文件内容,并且比AndroidStudio更加的方便,但是如果我们是通过java代码直接去解析进行反编译,那么还是使用AndroidStudio更加的贴近我们的代码格式处理。

当然这个也因人而异。

apktool基础命令使用

Apktool 是一款逆向工程工具,主要用于Android应用的反编译(Decompiling)和再编译(Recompiling),它可以让你查看应用的资源文件和源代码。

反编译 APK

  • 反编译APK文件

    apktool d [apk文件路径]
    

    这条命令会将APK文件反编译到一个目录中,目录名默认为APK文件的文件名。你可以通过-o选项指定输出目录:

    apktool d [apk文件路径] -o [输出目录]
    

再编译 APK

  • 再编译已反编译的目录

    apktool b [目录路径]
    

    这条命令会将指定的目录重新编译成APK文件。默认情况下,输出的APK位于[目录路径]/dist/下。你也可以通过-o选项指定输出APK的路径:

    apktool b [目录路径] -o [apk文件路径]
    

安装框架资源

  • 安装框架资源

    apktool if [框架资源apk路径]
    

    某些APK在反编译时需要特定的框架资源文件。这条命令可以将框架资源安装到Apktool的工作目录中,以便在反编译或再编译时使用。这个在后面的framework-res.apk提取替换会讲到。

注意事项

  • 使用Apktool时,可能需要Java环境。确保系统已经安装了Java,并且JAVA_HOME环境变量已经设置。
  • 反编译和再编译的APK需要签名才能在设备上安装。可以使用jarsigner工具对APK进行签名,后面会讲。

keytool密钥生成

只要电脑里面安装了java环境,配置了环境变量,就可以直接在控制台输入keytool查看

D:\Z_Enviroment\Java\jdk1.8.0_251\bin\keytool.exe
D:\Z_Enviroment\Java\jdk1.8.0_251\jre\bin\keytool.exe
C:\Users\xiaozai>keytool
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

常用命令

# 生成名为privateKeys.keystore密钥库
keytool -genkeypair -keysize 1024 -validity 7 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "123456" -keypass "123456" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN"
 
# 导出命令
keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "123456" -file "certfile.cer"
 
# 导入命令
keytool -importcert -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "123456"

参数详解:

keysize:指定大小
validity:指定有效时间,单位天
alias:别名
keystore:指定密钥库名称 
storepass:指定密钥库密码
keypass:指定密钥密码
dname:唯一判别名,cn 所有者名称,ou 组织单位名称,o 组织名称,l 城市或区域名称,st 州或省份名称,c 两字母国家代码

查看证书文件中的证书信息

keytool -printcert -file certfile.cer

查看示列:

所有者: CN=Example, OU=Example Unit, O=Example Organization, L=City, ST=State, C=Country
发布者: CN=Example CA, OU=Example CA Unit, O=Example CA Organization, L=City, ST=State, C=Country
序列号: 123456789abcdef
有效期开始日期: Thu Jan 01 12:00:00 GMT 2020
截止日期: Fri Jan 01 12:00:00 GMT 2030
证书指纹:
     MD5:  FA:FB:FC:FD:FE:FF:00:01:02:03:04:05:06:07:08:09
     SHA1: DA:DB:DC:DD:DE:DF:10:11:12:13:14:15:16:17:18:19
     SHA256: 1A:1B:1C:1D:1E:1F:20:21:22:23:24:25:26:27:28:29:2A:2B:2C:2D:2E:2F:30:31:32:33
签名算法名称: SHA256withRSA
版本: 3

签名工具apksigner和jarsigner

apksignerjarsigner都是用于对Android APK文件进行签名的工具,但它们来自不同的项目,并且在一些细节上有所不同。签名对于Android应用的安装至关重要,因为Android系统要求所有安装的应用都必须经过签名。

apksigner

apksigner是Android SDK的一部分,专门设计用于对Android应用包(APK文件)进行签名和验证。它支持对APK签名的所有最新要求和功能,包括对V2、V3签名方案的支持。

  • 签名APK

    apksigner sign --ks [keystore文件] --ks-key-alias [别名] [apk文件]
    

    这条命令使用指定的密钥库(keystore)和别名(alias)对APK文件进行签名。

  • 验证APK签名

    apksigner verify [apk文件]
    

    这条命令用于验证APK的签名是否有效。

apksigner提供了更多的选项,如设置签名算法、指定签名方案版本等,具体可以通过apksigner --help查看。

jarsigner

jarsigner是一个更通用的工具,主要用于对Java归档文件(JAR)进行签名,但也可用于APK文件。相较于apksignerjarsigner可能不支持一些针对Android APK特定的签名特性和要求。

  • 签名APK

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [keystore文件] [apk文件] [别名]
    

    这条命令使用指定的密钥库和别名对APK文件进行签名。-sigalg-digestalg选项指定了签名和摘要算法。

  • 验证APK签名

    jarsigner -verify -verbose -certs [apk文件]
    

    这条命令用于验证APK文件的签名。

选择哪一个?

  • 如果你在进行Android应用开发和发布,推荐使用apksigner,因为它支持Android APK签名的最新标准和要求。
  • 如果你在处理一些与Java密切相关的任务,或者需要一个更通用的签名工具,jarsigner可能是一个不错的选择。

注意

apksignerjarsigner主要用于对已经存在的APK文件进行签名,而不涉及从.aab.apks的转换过程。

bundletool

bundletool 是 Android Studio、Android Gradle 插件和 Google Play 用于构建 Android App Bundle 的底层工具。bundletool 可将 app bundle 转换为部署到设备的各种 APK。

注意事项:不能使用 apksigner 对 App Bundle 进行签名,要对 App Bundle 进行签名,请使用 jarsigner。

官方文档:https://developer.android.com/tools/bundletool?hl=zh-cn

1、所需要的资源

  • bundletool.jar :下载地址 - https://github.com/google/bundletool/releases,相关文档:https://developer.android.com/tools/bundletool
  • 要签名的apk包
  • 签名文件&秘钥

2、命令示列

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

注意:如果要直接使用bundletool,需要自建一个bundletool.bat文件,并把它加到环境变量里面。bundletool.bat内容填写如下:

java -jar yourPath\bundletool.jar %*

最后面的 %* 表示接收任意数量的参数

3、bundletool build-apks 命令的选项

标志说明
–bundle=path**(必需)**指定您使用 Android Studio 构建的 app bundle 的路径。如需了解详情,请参阅构建您的项目。
–output=path**(必需)**指定输出 .apks 文件的名称,该文件中包含了应用的所有 APK 工件。如需在设备上测试此文件中的工件,请按照有关如何将 APK 部署到已连接设备的部分中的步骤操作。
–overwrite使用您通过 --output 选项指定的路径覆盖任何现有的输出文件。如果您不添加此标志,而输出文件已存在,您会遇到构建错误。
–aapt2=path指定 AAPT2 的自定义路径。 默认情况下,bundletool 包含自己的 AAPT2 版本。
–ks=path(可选)指定用于为 APK 签名的部署密钥库的路径。如果您不添加此标志,bundletool 会尝试使用调试签名密钥为您的 APK 签名。
–ks-pass=pass:password 或 --ks-pass=file:/path/to/file指定密钥库密码。如果您指定纯文本格式的密码,请使用 pass: 限定该密码。如果您要传递包含该密码的文件的路径,请使用 file: 限定该路径。如果您使用 --ks 标志指定密钥库,而未指定 --ks-pass,那么 bundletool 会提示您从命令行输入密码。
–ks-key-alias=alias指定要使用的签名密钥的别名。
–key-pass=pass:password或 --key-pass=file:/path/to/file指定签名密钥的密码。如果您指定纯文本格式的密码,请使用 pass: 限定该密码。如果您要传递包含该密码的文件的路径,请使用 file: 限定该路径。如果此密码与密钥库自身的密码相同,您可以省略此标志。
–connected-device指示 bundletool 针对已连接设备的配置构建 APK。如果您不添加此标记,bundletool 会为您的应用支持的所有设备配置生成 APK。
–device-id=serial-number如果您有多个已连接的设备,请使用此标志指定要部署应用的设备的序列号。
–device-spec=spec_json提供 .json 文件的路径,该文件指定了您要针对其生成 APK 的设备配置。如需了解详情,请参阅有关如何生成并使用设备规范 JSON 文件的部分。
–mode=universal将模式设置为 universal。如果您希望 bundletool 构建一个包含应用的所有代码和资源的 APK,以使该 APK 与应用支持的所有设备配置兼容,请使用此选项。注意bundletool 仅包含功能模块,这些模块在通用 APK 中的对应清单中指定 <dist:fusing dist:include="true"/>。如需了解详情,请参阅功能模块清单。请注意,这些 APK 要比针对特定设备配置优化过的 APK 更大。但是,这些 APK 更便于与内部测试人员共享,例如想在多种设备配置上测试应用的测试人员。
–local-testing启用 app bundle 进行本地测试。在本地测试时,由于无需上传到 Google Play 服务器,因此能够实现快速的迭代测试周期。 如需查看如何使用 --local-testing 标志测试模块安装的示例,请参阅 在本地测试模块的安装情况。

4、安装到指定设备

如需从 APK 集部署您的应用,请使用 install-apks 命令并使用 --apks=/path/to/apks 标志指定 APK 集的路径,如以下命令所示。如果您连接了多个设备,请添加 --device-id=serial-id 标志来指定目标设备。

bundletool install-apks --apks=/MyApp/my_app.apks

aab转apks并装到设备

官方示例:

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

aab转apks重签名

如果要将这些 APK 部署到设备,您还需要添加应用的签名信息,如以下命令所示。如果您未指定签名信息,bundletool 会尝试使用调试密钥为 APK 签名。

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

实例:

java -jar bundletool.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks 
--ks=yourapp.keystore 
--ks-pass=pass:123456 
--ks-key-alias=trojan 
--key-pass=pass:123456
--overwrite --mode=universal

安装apks包

java -jar bundletool.jar install-apks --apks=/MyApp/my_app.apks 

apks转apk

apks转apk手动操作直接把apks当作是一个压缩包,把apks的后缀名改成zip解压,解压后的文件中会有一个apk包。

如果使用bash命令,可以参考:

java -jar bundletool.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks 
--ks=yourapp.keystore 
--ks-pass=pass:123456 
--ks-key-alias=trojan 
--key-pass=pass:123456
--overwrite --mode=universal

ren my_app.apks my_app.zip
"C:\Program Files\WinRAR\WinRAR.exe" x -ibck my_app.zip
del my_app.zip
del toc.pb

ren行后面的命令解析:

这段命令是一系列在Windows环境下使用的批处理命令,旨在重命名一个.apks文件为.zip文件,然后使用WinRAR解压这个.zip文件,并最后删除原.zip文件和一个名为toc.pb的文件。下面逐行解析这些命令:

  1. ren my_app.apks my_app.zip:

    • 这行命令使用了Windows的ren(或rename)命令,用于重命名文件。它将名为my_app.apks的文件重命名为my_app.zip。这通常是因为.apks文件实际上是一个特殊格式的.zip文件,重命名后可以使用标准的解压工具来打开。
  2. “C:\Program Files\WinRAR\WinRAR.exe” x -ibck my_app.zip:

    • 这行命令调用了安装在C:\Program Files\WinRAR\目录下的WinRAR.exe程序,使用x参数来解压my_app.zip文件。x参数是用来解压文件并保持原有的目录结构。
    • -ibck参数让WinRAR在后台模式下运行,不显示界面和弹出窗口。这对于批处理操作很有用,因为它不会中断自动化流程。
    • my_app.zip指定了要解压的文件名。
  3. del my_app.zip:

    • 使用del命令删除my_app.zip文件。
  4. del toc.pb:

    • 最后,使用del命令删除名为toc.pb的文件。

整个命令序列的目的是将一个.apks文件转换成标准的.zip格式,然后解压它,最后清理所有不再需要的文件。

aab转apk并装到设备

1、aab转为apks(参考上面的步骤)

2、apks后缀改为zip解压缩为apk

3、使用adb命令安装apk

adb -s 设备id install my_app.apk 

framework-res.apk提取替换

某些APK在反编译时需要特定的框架资源文件。这时候我们需要对我们的框架资源文件进行更新或者替换。未来避免更新后带来的各种问题,所以需要把更新前的框架资源文件备份一份。

判断是否安装有 framework-res.apk

apktool if framework-res.apk

1、把设备中的framework-res.apk提取出来

连接对应的Android设备,这里我使用的是Android14设备,拉取设备上的框架资源文件到PC端。

在这里插入图片描述

adb pull /system/framework/framework-res.apk

2、把framework-res.apk解析到对应文件夹

java -jar apktool_2.9.2.jar if framework-res.apk

附:1:提取设备系统apk

adb pull system/app test 
adb pull system/priv-app test 
adb pull data/app test

#注解:
/system/app 存放rom本身附带的软件即系统软件;
/data/app 存放用户安装的软件;


#注意:
/system/priv-app/下的apk不用系统签名,就能够获取signatureOrSystem权限。
/system/app/下的apk,要获取signatureOrSystem权限,必须用系统签名才行。
/data/app下面的apk无法提取,需要把它复制到别的目录下,在下载到电脑
adb shell cp /data/app/com.xueqiu.android-TKqF3b6wXa1KQ3KyKK6o6Q==/base.apk /sdcard/temp123


#获取apk包名
aapt dump badging PartnerBookmarksProvider.apk

#获取包名所在路径
adb shell pm path 包名

附加2:用python写一个通用的apk提取代码

import os

#获取apk的包名
import time

class Pull_apk():

    def __init__(self,package_name,windows_apk_path):
        """
        : package_name : apk的包名
        : windows_apk_path : 指定电脑存储apk的路径
        """
        self.get_package_name = package_name
        self.self.windows_apk_path = windows_apk_path

    def pull_select_apk(self):
        #获取apk所在的路径
        apk_path_cmdshow = os.popen(f"adb shell pm path {self.get_package_name}").read()
        apk_path = apk_path_cmdshow.split(":")[1].strip()
        apk_name = apk_path.split("/")[-1]
        windows_apk_path = self.windows_apk_path
        #尝试提取到windows系统,如果提取不了,则复制到设备的sdcard目录中,再提取到Windows
        try:
            msg = os.popen(f'adb pull {apk_path} {windows_apk_path} ').read()
            print("----------------")
            if "1 file pulled" in msg:
                print("apk复制成功")
            else:
                #复制到sdcard目录下
                os.system(f'adb shell cp {apk_path}  /sdcard/')
                time.sleep(3)
                os.system(f'adb pull /sdcard/{apk_name} {windows_apk_path}')
                print("else分支,apk复制成功")
        except Exception as e :
            print(e)
        return apk_name

混淆加密

Allatori的介绍

1、allatori是第二代的java混淆器;

2、具有命名混淆,流混淆、字符串混淆以及水印技术等等强大的混淆功能, 因此对混淆后的代码进行逆向工程几乎是不可能的;

3、允许对需要混淆代码的应用程序添加有效期;

4、对代码混淆效果非常强,而且操作简单;

5、不足是混淆之后对程序的性能有较大的影响,混淆之后运行速度会有所降低(一般来说只要对代码进行混淆,多多少少都会对性能产生一定的影响的);

使用方法

1、首先从官网下载:http://www.allatori.com/

2、下载完解压,解压之后的目录是这样的:

在这里插入图片描述

3、新建一个文件夹

在这里插入图片描述

4、进入lib目录将allatori.jar复制到新建的test文件夹、进入tutorial\step01\files目录将Clean.bat、config.xml、RunAllatori.bat复制到新建的test文件夹中

在这里插入图片描述

5、将需要混淆的jar包拷贝到新建的test文件中

在这里插入图片描述

6、修改Clean.bat的内容

del log.xml
del test-1.0-SNAPSHOT-mix.jar

在这里插入图片描述

7、修改RunAllatori.bat的内容

java -Xms128m -Xmx512m -jar allatori.jar config.xml

在这里插入图片描述

  • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
  • ①、-Xmx3550m:设置JVM最大可用内存为3550M.
  • ②、-Xms3550m:设置JVM促使内存为3550m.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存.
  • ③、-Xmn2g:设置年轻代大小为2G.整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8.
  • ④、-Xss128k:设置每个线程的堆栈大小.JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右.

8、修改config.xml

<config>
    <input>
        <jar in="test-1.0-SNAPSHOT.jar" out="test-1.0-SNAPSHOT-mix.jar"/>
    </input>


	<ignore-classes>
		<!--不混淆 引入的第三方jar包-->
		<!--<class template="class *org*" />-->
		<!--不混淆的类-->
		<!--<class template="class com.*" />-->
	</ignore-classes>

    <keep-names>
        <class access="protected+">
            <field access="protected+"/>
            <method access="protected+"/>
        </class>
    </keep-names>

    <property name="log-file" value="log.xml"/>
</config>

在这里插入图片描述

11、此时双击Clean.bat会删除混淆后的jar包以及log文件
12、混淆效果

  • (1)混淆前:

在这里插入图片描述

  • (2)混淆后:

在这里插入图片描述

遇到的问题 - 解决方案

dos命令有中文路径的.bat乱码

打开.bat文件→另存为→编码改为ANSI格式,点击保存,替换原来的.bat文件就行。

AndroidStudio问题

项目构建失败解决

在这里插入图片描述

直接点击Upgrade Gradle wrapper to 7.2 version and re-import the project进行更新即可

在这里插入图片描述

gradle失败解决

1、第一次点击main进行调试,系统会进行Gradle,代码报错

1.1、在com.test.rebuilttool -> api -> ApiCost.java,修改代码如下:

package com.test.rebuilttool.api;  
  
public class ApiConst {  
    public static final  String DOAMIN_URL="https://open-api-cn.dataverse.cn/";  
    public static final  String LOGIN_URL=DOAMIN_URL+"modules/accounts/login";  
    public static final  String TOKEN_URL=DOAMIN_URL+"oauth/access_token";  
    public static final  String FILE_URL= DOAMIN_URL+"modules/accounts/key";  
}

2、下载gradle 压缩包失败,检查网络,确认下网络没有被墙,重新下载即可。

3、检查Gradle配置的JDK是否正确,如果提示升级,直接点升级即可。

在这里插入图片描述

乱码报错解决

1、Gradle成功,但是build失败,控制台输出乱码

2、由于中文注释默认是GBK,AndroidStudio能够正常显示,但是编译的时候GBK中文被gradle认为是不可映射的字符,所以会报错。

3、修改AndroidStudio的VM Options,增加UTF-8编码支持。

4、Help----->Edit Custom VM options

在这里插入图片描述

5、增加UTF-8编码设置

# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html  
-Dfile.encoding=UTF-8

在这里插入图片描述

6、File—>Invalid caches./Restart 重启重启软件

在这里插入图片描述

签名过程失败: error: attribute android:enableOnBackInvokedCallback not found.

搜索到官方回复:https://github.com/iBotPeaches/Apktool/issues/3041,需要更新framework的API到34,这就是我们上面提到过的,资源框架需要更新。

在这里插入图片描述

更新到本机

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555587.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升数据质量的三大要素:清洗prompt、数据溯源、数据增强(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了&#xff0c;分六个项目组 每个项目组都是全职带兼职&#xff0c;且都会每周确定任务/目标/计划然后各项目组各自做任务拆解&#xff0c;有时同组内任务多时 则2-4人一组 方便并行和讨论&#xff0c;每周文档记录当周工作内容&…

Leetcode 4.18

Leetcode 1.无重复字符的最长子串2.最长回文子串3.整数反转4.字符串转换整数 (atoi)5.正则表达式匹配 1.无重复字符的最长子串 无重复字符的最长子串 滑动窗口&#xff0c;先让右指针右移&#xff0c;如果发现这个子串有元素和右指针当前元素重复。 则&#xff1a; 左指针右移…

HackmyVM-----Boxing靶机

文章目录 正常打靶流程1.获取靶机IP地址2.获取靶机端口服务3.访问网页4.添加域名WindowsLinux 5.访问域名6.nc反弹shell 7.结束 正常打靶流程 1.获取靶机IP地址 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, …

Stable Diffusion XL优化终极指南

如何在自己的显卡上获得SDXL的最佳质量和性能&#xff0c;以及如何选择适当的优化方法和工具&#xff0c;这一让GenAI用户倍感困惑的问题&#xff0c;业内一直没有一份清晰而详尽的评测报告可供参考。直到全栈开发者Flix San出手。 在本文中&#xff0c;Flix介绍了相关SDXL优化…

H264标准协议基础3

参考博文 上一篇H264标准协议基础2 1.解码视频帧的poc计算 2.残差4x4 矩阵中的trailingones & numcoeff 2.1查表 trailingones 表达出尾部one(1,-1)系数的个数,按照zigzag扫描出(1,-1)个数,trailingones的最大为3; numcoeff 表达非零值系数的个数,最多为16个…

uniapp开发 如何获取IP地址?

一定要看到最后&#xff01;&#xff01;&#xff01; 一、需求 使用uniapp开发小程序时&#xff0c;需要调取【记录日活动统计】的接口&#xff0c;而这个接口需要传递一个ip给后台&#xff0c; 那么前端如何获取ip呢&#xff1f;下面代码里可以实现 二、代码实现 1.在项…

游戏开发主程进阶之路|主程或高级开发师面试必备之Android和iOS原生APP内嵌CocosCreator引擎

教程地址&#xff1a; 游戏开发主程进阶之路|主程或高级开发师面试必备之Android和iOS原生APP内嵌CocosCreator引擎 Hello大家好&#xff01;&#xff01;相信大家都玩过用过很多类型的APP应用或者游戏APP&#xff1b;现如今很多社交类型的APP或者教育机构的APP会选择通过在应…

demo(四)nacosgateway(2)gatewayspringsercurity

一、思路 1、整体思路 用户通过客户端访问项目时&#xff0c;前端项目会部署在nginx上&#xff0c;加载静态文件时直接从nginx上返回即可。当用户在客户端操作时&#xff0c;需要调用后端的一些服务接口。这些接口会通过Gateway网关&#xff0c;网关进行一定的处理&#xff0…

多线程学习记录

进程是一个个应用程序&#xff0c;线程则可以理解为一个应用进程中的多个功能。有了多线程&#xff0c;便可以让程序同时去做多件事情。 并发:在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行:在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 多线程实现 在J…

K8s: 关于Kubernetes中的Pod的创建,实现原理,Job调度pod以及pod网络

Pod 概述 Pod 是最小部署的单元&#xff0c;Pod里面是由一个或多个容器组成&#xff0c;也就是一组容器的集合一个pod中的容器是共享网络命名空间&#xff0c;每个Pod包含一个或多个紧密相关的用户业务容器Pod 是 k8s 系统中可以创建和管理的最小单元是资源对象模型中由用户创…

winform入门篇 第14章 列表控件

列表控件 列表控件 ListView相当于 ListBox的增强版&#xff0c;支持多列显示 最典型的例子:Windows的文件管理器的列表显示 列表控件的几种视图: Detail:详情模式 List: 列表模式 LargeIcon:大图标模式 Smallcon:小图标模式 列表控件的几个特点: 显示模式可以切换 可以…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于mvc的高校办公室行政…

excel导出并合并

普通导出数据 需求 需要将相同列数据合并 效果图&#xff1a; 代码&#xff1a; package cn.silence.test;import lombok.AllArgsConstructor; import lombok.Data;/*** 班级信息*/ Data AllArgsConstructor public class ClassInfo {/*** 学院*/private String academy;/**…

OpenHarmony多媒体-ijkplayer

简介 ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。 演示 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载&#xff0c;API版本>9 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择…

直流无刷散热风扇的知识原理与内部构成

①直流无刷风扇的结构&#xff1a;主要可分为转子、定子、外框、电机(马达)这四个主要部分以及一些其它的零碎的部件 第一&#xff0c;风扇转子部分: 包括风扇扇叶&#xff0c;是产生空气流动的核心、散热风扇的轴心&#xff0c;用来支撑平衡扇叶滚动、转子磁环&#xff0c;永…

Python路面车道线识别偏离预警

程序示例精选 Python路面车道线识别偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python路面车道线识别偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

Spring Boot + 事务钩子函数,打造高效支付系统!

今天&#xff0c;我继续安利一个独门绝技&#xff1a;Spring 事务的钩子函数。 单纯的讲技术可能比较枯燥乏味。 接下来&#xff0c;我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。 一、案例背景 拿支付系统相关的业务来举例。在支付系统中&#xff0c;我们…

Nodejs 第六十四章(SSO单点登录)

单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证和访问控制的机制&#xff0c;允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录到多个应用程序或系统&#xff0c;而无需为每个应用程序单独提供凭据 SSO的主要优…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘&#xff0c;备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

【Keil MDK5新建工程】STM32F103C8T6

一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 四、GPIO模式 一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 工程文件夹里建立Core、Library、User等文件夹…
最新文章