欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用FRIDA为Android应用进行脱壳的操作指南

来源:未知 作者:wnhack 时间:2019-01-08 14:27 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助
FortiGuard实验室最近遇到了很多加壳Android恶意软件。这类恶意软件一个很有趣的点是,尽管使用的加壳工具是一样的,但生成的恶意软件却常常会发生变化。
分析加壳工具通常令人望而生畏。因为不光分析流程很难理解,并且分析过程中往往也伴随着大量的垃圾信息。
正因为如此,我们想分享我们在处理分析这类恶意软件时出现的一些问题。并且这篇文章也将演示如何使用开源免费工具解压当今最常见的dropper部署的恶意软件。
参考样本是:509aa4a846c6cb52e9756a282de67da3e8ec82769bceafa1265428b1289459b3
静态分析
样本概述
首先,看看我们正在处理的APK。

图1:APK中包含的文件
这个样本显然就比较可疑,比如MawmjulbcbEndsqku ^ nd.cml文件是个什么鬼?
我们先从bash命令开刀,看看能不能处理这个文件,然而并没有检测到任何文件类型。接着我们再试图通过hex editor去打开文件(但我们实际上使用了radare2,它是一个很好用的开源逆向工程框架),不过最后还是无法确定此文件的类型。

图2:hex视图下的MawmjulbcbEndsqku ^ nd.cml
列的内容和名称看起来像是随机字符,这可能是主应用程序使用的加密文件。
也许通过Android Manifest,我们才能获得我们想得到的信息。
Android Manifest
AndroidManifest.xml是一个Android二进制XML文件,其中包含有关该应用程序的大量信息,包括:
· 应用程序的软件包名称,可以在设备上访问
· 应用程序使用的活动、服务和接收器的完整列表(如果未在此处声明,以后将无法使用它们)
· 完整的权限列表
· 执行期间使用的意图过滤器的完整列表
· 其他通常不那么重要的东西,比如使用的图标等。
我们首先注意到的就是完全随机的字符串组成了该应用程序所有组件的名称。这是一种恶意意图的标识,但合法的应用开发人员也会使用它来使竞争对手更难以对其产品进行逆向工程。
接着引起我们注意的一件事是:除了应用类com.asgradc.troernrn之外,yeSACsSs文件中没有声明Android组件(活动、接收方和服务类)。这样很奇怪:声明不存在的类并跳过现有的类有什么用呢?
现在很明显的一个事实是,这个APK加载了额外的外部代码。此外,考虑到请求的权限的数量和性质(比如请求发送SMS消息),我们可以相当肯定这段代码没有任何用处。

图3:AndroidManifest SMS过滤器
逆向脱壳工具
有许多免费工具可将APK反编译成可读代码,包括:
· Apktool:获取类的SMALI表示
· dex2jar:将.dex文件转换为jar存档,可以使用jd-gui进行分析
· jadx:将java中的所有代码反编译成方便的GUI
我个人最喜欢用的是jadx,但多些选择也不错,因为在极少数情况下,只有部分工具能够反编译代码。
所以我们接下来开始分析jadx上的APK。然而,事情并不如我想象中那么顺利……

图4:脱壳工具的应用程序类
在真正的脱壳过程中,我们遇到了许多无用的垃圾信息:无意义的字符串、无意义的计算、无意义的函数。我们花了一段时间来尝试理解执行流程:如果加密文件要解密,那么它要么需要调用某个加密库,要么拥有自己的解密例程。一旦解密完成,就需要使用某种类加载器对象加载新文件。
不幸的是,APK导入文件中没有包含这些库。APK中包含的内容是允许文件间接调用任何已加载库的Reflection方法。然而,再一次,这些反射方法参数也是使用无数无法理解的函数动态创建的。
很明显静态分析不能解决这个问题。我们必须转而找寻新方法了。
动态分析
谷歌有提供所有Android版本中sdk下载,可以通过Android Studio创建模拟器。这是一种测试恶意软件的完美方式,不会有被感染的风险。
因此,我们首先使用Marshmallow 6.0模拟器获取此示例并通过adb(Android Debug Bridge)安装了APK。如果APK要加载新的可执行文件,设备的内置记录器(在我们的例子中是模拟器)应该能够获取到。
我们运行了连接到系统记录器的adb命令,并且只选择了包含我们的dropper包名的那些行:
$ adb logcat | grep "com.jgnxmcj.knreroaxvi"
然后我们启动了应用程序。在很多杂乱的输出中,我们终于找到了我们一直在寻找的东西:
 10-25 17:12:11.001 24358 24358 W dex2oat : /system/bin/dex2oat --runtime-arg -classpath --runtime-arg  --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.jar --oat-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.dex
APK确实创建了一个新的.dex文件。很好,我们只需要获取此文件,就不需要逆转dropper了。
但问题又来了,当我们尝试抓取该文件时,我们无法在/data/user/0/com.jgnxmcj.knreroaxvi/app_files中找到它。显然许多恶意软件编码器的创作者通常会在使用后清理了它们。所以我们面临的下一个问题是,如何阻止dropper删除文件?
让我向您介绍这个完美工具:FRIDA。 FortiGuard实验室最近遇到了很多加壳Android恶意软件。这类恶意软件一个很有趣的点是,尽管使用的加壳工具是一样的,但生成的恶意软件却常常会发生变化。
分析加壳工具通常令人望而生畏。因为不光分析流程很难理解,并且分析过程中往往也伴随着大量的垃圾信息。
正因为如此,我们想分享我们在处理分析这类恶意软件时出现的一些问题。并且这篇文章也将演示如何使用开源免费工具解压当今最常见的dropper部署的恶意软件。
参考样本是:509aa4a846c6cb52e9756a282de67da3e8ec82769bceafa1265428b1289459b3

