[!IMPORTANT] 该项目已归档,不再维护。

一款针对 Android 应用的黑盒混淆工具。
Obfuscapk 是一款模块化的 Python 工具,用于在不需源码的情况下混淆 Android 应用,它使用 apktool 反编译原始 apk 文件,并在对反编译后的 smali 代码、资源和清单文件应用某些混淆技术后,构建一个新的应用。混淆后的应用保留与原始应用相同的功能,但底层差异有时会使新应用与原始应用大相径庭(例如,对基于签名的防病毒软件而言)。
Obfuscapk 正在通过使用 BundleDecompiler 添加对 Android App Bundles(aab 文件)的支持(参见 #121)。要使用这项新功能,请从 此处 下载最新版本的 BundleDecompiler,将其保存为 BundleDecompiler.jar 并放置在 PATH 包含的目录中(例如,在 Ubuntu 中,/usr/local/bin 或 /usr/bin),并确保它具有可执行权限。
[!IMPORTANT] BundleDecompiler 尚不能在 Windows 上运行,因此 Obfuscapk 在 Windows 平台不支持 App Bundle 混淆。此外,App Bundle 支持仍处于早期开发阶段,如果您遇到任何问题或希望帮助我们改进,请参阅 贡献指南。
关于 Obfuscapk 的更多详细信息可在论文 "Obfuscapk: An open-source black-box obfuscation tool for Android apps" 中找到。您可以按如下方式引用该论文:```BibTeX @article{aonzo2020obfuscapk, title = "Obfuscapk: An open-source black-box obfuscation tool for Android apps", journal = "SoftwareX", volume = "11", pages = "100403", year = "2020", issn = "2352-7110", doi = "https://doi.org/10.1016/j.softx.2020.100403", url = "https://www.sciencedirect.com/science/article/pii/S2352711019302791", author = "Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo", keywords = "Android, Obfuscation, Program analysis" }
## ❱ 演示

## ❱ 架构

Obfuscapk 被设计为模块化且易于扩展,因此它基于一个
[插件系统](https://github.com/tibonihoo/yapsy) 构建。因此,每个混淆器都是一个
继承自抽象
[基类](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscator_category.py) 的插件,
并且需要实现 `obfuscate` 方法。当工具开始处理一个新的
Android 应用程序文件时,它会创建一个
[混淆对象](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscation.py)
来存储所有需要的信息(例如,反编译后的 `smali` 代码的位置),
以及操作的内部状态(例如,已使用的混淆器列表)。
然后,该混淆对象作为参数传递给 `obfuscate` 方法,被所有
激活的插件/混淆器(按顺序)处理和修改。激活插件的列表和
顺序通过[命令行选项](#-使用方式)指定。
该工具可以轻松地通过新混淆器进行扩展:只需在
[`src/obfuscapk/obfuscators`](https://github.com/ClaudiuGeorgiu/Obfuscapk/tree/master/src/obfuscapk/obfuscators)
目录中添加实现混淆技术的源代码和插件元数据(一个
`<混淆器名称>.obfuscator` 文件)即可(以一个简单的现有混淆器如
[`Nop`](https://github.com/ClaudiuGeorgiu/Obfuscapk/blob/master/src/obfuscapk/obfuscators/nop/nop.py)
作为起始示例)。该工具会自动检测新插件,因此无需
进一步配置(新插件将与该工具捆绑的所有其他插件一样被对待)。
## ❱ 安装
有两种方式可以在你自己的计算机上获得 Obfuscapk 的工作副本:要么
[使用 Docker](#docker-镜像),要么在 `Python 3` 环境中
[直接使用源码](#从源码安装)。无论哪种方式,首先要做的是获取此仓库的本地副本,
因此,在你想要保存项目的目录中打开终端并克隆仓库:```Shell
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
这是安装 Obfuscapk 的推荐方式,因为唯一的先决条件是 安装一个较新版本的 Docker:```Shell $ docker --version Docker version 20.10.21, build baeda1f
#### 官方 Docker Hub 镜像
[Obfuscapk 官方 Docker 镜像](https://hub.docker.com/r/claudiugeorgiu/obfuscapk) 可在 Docker Hub 上获取(从此仓库自动构建):```Shell
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
如果你已经从 Docker Hub 下载了官方镜像,那么你就可以直接使用该工具了,请查看使用说明,否则请在之前创建的 Obfuscapk/src/ 目录(即包含 Dockerfile 的文件夹)中执行以下命令来构建 Docker 镜像:```Shell
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
当 Docker 镜像准备好后,快速测试一下以确保所有内容都已正确安装:```Shell
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk 现在已准备好使用,请参阅 使用说明 获取更多信息。
确保已安装最新版本的
apktool、
apksigner
和 zipalign,并可从命令行调用:```Shell
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
```Shell
$ apksigner
Usage: apksigner <command> [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
为了支持应用束混淆,你还需要BundleDecompiler,所以从这里下载最新可用版本,将其保存为BundleDecompiler.jar到PATH所包含的目录中(例如,在Ubuntu中,/usr/local/bin或/usr/bin),并确保设置了可执行标志。
要使用BundleDecompiler和apktool,你还需要一个较新版本的Java。zipalign和apksigner包含在Android SDK中。可执行文件的位置也可以通过以下环境变量指定:APKTOOL_PATH、BUNDLE_DECOMPILER_PATH、APKSIGNER_PATH和ZIPALIGN_PATH(例如,在Ubuntu中,在同一个终端运行Obfuscapk之前,运行export APKTOOL_PATH=/custom/location/apktool)。
除了上述工具外,此项目的唯一要求是安装可用的Python 3(至少3.7)(连同其包管理器pip)。
在项目的主目录(Obfuscapk/)中运行以下命令以安装所需的依赖项:```Shell
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended. $ python3 -m venv venv $ source venv/bin/activate
$ # Install Obfuscapk's requirements. $ python3 -m pip install -r src/requirements.txt
在安装完依赖项后,快速测试以确保一切正常工作:```Shell
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk 现已准备就绪,可以使用了,有关更多信息,请参阅 使用说明。
从现在开始,Obfuscapk 将被视为一个可执行文件 obfuscapk,因此您需要根据工具的安装方式来调整命令:
Docker 镜像:需要将包含待混淆应用程序的本地目录挂载到容器中的 /workdir (例如,当前目录 "${PWD}"),因此命令:
$ obfuscapk [params...]
变为:
$ docker run --rm -it -u $(id -u):$(id -g) -v "${PWD}":"/workdir" obfuscapk [params...]
从源码运行:每条指令都必须在 Obfuscapk/src/ 目录下执行(或者将 Obfuscapk/src/ 目录添加到 PYTHONPATH 环境变量中),因此命令:
$ obfuscapk [params...]
变为:
$ python3 -m obfuscapk.cli [params...]
我们先来看一下帮助信息:```Shell $ obfuscapk --help obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY] [--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD] [--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2] <APK_OR_BUNDLE_FILE>
有两个必需参数:`<APK_OR_BUNDLE_FILE>`(APK 或 App Bundle 文件的路径,可以是相对路径或绝对路径)以及要应用的混淆技术名称列表(通过 `-o` 选项指定,可多次使用,例如 `-o Rebuild -o NewAlignment -o NewSignature`)。其他可选参数如下: