重要的
该项目已存档,不再维护。
一些最常见的问题在常见问题和故障排除中得到了解答。
适用于 Android 应用程序的黑盒混淆工具。
Obfuscapk是一个模块化的 Python 工具,用于在不需要源代码的情况下混淆 Android 应用程序,因为apktool
用于反编译原始 apk 文件并在对反编译的smali
代码、资源和清单应用一些混淆技术后构建新的应用程序。混淆后的应用程序保留了与原始应用程序相同的功能,但底层的差异有时使新应用程序与原始应用程序有很大不同(例如,基于签名的防病毒软件)。
Obfuscapk 通过使用 BundleDecompiler 添加对 Android App Bundles(aab 文件)的支持(参见#121)。为了使用这个新功能,请从此处下载最新版本的 BundleDecompiler,将其作为BundleDecompiler.jar
保存在PATH
中包含的目录中(例如,在 Ubuntu 中为/usr/local/bin
或/usr/bin
)并进行 make确保它设置了可执行标志。
重要的
BundleDecompiler 尚无法在 Windows 上运行,因此 Windows 平台上的 Obfuscapk 不支持应用程序包混淆。此外,应用程序包支持仍处于早期开发阶段,因此,如果您遇到任何问题或者想帮助我们改进,请参阅贡献。
有关Obfuscapk的更多详细信息,请参阅论文“Obfuscapk:适用于 Android 应用程序的开源黑盒混淆工具”。您可以按如下方式引用该论文:
@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 "
}
Obfucapk 被设计为模块化且易于扩展,因此它是使用插件系统构建的。因此,每个混淆器都是一个继承自抽象基类的插件,并且需要实现obfuscate
方法。当该工具开始处理新的 Android 应用程序文件时,它会创建一个混淆对象来存储所有需要的信息(例如,反编译的smali
代码的位置)和操作的内部状态(例如,已使用的混淆器列表) 。然后,混淆对象作为obfuscate
方法的参数传递给所有活动插件/混淆器(按顺序)进行处理和修改。活动插件的列表和顺序是通过命令行选项指定的。
该工具可以轻松地使用新的混淆器进行扩展:只需在src/obfuscapk/obfuscators
目录中添加实现混淆技术的源代码和插件元数据( <obfuscator-name>.obfuscator
文件)即可(采用简单的现有混淆器,例如Nop
作为起始示例)。该工具将自动检测新插件,因此不需要进一步配置(新插件将像与该工具捆绑的所有其他插件一样对待)。
有两种方法可以在您自己的计算机上获取 Obfuscak 的工作副本:使用 Docker 或直接在Python 3
环境中使用源代码。在这两种情况下,首先要做的就是获取此存储库的本地副本,因此在要保存项目的目录中打开一个终端并克隆存储库:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
这是安装 Obfuscak 的建议方法,因为唯一的要求是安装最新版本的 Docker:
$ docker --version
Docker version 20.10.21, build baeda1f
官方 Obfuscak Docker 镜像可在 Docker Hub 上获取(从此存储库自动构建):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
如果你从 Docker Hub 下载了官方镜像,那么你就可以使用该工具了,所以请继续查看使用说明,否则在之前创建的Obfuscapk/src/
目录(包含Dockerfile
的文件夹)中执行以下命令来构建Docker 镜像:
$ # 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 镜像准备就绪后,进行快速测试以检查所有内容是否已正确安装:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscak 现在可以使用了,请参阅使用说明以获取更多信息。
确保安装了最新版本的apktool
、 apksigner
和zipalign
并可通过命令行使用:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ 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/
)中运行以下命令来安装所需的依赖项:
$ # 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
安装要求后,进行快速测试以检查一切是否正常:
$ 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]
...
Obfuscak 现在可以使用了,请参阅使用说明以获取更多信息。
从现在开始, 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...]
我们首先看一下帮助消息:
$ 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 或应用程序包文件的路径(相对或绝对),以及要应用的混淆技术名称的列表(使用-o
选项指定,可以多次使用)次,例如-o Rebuild -o NewAlignment -o NewSignature
)。其他可选参数如下:
-w DIR
用于设置保存中间文件(由apktool
生成)的工作目录。如果未指定,则会在与输入应用程序相同的目录中创建名为obfuscation_working_dir
的目录。这对于调试目的很有用,但如果不需要,可以将其设置为临时目录(例如-w /tmp/
)。
-d OUT_APK_OR_AAB
用于设置目标文件的路径:混淆过程生成的apk文件(例如, -d /home/user/Desktop/obfuscated.apk
或-d /home/user/Desktop/obfuscated.aab
)。如果不指定,最终的混淆文件将保存在工作目录中。注意:现有文件将被覆盖,没有任何警告。
-i
是一个标志,用于在混淆过程中忽略已知的第三方库,以使用更少的资源,提高性能并降低错误风险。要忽略的库列表改编自 LiteRadar 项目。
-p
是在混淆操作期间显示进度条的标志。在批量操作/自动构建中使用该工具时,禁用进度条很方便,否则应启用此标志以查看混淆进度。
-k VT_API_KEY
仅在使用VirusTotal
混淆器时才需要,用于设置与 Virus Total 通信时使用的 API 密钥。
--keystore-file KEYSTORE_FILE
、 --keystore-password KEYSTORE_PASSWORD
、 --key-alias KEY_ALIAS
和--key-password KEY_PASSWORD
可用于指定自定义密钥库(apk 签名所需)。如果使用--keystore-file
,则还必须指定--keystore-password
和--key-alias
,而仅当所选密钥的密码与密钥库密码不同时才需要--key-password
。默认情况下(当未指定--keystore-file
时),与 Obfuscak 捆绑的密钥库用于签名操作。
--ignore-packages-file IGNORE_PACKAGES_FILE
是包含要忽略的包名称的文件的路径。使用此选项时,这些包内的所有类都不会被混淆。该文件每行应有一个包名称,如下例所示:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
是使用apktool
重建应用程序时使用 aapt2 选项的标志。
现在让我们考虑一个简单的工作示例来了解 Obfuscak 的工作原理:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
运行上述命令时,幕后发生的情况如下:
由于未指定工作目录,因此会在与original.apk
相同的位置创建一个新的工作目录( obfuscation_working_dir
)(这对于在出现错误时检查smali
文件/清单/资源很有用)
执行一些检查以确保所有所需的文件/可执行文件均可用并可供使用
实际的混淆过程开始:指定的混淆器被一一执行(按顺序),直到没有剩下的混淆器或遇到错误
运行第一个混淆器时,使用apktool
反编译original.apk
,并将结果存储到工作目录中
由于第一个混淆器是RandomManifest
,因此反编译的 Android 清单中的条目会随机重新排序(不会破坏xml
结构)
Rebuild
混淆器只需使用apktool
重建应用程序(现在使用修改后的清单),并且由于未指定输出文件,因此生成的 apk 文件将保存在之前创建的工作目录中
NewAlignment
混淆器使用zipalign
工具来对齐生成的apk文件
NewSignature
obfuscator 使用与 Obfuscapk 捆绑的密钥库中包含的自定义证书对新创建的 apk 文件进行签名(尽管可以使用--keystore-file
参数指定不同的密钥库)
当所有混淆器都正确无误地执行后,生成的混淆后的 apk 文件可以在obfuscation_working_dir/original_obfuscated.apk
中找到,经过签名、对齐并准备好安装到设备/模拟器中
如前面的示例所示,始终需要Rebuild
、 NewAlignment
和NewSignature
混淆器来完成混淆操作,以构建最终的混淆 apk。它们不是真正的混淆技术,但在构建过程中需要它们,因此它们包含在混淆器列表中以保持整体架构模块化。
没有按预期工作?请参阅常见问题解答和故障排除。
Obfuscapk 中包含的混淆器可以根据其执行的操作分为不同的类别:
Trivial :顾名思义,此类别包括简单的操作(不会对原始应用程序进行太多修改),例如使用新签名对 apk 文件进行签名。
重命名:更改所使用标识符(类、字段、方法)名称的操作。
加密:打包加密的代码/资源并在应用程序执行期间解密它们。当 Obfuscak 启动时,它会自动生成一个用于加密的随机密钥(32 个字符长,使用 ASCII 字母和数字)。
代码:所有涉及修改反编译源代码的操作。
资源:对资源文件的操作(例如修改清单)。
其他
下面简要介绍了当前与 Obfuscak 捆绑在一起的混淆器(按字母顺序排列)。更多详情请参阅项目源代码。
提示
并非所有下面的混淆器都对应于真正的混淆技术(例如, Rebuild
、 NewAlignment
、 NewSignature
和VirusTotal
),但它们被实现为混淆器,以保持架构模块化并易于通过新功能进行扩展。
使用反射调用Android框架的危险API。为了查明某个方法是否属于 Android 框架,Obfuscapk 参考了 Backes 等人发现的映射。
?高级反射源代码
插入垃圾代码。在这种情况下,垃圾代码由算术计算和取决于这些计算结果的分支指令组成,以永远不会采用分支的方式精心设计。
?算术分支源代码
加密资产文件。
?资产加密源代码
该技术修改控制流图而不影响代码语义:它添加了调用原始方法的新方法。例如,对方法m1 的调用将被新的包装器方法m2替代,调用时,它会调用原始方法m1 。
?间接调用源代码
更改包名称并重命名类(甚至在清单文件中)。
?类重命名源代码
加密代码中的常量字符串。
? ConstStringEncryption源代码
删除调试信息。
?调试删除源代码
重命名字段。
?字段重命名源代码
给定一个方法,它会在第一个
goto
之后插入一条指向该方法末尾的goto
指令和另一个指向该指令的goto
;它通过添加两个新节点来修改控制流图。
?转到源代码
加密本机库。
? LibEncryption源代码
它利用 Java 编程语言的重载功能,将相同的名称分配给不同的方法,但使用不同的参数。给定一个已经存在的方法,此技术会创建一个具有相同名称和参数的新 void 方法,但它还会添加新的随机参数。然后,新方法的主体填充随机算术指令。
?方法重载源代码
重命名方法。
?方法重命名源代码
重新调整应用程序。
?新对齐源代码
使用新的自定义签名重新签署应用程序。
?新签名源代码
插入垃圾代码。 Nop 是no-operation的缩写,是一条不执行任何操作的专用指令。该技术只是在每个方法实现中插入随机
nop
指令。
?诺普源代码
随机重新排序清单文件中的条目。
?随机清单源代码
重建应用程序。
?重建源代码
该技术分析现有代码,查找应用程序的方法调用,忽略对 Android 框架的调用(请参阅
AdvancedReflection
)。如果它找到具有合适方法调用的指令(即,没有构造函数方法、公共可见性、足够的空闲寄存器等),则此类调用将被重定向到将使用反射 API 调用原始方法的自定义方法。
?反射源代码
该技术包括更改代码中基本块的顺序。当找到分支指令时,条件被反转(例如,如果小于则分支,如果大于或等于则变为分支),并且目标基本块相应地重新排序。此外,它还随机重新排列滥用
goto
指令的代码。
?重新排序源代码
加密资源中的字符串(仅那些称为内部代码的字符串)。
? ResStringEncryption源代码
将原始应用程序和混淆后的应用程序发送至 Virus Total。您必须提供 VT API 密钥(请参阅
-k
选项)。
?病毒总源代码
您可以根据 MIT 许可证自由使用此代码。
该软件是由位于热那亚大学 DIBRIS 的计算机安全实验室 (CSecLab) 出于研究目的而开发的。