Simplify:一款通用Android反混淆器

通用Android反混淆器

Android程序代码混淆是Android开发者经常用来防止app被反编译之后迅速被分析的常见手法。在没有混淆的代码中,被反编译的Android程序极其容易被分析与逆向,分析利器JEB就是一个很好的工具。但是加了混淆之后,函数、变量的名称将被毫无意义的字母替代,这将大大提高分析的难度。

Simplify安卓反混淆工具实际上是通过执行一个APP来解读其行为,随后尝试通过优化代码来实现行为一致。该安卓反混淆工具思路清晰,代码风格好,值得深入学习与优化。下图是在使用该工具前后,反编译代码的对比图。

Android反混淆器

该项目有三个部分组成

  1. smalivm:提供用于执行Dalvik方法的虚拟机沙箱。执行方法后,它返回一个包含每个执行路径的所有可能寄存器和类值的图形。即使某些值未知,它也可以工作,例如文件和网络I / O. 例如,任何ifswitch具有未知值的条件都会导致两个分支被占用。
  2. simplify:从smalivm分析执行图并应用优化,如常量传播,死代码删除,非反射和一些窥孔优化。这些非常简单,但是当重复应用时,它们将解密字符串,删除反射,并大大简化代码。它重命名方法和类。
  3. demoapp:包含在您自己的项目中使用smalivm的简单,评论很多的示例。如果您正在构建需要执行Dalvik代码的内容,请查看它。

Simplify Android反混淆安装

构建需要安装Java Development Kit 8(JDK)。

因为这个项目包含Android框架的子模块,所以要克隆--recursive

git clone --recursive https://github.com/CalebFenton/simplify.git

或者随时更新子模块:

git submodule update --init --recursive

然后,构建一个包含所有依赖项的jar:

./gradlew fatjar

在成功执行之后,Simplify.jar 应该出现在simplify/build/libs/simplify.jar这里,接着你可以使用以下命令行测试Simplify.jar是否安装成功

java -jar simplify/build/libs/simplify.jar -it 'org/cf/obfuscated' -et 'MainActivity' simplify/obfuscated-app.apk

Simplify Android反混淆 使用

usage: java -jar simplify.jar <input> [options]
deobfuscates a dalvik executable
 -et,--exclude-types <pattern> Exclude classes and methods which include REGEX, eg: "com/android", applied after include-types
 -h,--help Display this message
 -ie,--ignore-errors Ignore errors while executing and optimizing methods. This may lead to unexpected behavior.
--include-supportAttempt to execute and optimize classes in Android support library packages, default: false
 -it,--include-types <pattern> Limit execution to classes and methods which include REGEX, eg: ";->targetMethod\("
--max-address-visits <N> Give up executing a method after visiting the same address N times, limits loops, default: 10000
--max-call-depth <N> Do not call methods after reaching a call depth of N, limits recursion and long method chains, default: 50
--max-execution-time <N> Give up executing a method after N seconds, default: 300
--max-method-visits <N>Give up executing a method after executing N instructions in that method, default: 1000000
--max-passes <N> Do not run optimizers on a method more than N times, default: 100
 -o,--output <file>Output simplified input to FILE
--output-api-level <LEVEL> Set output DEX API compatibility to LEVEL, default: 15
 -q,--quietBe quiet
--remove-weakRemove code even if there are weak side effects, default: true
 -v,--verbose <LEVEL>Set verbosity to LEVEL, default: 0

项目地址:https://github.com/CalebFenton/simplify