首页 > 其他分享 >Fart:Android 自动化脱壳技术全解析

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

时间:2025-01-22 12:57:59浏览次数:3  
标签:脱壳 DexFile Fart var Frida 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 应用安全研究领域发挥其更大的价值。同时,随着技术的不断发展,应用加固与脱壳技术的对抗也将持续,需要不断探索和研究新的方法和技术来应对新的挑战。

标签:脱壳,DexFile,Fart,var,Frida,Android
From: https://blog.csdn.net/m0_57836225/article/details/145269771

相关文章

  • 实现Android键盘自适应
    unitUnit13;interfaceusesSystem.SysUtils,System.Types,System.UITypes,System.Classes,System.Variants,FMX.Types,FMX.Controls,FMX.Forms,FMX.Graphics,FMX.Dialogs,FMX.Controls.Presentation,FMX.Edit,Androidapi.Helpers,Androidapi.JNI.Graph......
  • Android Systrace 基础知识 - Triple Buffer 解读
    怎么定义掉帧?Systrace中可以看到应用的掉帧情况,我们经常看到说主线程超过16.6ms就会掉帧,其实不然,这和我们这一篇文章讲到的TripleBuffer和一定的关系,一般来说,Systrace中我们从App端和SurfaceFlinger端一起来判断掉帧情况App端判断掉帧如果之前没有看过Systrace......
  • Android studio开发实战之碎片Fragment
        一、碎片化的概念        碎片化(Fragment)是Android应用开发中的一个重要概念,它的设计初衷是增强界面模块化,便于开发者灵活构建和管理复杂的界面。什么是模块化?将应用界面拆分成多个可复用的小模块(Fragment),每个模块可以独立定义自己的布局、逻辑和交互......
  • 运维系列&安卓系列【仅供参考】:fastutil-7.2.0.jar下载依赖包超时问题,Android
    fastutil-7.2.0.jar下载依赖包超时问题,Androidfastutil-7.2.0.jar下载依赖包超时问题,Android摘要正文fastutil-7.2.0.jar下载依赖包超时问题,Android摘要文章介绍了在下载FastUtil-7.2.0.jar时遇到的网络问题,提出解决方案是使用阿里云的国内镜像,并给出了G......
  • 运维系列&安卓系列【仅供参考】:android studio 3.1 升级gradle4.4时所踩到的坑
    androidstudio3.1升级gradle4.4时所踩到的坑androidstudio3.1升级gradle4.4时所踩到的坑androidstudio3.1升级gradle4.4时所踩到的坑公司原项目是使用Androidstudio2.3编译的,最近将Androidstudio升级到3.1后,buildapk时提示:Theprojectisusing......
  • Android JecPack组件之LifeCycles 使用详解
    一、背景LifeCycle是一个可以感知宿主生命周期变化的组件。常见的宿主包括Activity/Fragment、Service和Application。LifeCycle会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。LifeCycle的出现主要是为了解决:系统组件的生命周期与......
  • AndroidStudio:GPS定位与网络定位定位服务
    前言:如今主流的定位方式有两种:GPS定位和网络定位。GPS即通过卫星定位,网络定位则需要通过手机附近的基站,WIFI等确定位置信息。二者的优缺点各有不同,Gps较为精准但是耗电量大,网络定位功耗小但是不精确。这篇文章会以LocationManager为例,讲解如何在Androidstudio中使用这两种定位......
  • Android系统开发(十):标准协议和通讯的桥梁:探索蓝牙、NFC、WLAN 的工作原理
    引言:现代社会已经是信息互联的世界,各种设备之间的互联互通已经成为了生活的一部分。而在这个过程中,Android设备与其他硬件之间的通信扮演着至关重要的角色。从蓝牙耳机到WiFi路由器,甚至与电话功能的互动,所有这些连接都依赖于标准Android连接协议的支持。本篇文章将带......
  • Android程序导入unity工程
    用到的软件1.AndroidStudio2.Unity3D1.AndroidStudio生成Arr包1.1Android中所有的Activity都必须继承Activity类,不能继承默AppCompatActivity1.2修改Res文件下的styles修改前修改后1.3将applyplugin:'com.android.application'改成applyplugin:'com.androi......
  • 用Python检查Android字符串文件通配符
    #!/usr/bin/envpython3importosimportsysfromdatetimeimportdatetime,timedeltaimportreimportxml.etree.ElementTreeasETiflen(sys.argv)<3:exit()print(datetime.now(),'start')timestamp=int(datetime.now().timestamp())en_t......