本帖最后由 Regan_MX 于 2017-1-25 10:30 编辑

文章难易度:★★★

文章阅读点/知识点:Android程序反混淆利器

文章作者:desword文章来源:安全客

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

1.jpg (27.88 KB, 下载次数: 27)

2017-1-24 11:48 上传

问题背景

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

[AppleScript] 纯文本查看 复制代码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 去尝试那些用Androidgradle proguard混淆过的代码,但是成功率极其低(比如对于用DexGuard混淆过的代码)。

[AppleScript] 纯文本查看 复制代码public void doBadStuff() {

hackYourPhoneLOL("backdoor");

}

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

2.png (303.9 KB, 下载次数: 29)

2017-1-24 11:48 上传

图1:代码解混淆之前

3.png (314.42 KB, 下载次数: 40)

2017-1-24 11:48 上传

图2:代码解混淆之后

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

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

安装方式

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

[AppleScript] 纯文本查看 复制代码git clone --recursive [url]https://github.com/CalebFenton/simplify.git[/url]

or

git submodule update --init --recursive

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

[AppleScript] 纯文本查看 复制代码./gradlew fatjar

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

[AppleScript] 纯文本查看 复制代码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的地址。

[AppleScript] 纯文本查看 复制代码VirtualMachineFactory vmFactory = new VirtualMachineFactory();

vm = vmFactory.build(SMALI_PATH);

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

[AppleScript] 纯文本查看 复制代码MethodEmulator.addMethod("Ljava/io/PrintStream;->println(Ljava/lang/String;)V", java_io_PrintStream_println.class);

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

[AppleScript] 纯文本查看 复制代码vm.execute("Lorg/cf/demosmali/Main;->main([Ljava/lang/String;)V");

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

[AppleScript] 纯文本查看 复制代码executePrintParameter(42);

executeParameterLogicWithUnknownParameter();

executeParameterLogicWithKnownParameter(10);

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

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

[AppleScript] 纯文本查看 复制代码String methodSignature = "Lorg/cf/demosmali/Main;->parameterLogic(I)I";

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

[AppleScript] 纯文本查看 复制代码ExecutionGraph graph = vm.execute(methodSignature);

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

[AppleScript] 纯文本查看 复制代码HeapItem item = graph.getTerminatingRegisterConsensus(MethodState.ReturnRegister);

System.out.println("With no context, returns an unknown integer: " + item);

总结

该工具simplify是我目前看到过的唯一一个通用的能够用来解任何混淆的工具,该工具的思路较为巧妙,(即,通过模拟执行混淆Android程序的方式获知Android程序的功能,从而简化混淆代码,使得易于分析)实现难度较大,因此是一个很不错的工作。但在优化执行效率方面也还有许多的提升空间,比如,在无参数分析函数的设置下,该工具会将所有可能的输入都执行,因此执行的时间可能会很长。从污点分析技术中借鉴剪枝的技术可能是一个有前景的优化方向。

android 反注册代码,Android程序反混淆利器——Simplify工具相关推荐

  1. android中注册代码怎么写,Android P HIDL demo代码编写 (原创)

    之前的文章已经分析了hidl服务的注册和调用,这篇文章来总结下一个hidl的服务如何编写. 缩写hal文件 首先要确认放置文件夹和接口的包名,因为这跟后面使用脚本生成一部分代码有关,一般默认的放在ha ...

  2. android中注册用户界面,Android用户注册界面

    搜索热词 先给大家展示下界面效果图,感觉满意,请参考实现代码. Main.xml源码 android:layout_width="match_parent" android:lay ...

  3. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

  4. android小球移动代码,Android中如何绘制一个跟随手指移动的小球

    Android中如何绘制一个跟随手指移动的小球 发布时间:2020-11-07 16:22:43 来源:亿速云 阅读:82 作者:Leah 本篇文章为大家展示了Android中如何绘制一个跟随手指移动 ...

  5. android登录操作代码,Android Studio实现第三方QQ登录操作代码

    来看看效果图吧 实现QQ登录了, 新建一个项目工程 ,然后把我们刚才下载的SDK解压将jar文件夹中的jar包拷贝到我们的项目libs中 导入一个下面架包就可以 项目结构如下 打开我们的清单文件And ...

  6. android摄像头拍照代码,Android调用摄像头拍照开发教程

    现在很多应用中都会要求用户上传一张图片来作为头像,首先我在这接收使用相机拍照和在相册中选择图片.接下来先上效果图: 接下来看代码: 1.布局文件: xmlns:tools="http://s ...

  7. android apk安装代码,Android安装APK

    7.0以上安装APK,请自行配置FileProvider,具体不多说 android:name="androidx.core.content.FileProvider" andro ...

  8. android增删功能代码,Android SQLite增删查改实例代码部分

    在 Android与SQLite数据库 这个专题里我们谈到了 SQLite 的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自 SQLiteOpenHelper 类的数据 ...

  9. Android更新圆点代码,Android实现两圆点之间来回移动加载进度

    本文实例为大家分享了Android实现两圆点之间来回移动加载进度的具体代码,供大家参考,具体内容如下 一.前言 最近喜欢上自定义控件,喜欢实现一些简约有趣的控件,也好巩固下以前学得知识和不断的学习新知 ...

最新文章

  1. 1-Swift中的Struct 和 Class
  2. 基于神策用户画像,在线教育企业线索标签体系搭建及培育全流程解析
  3. 《机器学习》 —— 第一章:绪论 学习笔记
  4. ADT Running Android Lint has encountered a problem
  5. 最小可行产品是什么_无论如何,“最小可行产品”到底意味着什么?
  6. Hadoop框架:MapReduce基本原理和入门案例
  7. [多重背包+二进制优化]HDU1059 Dividing
  8. lbp特征提取算法 知乎_图像-LBP特征描述算子-人脸检测
  9. 【bug】记一个有趣的“bug”
  10. springcloud生产环境一般怎么部署_生产环境遇到这些ogg报错该怎么处理?
  11. ChinaDDoS BGP 流量牵引二层VLAN回注配置
  12. 鸿蒙系统装机量,王成录:华为对今年鸿蒙OS系统的装机量预估是3亿台
  13. 第四天 轨道交通仿真入门
  14. canvas橡皮擦功能
  15. http://fonts.googleapis.com/css?打开很慢解决方案
  16. 三维空间——点线面关系
  17. 微信小游戏 - 小游戏 vs H5 游戏性能对比和分析
  18. Windows Server 远程桌面连接不上问题解决
  19. PLC通过智能网关实现HTTP-Server接口(带Postman测试截图)
  20. R-quantile()

热门文章

  1. Sprint Galaxy S3 root教程
  2. Python正则表达式匹配猫眼电影HTML信息
  3. 你有你的计划,世界另有计划
  4. 互联网档案馆_互联网档案馆年满20岁,向全世界赠送生日礼物
  5. 淘宝抢购python代码-仅供学习
  6. 逆向OD分享-过检测插件-可过VMP等壳保护检测
  7. 将Oracle数据库的字符集修改为ZHS16GBK
  8. PPT超链接到Word文档中的某一页
  9. 基于java-web的公园景区导游网站系统jsp版本---计算机毕业设计
  10. Sql Server系列:数据库物理模式设计