目录
(一)DexFile 结构体解析代码示例(基于 Frida)
(二)主动调用方法并提取 CodeItem 代码示例(基于 Frida)
一、引言
在 Android 应用安全领域,应用加固与脱壳技术一直处于不断发展和对抗的状态。Fart 作为一款针对 Android 应用在 ART 环境下的自动化脱壳工具,为安全研究人员、逆向工程师等提供了强大的分析手段。本文将全面介绍 Fart 技术,涵盖安装、原理、使用步骤以及相关代码实现。
二、Fart 简介
Fart 是基于主动调用方式实现的自动化脱壳技术,其核心在于利用 ART 运行时的特性,在应用运行过程中主动触发壳程序对加密代码的解密操作,从而获取原始的未加密代码,实现高效脱壳。
三、安装准备
(一)环境要求
- 操作系统:推荐使用 Linux 系统,如 Ubuntu,当然 Windows 系统通过 WSL(Windows Subsystem for Linux)也能进行相关操作。
- Android 设备或模拟器:需要有一个可运行的 Android 环境,用于测试和脱壳目标应用。确保设备已开启开发者选项,并允许 USB 调试。
- Java 环境:安装 Java Development Kit(JDK),Fart 相关的开发和运行依赖 Java 环境。可以通过以下命令在 Ubuntu 系统中安装 OpenJDK:
sudo apt-get update
sudo apt-get install openjdk - 11 - jdk
- 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 文件进行加密、混淆等处理来保护代码。
(二)脱壳原理核心
- DexFile 结构体解析:Fart 首先在内存中定位 DexFile 结构体,该结构体包含了 Dex 文件的各种元数据和指向实际字节码数据的指针。通过对 DexFile 结构体的分析,Fart 能够找到加壳应用在内存中的 Dex 文件位置。
- 主动调用触发解密:Fart 通过主动调用应用中的方法,促使壳程序对被加密的方法代码进行解密,因为在方法执行前,壳程序需要将加密的指令解密为 ART 能够执行的形式。
- CodeItem 提取与修复:在方法解密执行时,Fart 会捕获并提取方法对应的 CodeItem(包含方法的实际执行代码)。对于采用指令抽取技术的加壳应用,Fart 会将提取到的 CodeItem 还原到 Dex 文件的正确位置,修复被抽取的指令,从而得到完整的未加密 Dex 文件。
五、使用步骤
(一)配置项目
- 进入克隆下来的 Fart 项目目录,根据项目的 README 文件进行相关配置,例如可能需要配置一些依赖库的路径等。
- 如果使用的是 Frida 版本的 Fart,确保 Frida 环境配置正确,Frida Server 在 Android 设备上正常运行。
(二)选择目标应用
- 确定需要脱壳的 Android 应用,可以通过应用包名来指定。例如,要脱壳微信应用,其包名可能是 “com.tencent.mm”。
- 将目标应用安装到 Android 设备或模拟器上。
(三)执行脱壳
- 根据 Fart 的使用方式,编写相应的启动脚本或命令。如果是基于 Frida 的脱壳,可能会编写一个 JavaScript 脚本,如下所示:
Java.perform(function () {
// 加载Fart相关的功能模块
var Fart = Java.use('com.example.fart.Fart');
// 执行脱壳操作,这里假设Fart类有一个startDump方法
Fart.startDump();
});
- 使用 Frida 命令启动脱壳脚本,例如:
frida -U -l your - script.js com.tencent.mm
其中,“-U” 表示连接 USB 设备,“-l” 指定加载的 JavaScript 脚本,“com.tencent.mm” 是目标应用的包名。
(四)获取脱壳结果
- 脱壳完成后,Fart 会将脱壳后的 Dex 文件保存到指定位置,通常在 Android 设备的内部存储或项目指定的目录中。
- 使用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 应用安全研究领域发挥其更大的价值。同时,随着技术的不断发展,应用加固与脱壳技术的对抗也将持续,需要不断探索和研究新的方法和技术来应对新的挑战。
标签:脱壳,DexFile,Fart,var,Frida,Android From: https://blog.csdn.net/m0_57836225/article/details/145269771