马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目次
Fart:Android 主动化脱壳技能全解析
一、引言
二、Fart 简介
三、安装准备
(一)环境要求
(二)获取 Fart 代码
四、Fart 工作原理
(一)ART 运行时底子
(二)脱壳原理核心
五、利用步骤
(一)设置项目
(二)选择目标应用
(三)实验脱壳
(四)获取脱壳结果
六、代码示例
(一)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 -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 应用安全研究领域发挥其更大的价值。同时,随着技能的不断发展,应用加固与脱壳技能的对抗也将持续,需要不断探索和研究新的方法和技能来应对新的寻衅。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |