Fart:Android 自动化脱壳技术全解析

目录

Fart:Android 自动化脱壳技术全解析

一、引言

二、Fart 简介

三、安装准备

(一)环境要求

(二)获取 Fart 代码

四、Fart 工作原理

(一)ART 运行时基础

(二)脱壳原理核心

五、使用步骤

(一)配置项目

(二)选择目标应用

(三)执行脱壳

(四)获取脱壳结果

六、代码示例

(一)DexFile 结构体解析代码示例(基于 Frida)

(二)主动调用方法并提取 CodeItem 代码示例(基于 Frida)

七、总结


一、引言

在 Android 应用安全领域,应用加固与脱壳技术一直处于不断发展和对抗的状态。Fart 作为一款针对 Android 应用在 ART 环境下的自动化脱壳工具,为安全研究人员、逆向工程师等提供了强大的分析手段。本文将全面介绍 Fart 技术,涵盖安装、原理、使用步骤以及相关代码实现。

二、Fart 简介

Fart 是基于主动调用方式实现的自动化脱壳技术,其核心在于利用 ART 运行时的特性,在应用运行过程中主动触发壳程序对加密代码的解密操作,从而获取原始的未加密代码,实现高效脱壳。

三、安装准备

(一)环境要求

  1. 操作系统:推荐使用 Linux 系统,如 Ubuntu,当然 Windows 系统通过 WSL(Windows Subsystem for Linux)也能进行相关操作。
  1. Android 设备或模拟器:需要有一个可运行的 Android 环境,用于测试和脱壳目标应用。确保设备已开启开发者选项,并允许 USB 调试。
  1. Java 环境:安装 Java Development Kit(JDK),Fart 相关的开发和运行依赖 Java 环境。可以通过以下命令在 Ubuntu 系统中安装 OpenJDK:
sudo apt-get update

sudo apt-get install openjdk - 11 - jdk

  1. Frida:Fart 有 Frida 版本的实现,Frida 是一款动态插桩工具,用于在运行时修改和监控应用程序。可以通过 npm(Node Package Manager)进行安装:
sudo npm install -g frida - client frida - server

安装完成后,需要将 Frida Server 推送到 Android 设备并运行。在 Linux 系统中,可以使用以下命令(假设设备已通过 USB 连接):

adb push frida - server - android - x86_64 /data/local/tmp/

adb shell chmod +x /data/local/tmp/frida - server - android - x86_64

adb shell /data/local/tmp/frida - server - android - x86_64

(二)获取 Fart 代码

可以从 Fart 的官方代码仓库(如 GitHub)克隆项目代码到本地:

git clone https://github.com/your - repository - url/Fart.git

四、Fart 工作原理

(一)ART 运行时基础

ART(Android Runtime)是 Android 系统从 Android 5.0 开始采用的运行时环境,它负责加载和执行应用程序的字节码。在 ART 中,应用的代码以 Dex(Dalvik Executable)文件格式存储,而加壳应用会对 Dex 文件进行加密、混淆等处理来保护代码。

(二)脱壳原理核心

  1. DexFile 结构体解析:Fart 首先在内存中定位 DexFile 结构体,该结构体包含了 Dex 文件的各种元数据和指向实际字节码数据的指针。通过对 DexFile 结构体的分析,Fart 能够找到加壳应用在内存中的 Dex 文件位置。
  1. 主动调用触发解密:Fart 通过主动调用应用中的方法,促使壳程序对被加密的方法代码进行解密,因为在方法执行前,壳程序需要将加密的指令解密为 ART 能够执行的形式。
  1. CodeItem 提取与修复:在方法解密执行时,Fart 会捕获并提取方法对应的 CodeItem(包含方法的实际执行代码)。对于采用指令抽取技术的加壳应用,Fart 会将提取到的 CodeItem 还原到 Dex 文件的正确位置,修复被抽取的指令,从而得到完整的未加密 Dex 文件。

五、使用步骤

(一)配置项目

  1. 进入克隆下来的 Fart 项目目录,根据项目的 README 文件进行相关配置,例如可能需要配置一些依赖库的路径等。
  1. 如果使用的是 Frida 版本的 Fart,确保 Frida 环境配置正确,Frida Server 在 Android 设备上正常运行。

