扒一扒针对东亚的新型恶意软件 FLUHORSE( 三 )


启动恶意软件分析的一个好方法是确定与 C&C 服务器的通信协议 。这可以说明很多恶意功能 。里面有一个字符串 , 对应于我们在钓鱼电子邮件中看到的网站:
 

扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
恶意 APK 中字符串中 C&C 服务器的地址 
然而 , 当我们试图找到对此字符串的一些引用时 , 分析失败:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
IDA 中没有对 C&C 服务器字符串的引用 
我们的目标是创建对该字符串的引用 , 以定位执行 C&C 通信的代码 。
Flutter -re-demo 和 reFlutter 可以用来处理 Flutter 应用程序 , 其主要思想是使用运行时快照来创建 Dart 对象并查找对它们的引用 。reFlutter 的主要目的是收集函数的名称 , 而 flutter re-demo 允许我们处理在应用程序执行期间收集的内存转储 。
然而 , 除了内存快照之外 , 还需要一些更多的运行时信息 。Flutter 运行时使用堆来创建对象 , 并将指向已创建对象的指针存储在一个称为对象池的特殊区域中 。指向该池的指针被传递到寄存器 X27 中的方法 。我们需要找到对象池的位置 。
flutter-re-demo 使用 Frida 收集内存转储并获取对象池地址 。如果我们使用在 flutter-re-demo 存储库中可用的 dump_flutter_memory.js 脚本运行 APK , 我们会看到所需的地址:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
带有所需地址的 Frida 脚本输出 
现在我们已经拥有了开始一个高效的逆向工程所需的所有元素 。
在用 map_dart_vm_memory.py 加载转储文件并运行 create_dart_objects.py 脚本后 , 我们现在至少可以看到一些对象:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
脚本创建的对象 
有一个名为 create_dart_objects.py 的脚本 , 用于创建 dart 对象 。该脚本通过遍历对象池、解析记录和创建对象来工作 。脚本没有关于这些对象的信息 , 脚本会为它们创建以下描述对象格式的结构:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
这里的 NNN 被 "class id" 取代 , 如下所示: 
由 create_dart_objects.py 创建的结构
在 Flutter 应用程序逆向工程时 , 研究人员注意到最后一个字段(unk)经常被用作指针 。可以考虑将该字段从简单的 Qword 转换为 OFFSET QWORD 。这可能会给带来一些误报 , 但也可能非常有助于创建参考 。因此 , 我们决定更改由脚本创建的 unkin 结构的字段类型 。以下是对原始脚本的更改:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
对 dart_obj_create.py 脚本的更改 
研究人员提到的存储库包含一个用于创建对 Dart 对象引用的脚本:add_xref_to_art_objects.py 。当运行它时 , 该脚本会遍历代码并创建对 create_Dart_objects.py 脚本创建的 Dart 对象的引用 。不过此时仍然只有一个对我们感兴趣的字符串的引用 , 即来自对象池的引用:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
没有对 C&C 服务器 URL 的引用 
我们的第一个想法是 , 也许根本没有交叉引用?不过这不可能 , 存在几个交叉引用 , 例如 , 这个对象就具有引用:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE

文章插图
几个从函数到对象的引用 
这是从函数中引用的对象:
引用在函数代码中的外观
通过浏览 add_xref_to_dart_objects.py 的代码 , 我们可以看到文件 dart_obj_xref.py 。该文件还遍历代码 , 尝试根据寄存器 X27 提取对数据的引用 , 计算这些引用的偏移量 , 最后创建 IDA 引用 。对代码的分析表明 , 原始脚本支持访问该对象的两种 ARM 代码变体:
代码是否使用了一些其他指令来引用寄存器 X27?让我们检查一下 。为了方便起见 , 让我们修改脚本 , 并为用 X27 处理的每条指令添加一条注释:
 
扒一扒针对东亚的新型恶意软件 FLUHORSE


推荐阅读