【技术分享】Android程序反混淆利器——Simplify工具

https://www.anquanke.com/post/id/85388

发布时间:2017-01-23 17:21:23

问题背景

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

public void doBadStuff() {int x;int y;x = Integer.valueOf("5")y = Integer.valueOf("10")x = x * y;x += 5;x /= 3;hackYourPhoneLOL("backdoor");x = y;y = x + 10;y /= 2;
}

该函数的实际意图其实就是执行hackYourPhoneLOL("backdoor");,但是通过代码混淆,增加很多冗余的代码, 使得实际分析的时候工作量增加。对于代码混淆,其实一直并没有一个比较好的思路,也没有万能的工具来解混淆,最常见的方式就是用Android gradle proguard 去尝试那些用Android gradle proguard混淆过的代码,但是成功率极其低(比如对于用DexGuard混淆过的代码)。

public void doBadStuff() {hackYourPhoneLOL("backdoor");
}

今天要介绍的工具,就是一个通用的Android程序反混淆工具,虽然在执行效率上不是很高,但是思路清晰,代码风格好,值得深入学习与优化。下图是在使用该工具前后,反编译代码的对比图。

图1:代码解混淆之前

图2:代码解混淆之后

可以发现,在代码解混淆之后,关键函数名称、正则表达式等等字符串都能够解析出来了,这样的反编译结果将非常适合分析人员进一步分析恶意代码的功能。

这是github地址:https://github.com/CalebFenton/simplify

该工具的核心思路,就是自己模拟的Dalvik虚拟机执行的方式,将待反编译的代码执行一遍,获知其功能后,将反编译之后的代码简化成分析人员便于理解的形式。

安装方式

由于该项目包含Android框架的子模块,因此用以下两种方式获取代码:

git clone --recursive https://github.com/CalebFenton/simplify.git
or
git submodule update --init --recursive

接着,使用gradlew编译jar文件,当然前提是系统里面安装过了gradlew

./gradlew fatjar

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

java -jar simplify/build/libs/simplify.jar -it 'org/cf' simplify/obfuscated-example

注:安装可能出现的问题

由于该工具还在前期开发阶段,因此作者也提出该工具不是很稳定,因此可以尝试使用下面的方式反复尝试是否成功。

1. 首先,确定分析的smali文件包含不多的method或者classes的时候,可以使用-it命令。

2. 如果因此超过了最大的地址访问长度、函数调用分析深度、最大的方法遍历次数等,可以通过改变参数 –max-address-visits, –max-call-depth, –max-method-visits.来修正。

3. 如果实在不行,就是用-v参数来报告问题吧。

完整的使用命令在github中有,这里不再赘述。

例子分析

这里以github里面的一个引导性的例子为切入,来介绍该工具是如何工作的。在介绍该工具如何工作之前,首先简单介绍一下该项目里面包含的模块。

1. smalivm: 该模块是Dalvik虚拟机的模拟器模块,主要用来模块Dalvik虚拟机的执行。它能够根据输入的smali文件返回所有可能的执行路径以及对应的路径得到的寄存器的值。该模拟器能够在不知道一个函数参数的情况下进一步分析,它的方式就是将函数中存在分支的所有结果模拟执行一遍,在完全执行完毕之后,该工具会返回程序执行的每条路径的寄存器的结果,从而便于simplify模块进一步分析,简化混淆的代码。

2. simplify: 该模块是解混淆的主要模块,主要基于smalivm的分析结果,简化混淆的反编译代码,得到易于理解的反编译代码。

接下来看看例子,该例子是java代码的形式编写的。

1. 首先需要新建一个模拟器,其中,SMALI_PATH是自己配置的待分析的smali文件的路径,在这里就不贴出待分析的样例main.smali文件,太长了,github的地址。

        VirtualMachineFactory vmFactory = new VirtualMachineFactory();vm = vmFactory.build(SMALI_PATH);

2. 接下来,是使用该工具提供的hook函数的功能将某些函数hook掉,由于有些函数会影响模拟器的外部输出结果,比如System.out.println(),因此,需要将这些函数hook,以在保证函数正常运行的情况下,得到smalivm正常输出的结果。

