一个基于模式的 Dalvik 反混淆工具,通过有限执行来改进语义分析。同时,也是另一款 Android 反混淆工具 Simplify 的灵感来源。
处理前

处理后

sha1: a68d5d2da7550d35f7dbefc21b7deebe3f4005f3
md5: 2dd2eeeda08ac8c15be8a9f2d01adbe8
既然你是精英级的 Android 逆向工程师,我相信你的系统路径中已经存在 Smali 和 Baksmali。如果由于某种奇怪的原因尚未安装,以下命令可以帮你开始,但请仔细检查后再运行:
mkdir ~/bin || cd ~/bin
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.5.jar && mv smali-*.jar smali.jar
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.2.5.jar && mv baksmali-*.jar baksmali.jar
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/smali
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/baksmali
chmod +x ./smali ./baksmali
export PATH=$PATH:$PWD
确保 adb 已添加到系统路径中。
gem install dex-oracle
或者,如果你想从源码构建:
git clone https://github.com/CalebFenton/dex-oracle.git
cd dex-oracle
gem install bundler
bundle install
你必须运行一个模拟器或连接一个设备,Oracle 才能正常工作。最低支持的 Android 版本为 5.0!
Oracle 需要在实时的 Android 系统上执行方法。这可以是设备或模拟器(推荐)。如果是设备,请确保你不在意在其上运行可能具有敌意的代码。
如果你想使用模拟器,并且已经安装了 Android SDK,可以通过以下命令创建和启动模拟器镜像:
android avd
Usage: dex-oracle [opts] <APK / DEX / Smali Directory>
-h, --help 显示此帮助信息
-s ANDROID_SERIAL, 指定驱动执行使用的设备 ID,默认=""
--specific-device
-t, --timeout N ADB 命令执行超时时间(秒),默认="120"
-i, --include PATTERN 仅优化匹配该模式的方法和类,例如 Ldune;->melange\(\)V
-e, --exclude PATTERN 排除该模式对应的类型;include 会覆盖此选项
--disable-plugins STRING[,STRING]*
禁用插件,例如 stringdecryptor,unreflector
--list-plugins 列出可用插件
-v, --verbose 输出详细信息
-V, --vverbose 输出更详细的信息
例如,仅对名为 Lcom/android/system/admin/CCOIoll; 的类中的方法进行反混淆,输入 APK 文件 obad.apk:
dex-oracle -i com/android/system/admin/CCOIoll obad.apk
Oracle 接受 Android 应用(APK)、Dalvik 可执行文件(DEX)和 Smali 文件作为输入。首先,如果输入是 APK 或 DEX,它会反汇编成 Smali 文件。然后,Smali 文件被传递给各个插件,插件执行分析和修改。插件搜索可被转换为更易读形式的模式。为了理解代码的语义,某些 Dalvik 方法会被实际执行并收集输出结果。这样,一些方法调用可以被替换为常量。之后,所有 Smali 文件会被更新。最后,如果输入是 APK 或 DEX 文件,修改后的 Smali 文件会被重新编译,生成更新后的 APK 或 DEX。
方法执行由 Driver 完成。输入的 APK、DEX 或 Smali 与 Driver 通过 dexmerge 合并成一个单独的 DEX,并推送到设备或模拟器上。然后,插件可以使用 Driver,Driver 利用 Java 反射来执行输入 DEX 中的方法。返回值可以用于改善语义分析,而不仅仅是模式识别。这对于许多字符串解密方法尤其有用,这些方法通常接收加密的字符串或字节数组。一个限制是执行仅限于静态方法。
Oracle 自带了三个插件:
如果你遇到一种新的混淆类型,可能可以用 Oracle 来反混淆。查看 Smali 代码,判断是否可以:
如果满足其中任意一点,你应该尝试编写自己的插件。构建自己的插件有四个步骤:
包含的插件应能很好地指导你理解步骤 #3 和 #4。Driver 旨在帮助完成步骤 #2。
当然,你随时可以分享你遇到的任何混淆,也许有人最终会处理它。
首先,确保 dx 在你的系统路径中。它是 Android SDK 的一部分,但除非你是硬核玩家,否则它可能不在你的路径中。
driver 文件夹是一个由 Gradle 管理的 Java 项目。将其导入 Eclipse、IntelliJ 等 IDE,并做出你想要的任何更改。完成 Driver 更新后,运行 ./update_driver。这将重新构建 Driver 并将输出的 JAR 转换为 DEX。
如果在你的模拟器或设备上执行 Driver 代码时出现问题,请务必打开 monitor(Android SDK 的一部分)并检查是否有任何线索。即使错误对你来说没有意义,但如果你在创建 issue 时附上它,会有帮助。
并非所有 Android 平台都能很好地配合 dex-oracle。有些平台在尝试执行任意 DEX 文件时会出错。如果你遇到段错误或 Driver 崩溃,请尝试使用 Android 4.4.2 API level 19 并搭配 ARM 架构。
有可能某个插件将一段它认为是混淆的代码当作混淆,但实际该代码不应被执行。这似乎不太可能,因为混淆模式通常非常特殊,但确实有可能。如果你发现某个特定插件导致问题,并且你确信该应用并未使用该特定的混淆器(例如,应用未经 DexGuard 保护但 DexGuard 插件仍在尝试执行某些内容),则只需禁用该插件。