(二)选择目标应用

  1. 确定需要脱壳的 Android 应用,可以通过应用包名来指定。例如,要脱壳微信应用,其包名可能是 “com.tencent.mm”。
  1. 将目标应用安装到 Android 设备或模拟器上。

(三)执行脱壳

  1. 根据 Fart 的使用方式,编写相应的启动脚本或命令。如果是基于 Frida 的脱壳,可能会编写一个 JavaScript 脚本,如下所示:
Java.perform(function () {

// 加载Fart相关的功能模块

var Fart = Java.use('com.example.fart.Fart');

// 执行脱壳操作,这里假设Fart类有一个startDump方法

Fart.startDump();

});

  1. 使用 Frida 命令启动脱壳脚本,例如:
frida -U -l your - script.js com.tencent.mm

其中,“-U” 表示连接 USB 设备,“-l” 指定加载的 JavaScript 脚本,“com.tencent.mm” 是目标应用的包名。

(四)获取脱壳结果

  1. 脱壳完成后,Fart 会将脱壳后的 Dex 文件保存到指定位置,通常在 Android 设备的内部存储或项目指定的目录中。
  1. 使用adb pull命令将脱壳后的 Dex 文件从 Android 设备拉取到本地进行后续分析,例如:
adb pull /data/data/com.example.app/dumped_dex.dex.

六、代码示例

(一)DexFile 结构体解析代码示例(基于 Frida)

Java.perform(function () {

var DexFile = Java.use('dalvik.system.DexFile');

DexFile.openDexFile.implementation = function (sourceName, outputName, flags) {

var result = this.openDexFile(sourceName, outputName, flags);

console.log('DexFile opened:'+ sourceName);

// 获取DexFile对象的内存地址

var dexFileAddress = this.handle.value;

console.log('DexFile address:'+ dexFileAddress.toString(16));

// 这里可以进一步解析DexFile结构体的其他字段

return result;

};

});

(二)主动调用方法并提取 CodeItem 代码示例(基于 Frida)

Java.perform(function () {

var ClassLoader = Java.use('dalvik.system.ClassLoader');

var loadedClasses = ClassLoader.loadedClasses.value;

for (var i = 0; i < loadedClasses.length; i++) {

var className = loadedClasses[i];

try {

var clazz = Java.use(className);

var methods = clazz.class.getDeclaredMethods();

for (var j = 0; j < methods.length; j++) {

var method = methods[j];

try {

// 主动调用方法

method.invoke(clazz);

console.log('Method invoked:'+ method.getName());

// 假设这里有一个函数获取CodeItem地址

var codeItemAddress = getCodeItemAddress(method);

if (codeItemAddress) {

var codeItemSize = 0x100; // 假设CodeItem大小

var codeItemBytes = Memory.readByteArray(ptr(codeItemAddress), codeItemSize);

// 保存CodeItem数据到文件

var file = new File('/data/data/com.example.app/codeitem_' + method.getName() + '.bin', 'wb');

file.write(codeItemBytes);

file.flush();

file.close();

}

} catch (e) {

console.log('Error invoking method:'+ method.getName() +'-'+ e);

}

}

} catch (e) {

console.log('Error using class:'+ className +'-'+ e);

}

}

});

function getCodeItemAddress(method) {

// 这里需要根据ART内部结构和方法的元数据来计算CodeItem的地址

// 实际实现需要深入了解ART,这里仅为示例

return 0;

}

七、总结

Fart 作为一款强大的 Android 自动化脱壳技术,为研究 Android 应用的内部结构、安全漏洞以及进行逆向工程等提供了有力的支持。通过本文介绍的安装、原理、使用步骤和代码示例,希望读者能够对 Fart 有更深入的理解和掌握,在 Android 应用安全研究领域发挥其更大的价值。同时,随着技术的不断发展,应用加固与脱壳技术的对抗也将持续,需要不断探索和研究新的方法和技术来应对新的挑战。

你可能感兴趣的:(java,android,自动化,运维)