目录
Fart:Android 自动化脱壳技术全解析
一、引言
二、Fart 简介
三、安装准备
(一)环境要求
(二)获取 Fart 代码
四、Fart 工作原理
(一)ART 运行时基础
(二)脱壳原理核心
五、使用步骤
(一)配置项目
(二)选择目标应用
(三)执行脱壳
(四)获取脱壳结果
六、代码示例
(一)DexFile 结构体解析代码示例(基于 Frida)
(二)主动调用方法并提取 CodeItem 代码示例(基于 Frida)
七、总结
在 Android 应用安全领域,应用加固与脱壳技术一直处于不断发展和对抗的状态。Fart 作为一款针对 Android 应用在 ART 环境下的自动化脱壳工具,为安全研究人员、逆向工程师等提供了强大的分析手段。本文将全面介绍 Fart 技术,涵盖安装、原理、使用步骤以及相关代码实现。
Fart 是基于主动调用方式实现的自动化脱壳技术,其核心在于利用 ART 运行时的特性,在应用运行过程中主动触发壳程序对加密代码的解密操作,从而获取原始的未加密代码,实现高效脱壳。
sudo apt-get update
sudo apt-get install openjdk - 11 - jdk
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 的官方代码仓库(如 GitHub)克隆项目代码到本地:
git clone https://github.com/your - repository - url/Fart.git
ART(Android Runtime)是 Android 系统从 Android 5.0 开始采用的运行时环境,它负责加载和执行应用程序的字节码。在 ART 中,应用的代码以 Dex(Dalvik Executable)文件格式存储,而加壳应用会对 Dex 文件进行加密、混淆等处理来保护代码。
Java.perform(function () {
// 加载Fart相关的功能模块
var Fart = Java.use('com.example.fart.Fart');
// 执行脱壳操作,这里假设Fart类有一个startDump方法
Fart.startDump();
});
frida -U -l your - script.js com.tencent.mm
其中,“-U” 表示连接 USB 设备,“-l” 指定加载的 JavaScript 脚本,“com.tencent.mm” 是目标应用的包名。
adb pull /data/data/com.example.app/dumped_dex.dex.
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;
};
});
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 应用安全研究领域发挥其更大的价值。同时,随着技术的不断发展,应用加固与脱壳技术的对抗也将持续,需要不断探索和研究新的方法和技术来应对新的挑战。