FART使用场景和流程

xiaoeryu Lv5

本章主要介绍一下什么是FART、为什么要使用FART,以及如何使用FART的问题

FART是一个支持在ART(Android runtime)下使用的脱壳框架,可以用来解决函数抽取壳的问题。支持在Dalvik和ART下运行。

脱壳方式

现在新一代的Android加壳基本都做了函数抽取实现了函数粒度的加壳,我们之前使用的脱壳组件只能从内存中将dex的整体框架dump出来,如果碰到函数抽取壳,dump下来的函数体都是空的。

FART的解决办法是找到函数体的codeItem将其回填进函数体中,有两种思路可以完成这种回填:

  • 被动调用:在执行的过程中等待被动调用,因为运行过程中不一定所有的函数都会被调用,所以会有代码覆盖率低的问题
  • 主动模拟调用:通过构造虚拟调用,让壳误以为app在执行正常的函数调用流程从而达成对dex中所有类函数的虚拟调用。能够覆盖dex中所有的函数,修复更完整。修复的准确度和主动调用链的构造深度有关。

codeItem

我们知道函数的逻辑代码都在codeItem中,所以我们的重点就在于准确的获取函数的codeItem。

这其中的重点在于获取codeItem的长度,它的长度不是固定的跟try_catch指令列表的大小有关。

  • 没有try_catch:codeItem长度 = (ushort registersSize ~ uint insnsSize)共16个字节 + uint insnsSize * 2

    • 在这里就是16 + 10*2 = 36
  • 有try_catch:

    codeItem长度 = 16 + uint insns_size*2 + try_catch长度

手动修复函数抽取dex

FART运行之后我们可以得到dex和bin(codeItem)文件

手动修复有三种办法:

  1. 在GDA中定位到我们要修复的函数(找到函数然后查看其16进制,就能直接定位到函数位置),用定位到的地址在dex中搜索(用010edit打开CTRL+G搜索地址),然后在对应的bin文件中通过搜索找到函数体的codeItem字符串,将codeItem字符串填充到dex文件中。

  2. 在bin文件中找到五元组中的offset值,将值转为16进制在用010打开的dex中搜索地址,然后将codeItem字符串填充过去。

  3. 在bin文件中把要修复的函数的codeItem字符串编码拷贝出来解码,将解码后的codeItem覆盖dex文件中原函数offset位置。

手动修复测试

用FART跑完会dump下来很多的dex文件,可以用命令定位一下函数体在哪个dex中

grep -r "MemoryCache" ./*.txt

用GDA打开找一个被抽取的函数进行测试

在bin文件里面搜索getFunctionName,将这个函数的base64字符串拷贝出来解码

解码

import base64
def decodeContent(content,filepath): #删除缩进(Tab)
    try:
        bytearray_str = base64.b64decode(content)
        binfile=open(filepath,"ab+")
        binfile.write(bytearray_str)
        binfile.close()
    except Exception as e:
        print(e)

    return


if __name__ == '__main__':
    b64content="CAABAAMAAADkIBoAdwAAABICcQBtaAAADANuEHRoAwAMATkBAwARAiEUEgM1Q/3/RgABA24Q/GcAAAoFOAUFANgDAwEo9G4Q+GcAAAwFHAY8Dm4QXmcGAAwGbiANaGUACgU5Be//bhD4ZwAADAVuENtnBwAMBm4QXmcGAAwGbiANaGUACgU5Bd3/IgI4DhoDPDVwIEtoMgBxAG1oAAAMA24QcWgDAAsDbjBQaDIEDAIaAx4FbiBTaDIADAJuEPlnAAAMA24gU2gyAAwCGgMdBW4gU2gyAAwCbhD6ZwAACgNuIE9oMgAMAhoDjzduIFNoMgAMAm4QW2gCAAwCKJU="
    decodeContent(b64content,"checkSize.bin")

把解码后的hex覆盖dex中的偏移位置

覆盖(注意覆盖的字节数不要弄错)

保存后用GDA查看


FART使用流程

FART脱壳和定位dex就前面说过了,不再重复

使用脚本 将dex文件修复一下

python fart.py -d XXX.dex -i xxx.bin>>XXX.txt

  • 标题: FART使用场景和流程
  • 作者: xiaoeryu
  • 创建于 : 2023-10-01 08:46:59
  • 更新于 : 2023-10-02 15:53:20
  • 链接: https://github.com/xiaoeryu/2023/10/01/FART使用场景和流程/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论