MethodEmulator.addMethod("Ljava/io/PrintStream;->println(Ljava/lang/String;)V", java_io_PrintStream_println.class);

3. 接下来,是执行待分析smali文件的main函数。

  vm.execute("Lorg/cf/demosmali/Main;->main([Ljava/lang/String;)V");

4. 最后,根据不同的函数参数输入类型,选择对应的函数分析方式分析Android程序的功能,此外,除了函数本身参数的类型,分析的方式额外的根据自己的需求选择有参数还是无参数分析,此处的选择可以不用局限于函数本身的参数类型。有参数的方式能够加快分析速度,但是往往很多情况下,我们并不知道参数应该设置成什么值,不恰当的值会导致

 executePrintParameter(42);executeParameterLogicWithUnknownParameter();executeParameterLogicWithKnownParameter(10);

注意,由于在无参数分析的情况下,该工具会穷举所有可能的分支结构,因此需要将前面提到的三个参数的数值设置大一些,分析的时间也将响应的变长。

5. executePrintParameter和executeParameterLogicWithKnownParameter这两个函数应该好理解,就是将输入带入进去分析了。接下分析一下executeParameterLogicWithUnknownParameter这个函数。首先是建立目标函数的签名,该名称直接根据待分析的目标函数的签名而来:

String methodSignature = "Lorg/cf/demosmali/Main;->parameterLogic(I)I";

6. 使用smalivm执行在无参数情况设置下的函数,在这个样例中,smalivm应当输出两个结果,这代表了smalivm执行了两条路径。

ExecutionGraph graph = vm.execute(methodSignature);

7. 获取smalivm分析得到所有的分析路径,不同路径有不同的返回结果,因此能够输出所有的返回结果。getTerminatingRegisterConsensus这个函数可以很方便获得所有返回寄存器的地址,从而得到输出的结果。

HeapItem item = graph.getTerminatingRegisterConsensus(MethodState.ReturnRegister);System.out.println("With no context, returns an unknown integer: " + item);

http://jackzhang.info/2018/08/28/Android-%E5%8F%8D%E6%B7%B7%E6%B7%86%E7%A5%9E%E5%99%A8JEB2%E7%9A%84%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B/

JEB2工具的基本使用

首先下载jeb2.2.5破解版

下载link: 链接:http://pan.baidu.com/s/1bJdWse 密码:ncr3

Jeb支持Windows,Linux,Macos 系统我这里用的Windows系统所以点击jeb_wincon.bat,然后在JEB2中打开需要逆向的apk

双击Bytecode打开smali代码

点击Bytecode/Hierarchy窗口即可查看包名树状图 树状图排列: 包名->类名

双击包名下的类名即可查看smali代码

想把smali代码转换成java代码 很简单 只需右键Q即可

双击方法即可跳转到方法的定义 点击方法按x键可以查看方法的调用

双击Manifest即可查看AndroidManifest.xml

以上就是JEB2的基本用法,接下来重点来了

JEB2反混淆脚本

反混淆脚本思路

许多APK开发商为了在崩溃时保存源文件类名、行号等信息会在APK混淆时添加以下规则保留源文件信息.

(注意:若APK没有保留这些源信息时则无法反混淆)

-keepattributes SourceFile,LineNumberTable

这样我们在看Smali时就能在(JEB中称为)字段中看到原始类名信息.如下图所示:

JEB2.2.x是默认不显示这些调试信息的可以根据以下步骤在设置中打开:Edit -> Options -> Engines -> 修改ShowDebugDirectives的值为true

这样我们就可以在JEB2中根据每个类的原始信息进行批量重命名达到反混淆的效果。

脚本下载地址:

https://github.com/S3cuRiTy-Er1C/JebScripts

加载脚本之前先需要在 jeb225/scripts/目录下安装Jypthon环境,具体步骤如下:

Setting up Jython:

  • Download a stand-alone Jython package from http://www.jython.org/downloads.html We recommend either version 2.5 (fastest) or version 2.7 (latest)
  • Drop the downloaded ‘jython-standalone-???.jar’ file in the scripts/ sub-directory located in your JEB installation directory
  • Make sure that the client property ‘.ScriptsFolder’ refers to that directory (it is the case by default; use ‘Edit/Options, Advanced…’ to verify this)

