一个安卓样本的逆向分析过程
本文作者:x-encounter (信安之路作者团队成员 & 信安之路病毒分析小组组长)
该 APK 样本是通过国外的下载站进行投放的,伪装成正常的软件并在特定情况下启动后门模块获取用户信息,VT 报读情况如下
免杀效果还是很不错的,貌似只有 ESET 准确的报出了 Spy 类型。
第一次写 Android 相关的分析文章,如有错误,还请各位大佬指教^o^
详细分析
不管怎么说,先在模拟器中跑一下。我用的是夜神模拟器
adb install 目标文件
emmm,可以看到运行之后是一个正常的软件,由于实在看不懂这六亲不认的语言,所以只能从图标中推测,这或许、应该、貌似是一个看视频的 app。接下来进行逆向分析,主要目的是搞明白怎么进行免杀的,通过什么机制触发后门的,触发后门的条件是什么。
使用两个集成工具,jeb 和 jadx,我会在分析的过程中比较两款工具孰优孰劣。另外我个人还喜欢 Android killer 这款集成化的软件,打包调试监控一体化,分析应用软件的首选,分析病毒很容易就出错了所以并没有推荐使用。
载入 jadx,查看目录树
没有被混淆的痕迹,一共有 8 各包,每个包中包含类和其他包,代码量巨大,而且一个一个包的看不现实,有些 downloader 和通信属于该 app 的正常功能,很难区分出哪些是恶意的,简单尝试无果后,把目光转向了 AndroidManifest.xml 文件,AndroidManifest.xml 包含了 app 的配置信息比如请求的权限、注册的 activity、 注册的服务和注册的 receiver。
发现了一些有趣的 receiver,解释一下,Android 中的 receiver 是跟广播机制(BroadcastReceiver)有关的,有系统定义的广播也有用户自定义的广播,类似与 windows 中窗体之间的消息,类比即可理解。有趣的地方在于,receiver 的命名非常随意,而且触发名为 com.Contacts.recev 的自定义广播的条件也很有趣,如果接收到以下三个广播中的一个即可触发:
android.net.conn.CONNECTIVITY_CHANGE 当网络连接变化时会发送该广播
android.intent.action.BOOT_COMPLETED. 当手机开机时会发送该广播
android.intent.action.USER_PRESENT. 当手机解锁时会发送该广播
转到 com.Contacts 类中查看详细代码,先看 MainActivity 中的代码,可以把 MainActivity 理解为 C 程序中的 Main 函数
会将在手机上打开 https://www.youtube.com
网站,并且判断 wifi 和手机网络的连通性,并且设置了时钟,定时触发 recev1、recev2、recev3 三条自定义广播。setRepeating 第二个参数含义是第 1 次运行时要等待的时间,也就是说先会运行 recev1 和 recev3 的回调函数。
转到 recev1 类中的 onReceive 方法,onReceive 其实是触发相应广播后的回调函数,由于函数中出现了太多的字符串操作导致了 jadx 反编译失败
换用 jeb 之后
emmm,不得不说 jeb 也太懒了,直接把字符串操作给忽略了,极度误导分析人员,从 jadx 的 Smali 语法可以看出,执行了 SQL 语句,在数据库中记录了用户的一些数据和状态比如当前时间,网络状态,手机IMEI的值,短信,电话记录,sysinfo,电话号码,SIM 卡的序号,SIM 卡运营商国家,当前的区域,经纬度,获取当前正在运行的应用的名字和状态等等一系列的个人信息,值得一提的是窃取个人信息是用的 Sqlserver 远程数据库,并且还使用了本地 sqlite 数据库保存一些其他信息。
在 Smali 中很明显可以看到 r13 是一个拼接的IP地址
数据库用户、密码和地址我就懒得算了,服务器肯定已经关了……
转到 recev3 类中的 onReceive 方法
主要操纵本地数据库中的数据将其拷贝到 SD 卡中,做一个备份
转到 recev2 类中的 onReceive 方法,还是连接远程 SqlServer 服务器
主要提供了本地文件上传和文件下载的功能
通过 VT 上面的关联图可知
疑似下载了一个 png 文件,该 png 文件解密之后很有可能是一个 jar 模块,用于后续的攻击。
最后转到 recev 类中的 onReceive 方法,一旦接收到上述的三种广播就会执行该函数
重新更新一下远程和本地的数据库
小结
通过在正常的软件中注册广播,并设置时钟来实现恶意代码的执行,在 onReceive 广播回调函数中使用强力混淆,干扰分析人员,并结合远程 Sqlserver 数据库操作实现敏感数据不落地即可实现有效的免杀。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 剑指Offer LeetCode 面试题06. 从尾到头打印链表
- 最详细的docker中安装并配置redis
- 剑指Offer LeetCode 面试题59 - I. 滑动窗口的最大
- 剑指Offer LeetCode 面试题58 - II. 左旋转字符串
- 剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II
- 站在软件工程的角度重新思考面向对象(含高清图谱)
- 剑指Offer LeetCode 面试题57. 和为s的两个数字
- 白嫖Layui树型可折叠,可自定义,可搜索表格的实例
- 剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
- 聊聊dubbo-go的DubboPackage
- 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
- Java虚拟机运行时数据区精华总结
- 剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
- 剑指Offer LeetCode 面试题40. 最小的k个数