本文来自无奈人生安全网


静态分析
样本概述
首先,看看我们正在处理的APK。

图1:APK中包含的文件 www.wnhack.com
这个样本显然就比较可疑,比如MawmjulbcbEndsqku ^ nd.cml文件是个什么鬼?
我们先从bash命令开刀,看看能不能处理这个文件,然而并没有检测到任何文件类型。接着我们再试图通过hex editor去打开文件(但我们实际上使用了radare2,它是一个很好用的开源逆向工程框架),不过最后还是无法确定此文件的类型。

图2:hex视图下的MawmjulbcbEndsqku ^ nd.cml

本文来自无奈人生安全网


列的内容和名称看起来像是随机字符,这可能是主应用程序使用的加密文件。
也许通过Android Manifest,我们才能获得我们想得到的信息。
Android Manifest
AndroidManifest.xml是一个Android二进制XML文件,其中包含有关该应用程序的大量信息,包括:
· 应用程序的软件包名称,可以在设备上访问 无奈人生安全网
· 应用程序使用的活动、服务和接收器的完整列表(如果未在此处声明,以后将无法使用它们)
· 完整的权限列表
· 执行期间使用的意图过滤器的完整列表
· 其他通常不那么重要的东西,比如使用的图标等。
我们首先注意到的就是完全随机的字符串组成了该应用程序所有组件的名称。这是一种恶意意图的标识,但合法的应用开发人员也会使用它来使竞争对手更难以对其产品进行逆向工程。

copyright 无奈人生


接着引起我们注意的一件事是:除了应用类com.asgradc.troernrn之外,yeSACsSs文件中没有声明Android组件(活动、接收方和服务类)。这样很奇怪:声明不存在的类并跳过现有的类有什么用呢?
现在很明显的一个事实是,这个APK加载了额外的外部代码。此外,考虑到请求的权限的数量和性质(比如请求发送SMS消息),我们可以相当肯定这段代码没有任何用处。

图3:AndroidManifest SMS过滤器
本文来自无奈人生安全网

逆向脱壳工具
有许多免费工具可将APK反编译成可读代码,包括:
· Apktool:获取类的SMALI表示
· dex2jar:将.dex文件转换为jar存档,可以使用jd-gui进行分析
· jadx:将java中的所有代码反编译成方便的GUI

无奈人生安全网


我个人最喜欢用的是jadx,但多些选择也不错,因为在极少数情况下,只有部分工具能够反编译代码。
所以我们接下来开始分析jadx上的APK。然而,事情并不如我想象中那么顺利……

图4:脱壳工具的应用程序类

无奈人生安全网


在真正的脱壳过程中,我们遇到了许多无用的垃圾信息:无意义的字符串、无意义的计算、无意义的函数。我们花了一段时间来尝试理解执行流程:如果加密文件要解密,那么它要么需要调用某个加密库,要么拥有自己的解密例程。一旦解密完成,就需要使用某种类加载器对象加载新文件。
不幸的是,APK导入文件中没有包含这些库。APK中包含的内容是允许文件间接调用任何已加载库的Reflection方法。然而,再一次,这些反射方法参数也是使用无数无法理解的函数动态创建的。
很明显静态分析不能解决这个问题。我们必须转而找寻新方法了。 无奈人生安全网
动态分析
谷歌有提供所有Android版本中sdk下载,可以通过Android Studio创建模拟器。这是一种测试恶意软件的完美方式,不会有被感染的风险。
因此,我们首先使用Marshmallow 6.0模拟器获取此示例并通过adb(Android Debug Bridge)安装了APK。如果APK要加载新的可执行文件,设备的内置记录器(在我们的例子中是模拟器)应该能够获取到。
我们运行了连接到系统记录器的adb命令,并且只选择了包含我们的dropper包名的那些行: 无奈人生安全网
$ adb logcat | grep "com.jgnxmcj.knreroaxvi"
然后我们启动了应用程序。在很多杂乱的输出中,我们终于找到了我们一直在寻找的东西:
 10-25 17:12:11.001 24358 24358 W dex2oat : /system/bin/dex2oat --runtime-arg -classpath --runtime-arg  --instruction-set=x86 --instruction-set-features=smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86 --instruction-set-features=default --dex-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.jar --oat-file=/data/user/0/com.jgnxmcj.knreroaxvi/app_files/rzwohkt.dex

内容来自无奈安全网


APK确实创建了一个新的.dex文件。很好,我们只需要获取此文件,就不需要逆转dropper了。
但问题又来了,当我们尝试抓取该文件时,我们无法在/data/user/0/com.jgnxmcj.knreroaxvi/app_files中找到它。显然许多恶意软件编码器的创作者通常会在使用后清理了它们。所以我们面临的下一个问题是,如何阻止dropper删除文件?
让我向您介绍这个完美工具:FRIDA。。 (责任编辑:wnhack)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。