Android 脱壳实战:Frida 脚本 Hook dlopen,在内存中 dump 出被加固的 DEX 文件

标签:#AndroidReverse #Frida #脱壳 #MobileSecurity #Hook #DEX

⚠️ 免责声明:本文仅供技术研究与安全防御教学使用。请勿将相关技术用于非法破解、制作外挂或破坏商业软件,否则后果自负。


📉 前言:脱壳的核心原理——“落地为安”

静态分析(Static Analysis)面对加固 APP 是无力的,因为 DEX 是加密存储的。
但动态运行(Dynamic Runtime)不会撒谎。

当 APP 启动时,加固壳的逻辑通常如下:

  1. 加载壳的 SO:通过System.loadLibrary加载壳的 Native 代码。
  2. 解密 DEX:在 Native 层解密出原始 DEX 数据。
  3. 加载 DEX:调用系统函数(如OpenCommon,OpenMemory,DefineClass)将 DEX 放入内存,准备执行。

我们的战术很简单:守株待兔
我们不需要知道它怎么解密的,我们只需要 Hook 住加载 DEX的那个系统函数,把它的参数(DEX 内存地址)拿出来,写入文件。

脱壳攻击路径 (Mermaid):

壳的内部逻辑

1. Hook dlopen
2. 监听 libart.so

Yes

4. 触发 Hook

APP 启动

System.loadLibrary (加载壳)

Frida 注入

libart.so 加载了吗?

3. Hook OpenMemory/OpenCommon

解密 DEX 算法

内存中的 DEX (明文)

调用 ART 函数加载

5. Dump to File (.dex)

🛠️ 一、 寻找切入点:为什么是 dlopen?

在 Android 中,加载动态链接库(.so)的底层核心函数是dlopen(或android_dlopen_ext)。
加固壳通常会在JNI_OnLoad.init_array中尽早执行解密逻辑。

如果我们直接 Hooklibart.so里的OpenMemory,可能会因为libart.so还没加载或者是壳还没跑起来而失败。
Hookdlopen的目的是为了寻找“时机”

  1. 确保libart.so已经加载,所有的 ART 运行时函数地址都能找到了。
  2. 或者监听壳自己的 SO (libjiagu.so,libbangcle.so) 何时加载,以此作为开始 Dump 的信号。

💻 二、 实战脚本:Frida 核心代码

我们将编写一个 TypeScript/JavaScript 脚本。

1. 监听 SO 加载 (The Trigger)

首先,我们需要拦截android_dlopen_ext(Android 7.0+ 常用)来感知库的加载。

// hook_dlopen.jsfunctionhook_dlopen(){// 适配不同 Android 版本的 dlopen 函数constdlopen=Module.findExportByName(null,"android_dlopen_ext");if(dlopen){Interceptor.attach(dlopen,{onEnter:function(args){// args[0] 是 so 文件的路径this.path=args[0].readCString();},onLeave:function(retval){if(this.path&&this.path.indexOf("libart.so")>=0){console.log("[+] libart.so loaded! Ready to hook ART functions.");hook_art();// libart 加载了,开始 Hook 核心函数}}});}}
2. 核心 Hook:OpenMemory (The Dump)

libart.so中,加载 DEX 的关键函数通常是OpenMemoryOpenCommon。不同的 Android 版本符号名不同(C++ Name Mangling),建议使用Module.enumerateSymbols模糊匹配。