我这边下载的是 jython-standalone-2.5.4-rc1

完成后打开JEB2 -> File -> Scripts -> Run Scripts -> 选择从上面下载的 JEB2DeobscureClass.py脚本

安卓逆向代码反混淆 Simplify工具 JEB2反混淆神器相关推荐

  1. js反混淆还原工具_SATURN反混淆框架

    本文为看雪论坛精华文章 看雪论坛作者ID:梦野间 摘要:近几年,软件的混淆强度一直在不断提升.基于编译器的混淆已经成为业界事实上的标准,最近的一些论文也表明软件的保护方式使用的是编译器级别的混淆. 在 ...

  2. 2023安卓逆向 -- JNI学习(从开发到反编译)

    一.新建native C++项目,填写好项目信息,一路下一步即可 二.创建好项目,直接点击运行,出现下面界面,说明我们的环境都没有问题 三.Java层调用java层函数 1.新建一个Java Clas ...

  3. android 反注册代码,Android程序反混淆利器——Simplify工具

    本帖最后由 Regan_MX 于 2017-1-25 10:30 编辑 文章难易度:★★★ 文章阅读点/知识点:Android程序反混淆利器 文章作者:desword文章来源:安全客 [技术分享]An ...

  4. Java代码混淆案例(附反编译工具)

       我们开发的软件上线后,经常会遇到核心代码不希望给别人抄袭,但系统是用Java开发的,又无法避免被反编译的情况,这样可以用代码混淆的方式来解决. 一.编译 顾名思义,就是将我们写的代码运行一遍,然 ...

  5. 安卓逆向_18 --- APK保护策略【Java代码混淆、资源混淆、签名校验】

    Java 代码混淆介绍:https://www.bilibili.com/video/BV1UE411A7rW?p=60 Android 反编译利器 jadx:GitHub上直接下载:https:// ...

  6. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  7. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)...

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  8. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 写在前面 逆向目标 绕过无限 debugger Hook 参数 逆向参数 PyCharm 本地联调 完整代码 J ...

  9. 安卓逆向_0 --- 逆向、安全、工具集

    1.工具集 ​吾爱 工具集 官网:https://www.52pojie.cn/ 工具集:https://down.52pojie.cn :https://www.52pojie.cn/thread- ...

最新文章

  1. 英文版windows乱码问题(win7/8/10)
  2. 中国水闸橡胶密封件市场需求状况与营销模式建议报告2022年
  3. web端 复合控件 响应回发
  4. 安装kerberos报错 error: command 'gcc' failed with exit status 1
  5. Unable to execute dex: GC overhead limit exceeded
  6. pandas显示全部数据内容_vue项目,当鼠标移入时文本长度超出才显示全部内容
  7. Key为数字的Json数据标准化成标准Json格式
  8. STM32程序的烧录方式 与 ISP一键下载
  9. 美团西安美食部分爬虫(修改版)(python)
  10. 目瞪口呆,4款1M不到的实用软件,颠覆你的认知
  11. c语言max比较字符串,c语言中能不能用max函数求三个数的最大者呢?
  12. 腾讯魏巍:Eunomia云原生资源编排优化
  13. 本地HTML文档批量翻译软件
  14. OpenSSL-SNI
  15. C语言明显优于其它高级语言
  16. mysql时间函数之hour,minute,second用法_前进的火车_新浪博客
  17. matlab系统辨识工具箱原理,matlab常用工具箱介绍
  18. Vuforia-PocketCat丨1. 设计目标及效果展示
  19. 【机器学习】最大均值差异MMD详解
  20. 网站业务被攻击,CPU100%负载满了怎么解决

热门文章

  1. MySQL学习【第五篇SQL语句上】
  2. Java分享笔记:自定义枚举类 使用enum关键字定义枚举类
  3. centos7:塔建pure_ftpd虚拟用户
  4. 一个简单的封ip规则
  5. Mac 获取 Brew
  6. 2012年3月编程语言排行榜:JavaScript超越Perl和Python
  7. 静态生成html的原理
  8. Myeclipse/eclipse 安装查看class文件的插件
  9. android 双线程等待,在Java/Android中启动另一个线程之前如何等待线程完成?
  10. 小哼买书JAVA编写,04_小哼买书