functionhook_art(){constlibart=Process.findModuleByName("libart.so");if(!libart)return;// 遍历符号,寻找包含 OpenMemory 的函数constsymbols=libart.enumerateSymbols();letopenMemoryAddr=null;for(leti=0;i<symbols.length;i++){constname=symbols[i].name;// 模糊匹配 OpenMemory,这是加载内存 DEX 的常用函数if(name.indexOf("OpenMemory")>=0&&name.indexOf("DexFile")>=0){openMemoryAddr=symbols[i].address;console.log("[*] Found OpenMemory: "+name);break;}}if(openMemoryAddr){Interceptor.attach(openMemoryAddr,{onEnter:function(args){// OpenMemory 的参数通常是 (base, size, location, check_checksum, ...)// args[0] 是 DEX 在内存中的起始地址 (const uint8_t* base)// args[1] 是 DEX 的大小 (size_t size) - 有些版本顺序不同,需结合源码确认// ⚠️ 注意:不同 Android 版本参数位置可能不同,这里以常见情况为例// 很多时候 args[0] 是 base 地址constdexBase=args[0];// 简单的 Magic Header 检查 ('dex\n035')// 0x64 0x65 0x78 0x0Aconstmagic=dexBase.readByteArray(4);// 这里应该转换并检查 magic 是否正确console.log("[*] OpenMemory called. Base: "+dexBase);// 在这里我们可能无法直接获取 size,或者 size 很大// 策略:先读取 Header 中的 filesize 字段// DEX Header + 32 字节处是 file_size (4 bytes)constfileSize=dexBase.add(32).readU32();console.log("[*] Dex Size from Header: "+fileSize);// 执行 Dumpdump_dex(dexBase,fileSize);}});}}
3. 写入文件 (The Output)

将内存数据保存到/data/data/包名/下。

functiondump_dex(base,size){constfilename="/data/data/com.example.targetapp/"+size+".dex";constfile=newFile(filename,"wb");if(file){// 从内存读取字节流constbuffer=base.readByteArray(size);file.write(buffer);file.flush();file.close();console.log("[+] DEX Dumped successfully: "+filename);}}// 启动脚本setImmediate(hook_dlopen);

🔎 三、 运行与验证

  1. 启动 Frida Server: 在手机端运行frida-server
  2. 执行攻击:
frida -U -f com.example.targetapp -l hook_dlopen.js --no-pause
  1. 观察日志: 当 APP 启动时,你会看到控制台疯狂输出。
  • [+] libart.so loaded!
  • [*] Found OpenMemory...
  • [+] DEX Dumped successfully...
  1. 提取文件:
adb pull /data/data/com.example.targetapp/123456.dex.

⚠️ 四、 避坑指南:壳的对抗手段

现在的壳也没那么傻,它们有反制措施:

  1. DEX 头部抹除
    壳在加载完 DEX 后,会故意把内存中 DEX 文件的 Header(魔数dex.035)抹成 00,防止你通过搜索 Header 特征来 Dump。
    对策:Dump 出来后,用 010 Editor 手动修复头部,把64 65 78 0A填回去。
  2. 函数抽取 (Code Item Extraction)
    你 Dump 出来的 DEX,里面的 Method 指令全是空的(nop),或者是一个无效的跳转。真正的指令在执行时才通过OnMethodEnter动态恢复。
    对策:这是高阶对抗,需要使用Frida-DexDump(基于内存搜索) 或者定制化的 ART 虚拟机(FART)来进行深度脱壳。
  3. Anti-Frida:
    壳会检测 Frida 的端口、线程名、maps 文件。
    对策:使用魔改版 Frida(去特征),或者使用StrongR-Frida

🎯 总结

通过 HookdlopenOpenMemory,我们绕过了复杂的解密算法,直接在终点站截获了 DEX。
这就是**“降维打击”**。

不管加密算法多牛,数据终究是要给 CPU 跑的。只要它敢在内存里露头,Frida 就能把它揪出来。

Next Step:
你 Dump 出来的 DEX 很可能是“函数抽取”后的残缺版。下一步,你需要学习如何使用FART (Fast Android Runtime)原理,通过主动调用所有函数,强迫壳把指令还原回内存,从而抓取完整的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导师严选2026 TOP8一键生成论文工具:专科生毕业论文必备测评

导师严选2026 TOP8一键生成论文工具&#xff1a;专科生毕业论文必备测评 2026年专科生论文写作工具测评&#xff1a;如何选择真正实用的助手 随着高校对论文质量要求的不断提升&#xff0c;专科生在毕业论文写作过程中面临的挑战也日益增加。从选题构思到文献检索&#xff0c;从…

【无人机通信】无人机 - 电力线宽带同步算法,该算法借助农场现有的电网基础设施,实现经济高效、可扩展的数据采集附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

基于Java的家政行业智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 家政行业智慧管理系统的设计与实现结合了丰富的功能模块和先进的技术框架&#xff0c;旨在为家政企业提供全面的信息化管理解决方案。系统主要包含21个子模块&#xff1a;家政人员、客户、服务项目、薪资记录等&#xff0c;并通过SpringM…

Chet.QuartzNet.UI 分析页重构,数据可视化体验升级!

&#x1f525; Chet.QuartzNet.UI 分析页重构&#xff0c;数据可视化体验升级&#xff01; &#x1f3af; 为什么要重构分析页&#xff1f; 之前的分析页虽然能展示数据&#xff0c;但界面不够直观&#xff0c;数据展示形式单一&#xff0c;用户体验有待提升。为了让开发者能…

Java广播 —如何利用广播做服务发现

通过广播可以在局域网内广播信息&#xff0c;广播接收端通过监听广播信息&#xff0c;可以自动发现局域网内所有的设备/服务信息。 1. 发送广播 在 Java 中通过将 DatagramSocket 设置 setBroadcast(true) 来发送广播。 DatagramSocket socket new DatagramSocket(); socket…

WPF 使用 HLSL #x2B; Clip 实现高亮歌词光照效果

最近在搓一个Lyricify Lite类似物&#xff0c;原本使用渐变画刷实现歌词高亮&#xff0c;但是发现视觉效果与Apple Music相去甚远&#xff1a;单纯使用白色渐变画刷缺乏“高亮”的光照感觉&#xff0c;而Apple Music的歌词高亮则更像是有光线投射在歌词上&#xff0c;形成一种柔…

java controller的DTO如果有内部类,应该注意什么

在Java Controller中使用带有内部类的DTO时&#xff0c;需要注意以下关键点&#xff1a;1. 内部类必须是静态的&#xff08;static&#xff09;// ✅ 正确做法 public class UserDTO {private String name;private Address address;public static class Address { // 必须是st…

Nano Banana AI 绘画创作前端代码(使用claude code编写)

在线 https://chat.xutongbao.top/nextjs/light/nano use clientimport Header from /components/header import {ArrowLeft,Send,RefreshCw,Sparkles,Upload,X,Download,Copy,Check,ImagePlus,Maximize2, } from lucide-react import { useRouter } from next/navigation imp…

WPF 使用 HLSL + Clip 实现高亮歌词光照效果

最近在搓一个Lyricify Lite类似物,原本使用渐变画刷实现歌词高亮,但是发现视觉效果与Apple Music相去甚远:单纯使用白色渐变画刷缺乏“高亮”的光照感觉,而Apple Music的歌词高亮则更像是有光线投射在歌词上,形成…

Redis 协议兼容:编写一个支持 RESP 协议的 KV Server

标签&#xff1a; #Redis #RESP #Go语言 #网络编程 #中间件开发 #Socket&#x1f4dc; 一、 破译 RESP&#xff1a;Redis 的通信语言 RESP 是一个基于文本的协议&#xff0c;极其简单且高效。它主要由 前缀符号 和 CRLF (\r\n) 组成。 客户端发送给服务端的&#xff0c;永远是一…

排它锁与共享锁详解 - 详解

排它锁与共享锁详解 - 详解2026-01-17 20:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

Solidity 开发入门:编写一个“去中心化投票系统”,部署在以太坊测试网

标签&#xff1a; #Web3 #Solidity #Ethereum #SmartContract #Remix #DApp &#x1f310; 前言&#xff1a;DApp 的架构逻辑 在 Web2 中&#xff0c;我们请求的是中心化服务器&#xff1b;在 Web3 中&#xff0c;我们直接与区块链上的智能合约交互。 交互流程图 (Mermaid): …

芒格的多学科知识在投资决策中的作用

芒格的多学科知识在投资决策中的作用 关键词:芒格、多学科知识、投资决策、跨学科思维、投资策略 摘要:本文深入探讨了芒格所倡导的多学科知识在投资决策中的重要作用。从背景介绍出发,阐述了研究目的、预期读者、文档结构及相关术语。详细剖析了多学科知识的核心概念,展示…

Flutter三方库鸿蒙适配深度解析:从架构原理到性能优化实践 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

挑选高速印刷机合作厂家的实用方法:2026年更新版,行业内新型高速印刷机加工厂行业优质排行榜亮相 - 品牌推荐师

随着包装行业对生产效率、印刷精度及智能化需求的持续攀升,高速印刷机已成为印刷企业提升核心竞争力的关键设备。然而,市场上设备型号繁多、技术参数复杂,加工厂家的研发实力、生产规模及服务能力差异显著,采购方如…

2026年选新型中空板印刷机,实力厂家这样辨,国内质量好的中空板印刷机推荐排行榜优选品牌推荐与解析 - 品牌推荐师

在包装材料升级与环保政策驱动下,中空板印刷机已成为物流、食品、医药等行业实现高效印刷、降低综合成本的核心设备。其不仅能保障包装印刷的色彩还原度与生产效率,更通过一体化工艺设计显著改善作业环境,减少人工依…

11.1 机器人“仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟

11.1 “仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟 11.1.1 引言:现实差距的本质与挑战 在机器人研发流程中,基于物理的仿真提供了无风险、高效率且成本可控的测试与训练环境。然而,任何仿真模型都是对物理世界的近似,由此产生的“现实差距”是部署仿真中训练的策略或…

杭州拼多多代运营对比分析:2026年主流服务商优劣一览 - 前沿公社

随着拼多多平台日益成熟,越来越多品牌与工厂型卖家开始重视专业的代运营服务,以提升流量获取、转化效率和整体销售表现。目前杭州作为中国电商中心之一,聚集了大量拼多多代运营服务商。面对众多选择,商家如何判断哪…

AI原生应用新革命:RAG技术带来的3大变革

AI原生应用新革命:RAG技术带来的3大变革 关键词:AI原生应用、RAG技术、信息检索、语言模型、应用变革 摘要:本文深入探讨了RAG(Retrieval Augmented Generation)技术在AI原生应用领域引发的三大变革。首先介绍了RAG技术的背景和相关概念,接着详细解释了核心概念及其关系,…