当前位置: 首页 > article >正文

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析

1.1 DEX保护演进路线

加固方案发展历程

graph LR  A[2015 代码混淆] --> B[2017 DEX动态加载]  B --> C[2019 VMP指令虚拟化]  C --> D[2022 全链路加密]  
1.1.1 主流加固方案对比
厂商核心防护技术弱点分析
梆梆加固DEX文件分片加载 + 内存校验Hook类加载器可捕获
腾讯乐固指令抽取 + 自定义DexFile结构内存Dump时机敏感
阿里聚安全SO层加密壳 + 动态解释执行解释器入口易定位

2. 动态加载脱壳技术

2.1 类加载监控体系

DexClassLoader监控方案

// 自定义ClassLoader监控  
public class SpyClassLoader extends ClassLoader {  protected Class<?> findClass(String name) {  byte[] bytecode = loadDynamicData(name);  dumpToFile(bytecode);  // 关键脱壳点  return defineClass(name, bytecode, 0, bytecode.length);  }  
}  

Frida Hook实现

const DexFile = Java.use('dalvik.system.DexFile');  
DexFile.loadDex.overload('java.lang.String', 'java.lang.String', 'int').implementation = function(src, dest, flags) {  const result = this.loadDex(src, dest, flags);  const entries = result.entries();  while (entries.hasMoreElements()) {  const dexFile = entries.nextElement().value;  dump(dexFile.getBytes());  // 内存Dump  }  return result;  
};  

3. 内存Dump高阶技巧

3.1 定时扫描策略

内存特征定位算法

def find_dex_in_memory(process):  MAGIC = b'dex\n035\0'  regions = process.maps()  for r in regions:  if 'rw' in r.permissions:  data = process.read(r.start, r.size)  offset = data.find(MAGIC)  if offset != -1:  return r.start + offset  return None  

3.2 主动触发机制

反射调用关键方法

Java.perform(() => {  const ActivityThread = Java.use('android.app.ActivityThread');  const app = ActivityThread.currentApplication();  app.getPackageManager().getPackageInfo(app.getPackageName(), 0x00000040);  // 触发解密  
});  

4. DEX重组与修复

4.1 文件头修复技术

DexHeader修复脚本

def fix_dex_header(dex_bytes):  header = dex_bytes[:0x70]  checksum = zlib.adler32(dex_bytes[12:])  header = header[:8] + checksum.to_bytes(4, 'little') + header[12:]  return header + dex_bytes[0x70:]  

4.2 索引表重建方案

TypeList重组算法

typedef struct {  uint type_idx;  
} TypeItem;  void rebuild_typelist(FILE* dex) {  TypeItem* items = parse_typelist(dex);  qsort(items, count, sizeof(TypeItem), compare_types);  write_segment(dex, items);  
}  

5. 反脱壳对抗技术

5.1 内存校验机制

MOV X0, #0x400000   // 代码段基址  
MOV X1, #0x20000    // 代码段长度  
BL  calculate_crc  
CMP X0, #0x12345678  
BNE anti_debug_handler  

对抗方案

Interceptor.attach(Module.findExportByName('libc.so', 'memcmp'), {  onEnter: function(args) {  this.expected = args[2].readCString();  if (this.expected.includes("dex")) {  args[2].writeUtf8String("");  // 篡改校验值  }  }  
});  

5.2 动态代码混淆

指令随机化技术

// 原始指令  
ADD X0, X1, X2  // 混淆后  
SUB X3, XZR, X2  
ADD X0, X1, X3  

6. 企业级脱壳框架

6.1 自动化脱壳系统架构

graph TD  A[目标APP] --> B{动态加载监控}  B --> C[内存Dump模块]  C --> D[文件修复引擎]  D --> E[反混淆处理器]  E --> F[可分析DEX]  

6.2 智能调度核心代码

class UnpackScheduler:  def __init__(self, pkg):  self.device = AndroidDevice(pkg)  self.hooks = [DexLoadHook, MemoryScanHook]  def run(self):  self.device.inject_frida_agent()  for hook in self.hooks:  hook.attach()  while not self.check_complete():  self.trigger_decrypt()  time.sleep(0.5)  return self.collect_results()  

7. 实战:某金融APP脱壳

7.1 脱壳流程

  1. 环境准备

    • 关闭SELinux:adb shell setenforce 0

    • 注入调试器:frida -U -f com.bank.app

  2. 关键点定位

    // 监控DexFile加载  
    Dalvik.vm.getLoadedClasses().forEach(c => {  if (c.getName().startsWith("com.sec.")) {  dumpClass(c);  }  
    });  
  3. 内存捕获

    python3 memdump.py -p com.bank.app -o dumped.dex  
  4. 文件修复

    ./dexfixer -i dumped.dex -o fixed.dex  

7.2 结果验证

反编译验证

jadx --deobf fixed.dex -d output  
grep -rn "decryptData" output/  # 确认关键方法  

8. 防护方案进阶

8.1 碎片化加载技术

DEX分片方案

public class PartLoader {  private Map<Integer, byte[]> parts = new HashMap<>();  public void load(int index, byte[] data) {  parts.put(index, decrypt(data));  if (parts.size() == 5) {  rebuildDex();  }  }  
}  

8.2 硬件级保护

TEE环境运用

void secure_decrypt(void* input, size_t len) {  tee_session = teec_open_session(&ctx, &uuid);  teec_invoke_command(  tee_session,  CMD_DECRYPT,  &op,  &ret_origin  );  
}  

技术验证清单

  • 成功捕获动态加载的DEX文件

  • 实现DEX文件头修复

  • 绕过内存校验机制

  • 构建自动化脱壳系统

  • 完成企业级APP脱壳实战

本章实验需在已获得授权的设备上进行,建议使用开源加固测试包(如DexProtector试用版)作为训练目标。所有技术细节已做脱敏处理,禁止用于非法场景。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

 

相关文章:

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程&#xff1a; graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…...

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…...

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…...

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…...

Kafka的流量控制机制

Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统&#xff0c;能够在海量数据场景下提供稳定的消息生产和消费能力&#xff0c;其背后的流量控制机制功不可没。我们需要认识到&#xff0c;Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃&#xff0c;它的目标是实…...

RabbitMQ支持的复杂的消息交换模式

RabbitMQ支持多种复杂的消息交换模式&#xff0c;这些模式通过不同的交换机类型和队列特性实现&#xff0c;能够满足多样化的业务需求。以下是RabbitMQ支持的主要复杂消息交换模式&#xff1a; 1. Direct Exchange&#xff08;直连交换机&#xff09; 直连交换机根据消息的路由…...

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…...

51单片机的工作方式

目录 一、51 单片机的时钟电路及时钟信号 &#xff08;一&#xff09;时钟电路 &#xff08;二&#xff09;时钟信号 二、51 单片机的CPU 时序 &#xff08;一&#xff09;时钟周期​ &#xff08;二&#xff09;机器周期​ &#xff08;三&#xff09;指令周期​ 三、…...

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…...

MrRobot靶机详细解答

一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭&#xff0c;且无其它特殊端口&#xff0c;只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…...

java线性表(单向链表)

对于链表我们有很多种&#xff0c;有带头和不带头&#xff0c;双向和单项&#xff0c;循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表&#xff0c;它可以连续也可以不连续&#xff0c;是链子型的每条链子两边都有节点&#xff08;除首尾)。 单向…...

QT:动态属性和对象树

动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…...

编程语言的几种常见的分类方法

一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态&#xff0c;如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念&#xff0c;支持封装、继承和多态&#xff0c;如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数&#xf…...

算法——层序遍历和中序遍历构造二叉树

晴问 #include <iostream> #include <vector> #include <queue> #include <unordered_map>using namespace std;struct TreeNode {int data;TreeNode *left;TreeNode *right;TreeNode(int data) : data(data), left(nullptr), right(nullptr) {} };//…...

中考英语之06语态(动词语态-简单)

1 主动语态和被动语态 在初中英语中&#xff0c;语态是动词的一种形式&#xff0c;用于说明主语与谓语动词之间的关系&#xff0c;主要有主动语态和被动语态两种。 1.1 主动语态 定义&#xff1a;表示主语是动作的执行者。结构&#xff1a;主语 谓语&#xff08;及物动词&a…...

linux常用基础命令_最新

常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…...

PH热榜 | 2025-03-16

1. BrowserAgent 标语&#xff1a;基于浏览器的人工智能代理 - 无限使用&#xff0c;固定费用 介绍&#xff1a;在您的浏览器中直接创建和运行AI工作流程&#xff0c;无需支付API费用。我们的可视化编辑器不需要编写代码&#xff0c;同时我们的浏览器本地技术支持以固定价格进…...

《论语别裁》第01章 学而(27) 无所适从的礼俗

下面讲做学问的态度。 有子曰&#xff1a;礼之用&#xff0c;和为贵&#xff0c;先王之道&#xff0c;斯为美&#xff0c;小大由之&#xff1b;有所不行&#xff0c;知和而和&#xff0c;不以礼节之&#xff0c;亦不可行也。 为什么讲学问讲到礼&#xff1f;这个礼&#xff0c…...

关于进程的实验(子进程和父进程相关的)

文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序&#xff0c;利用系统调用fork( )创建两个进程。当此程序运行时&#xff0c;在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符&#xff1a;父进程显示字符“a”;子进程分别显…...

《基于视频监控的智能跌倒检测系统》开题报告

一、本课题研究目标 本课题旨在研究并实现一个基于视频监控的智能跌倒检测系统&#xff0c;以有效识别老年人或需特殊照顾人群的跌倒事件&#xff0c;并实现自动报警功能。具体而言&#xff0c;该系统将通过机器学习和深度学习技术&#xff0c;对视频数据中的行为模式进行分析&…...

Flask中的装饰器

在 Flask 中&#xff0c;装饰器&#xff08;Decorator&#xff09;是一种 Python 语法特性&#xff0c;它允许你在不修改原始函数的情况下&#xff0c;扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。 1. Flask 装饰器的基本概念 Python 的装饰器本质上是一…...

MySQL配置文件my.cnf详解

目前使用的服务器系统是CentOS8.5 ,针对MySql8.4的配置示例&#xff0c;自己根据实际情况修改。 安装MySql8.4时&#xff0c;MySql8.4没有默认的my.cnf,需要用户根据需要自行配置my.cnf文件&#xff0c;大概可看到下面这样的参数列表&#xff0c;可能不同版本的mysql参数多少会…...

SonarQube安装及结合IDEA使用详细教程(2025适配版)

一、环境验证与准备 JDK版本确认 PS C:\> java -version openjdk version "17.0.14" 2025-01-21 LTS OpenJDK Runtime Environment Zulu17.5615-CA (build 17.0.147-LTS) OpenJDK 64-Bit Server VM Zulu17.5615-CA (build 17.0.147-LTS)安装路径说明 主程序路径&a…...

2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷

目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 医院在进行网络部分信息化建设方案设计过程中,需要保证医院、血液中心通过社保网进行互连互通,同时满足献血中心与医…...

python列表基础知识

列表 创建列表 1.列表的定义&#xff1a;可变的&#xff0c;有序的数据结构&#xff0c;可以随时添加或者删除其中的元素 2.基本语法&#xff1a;字面量【元素1&#xff0c;元素2&#xff0c;元素3】使用[]创建列表 定义变量&#xff1a;变量名称【元素1&#xff0c;元素2&…...

vue echarts封装使用

echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…...

PTP协议赋能高精度时间同步网络

什么是PTP&#xff1f; PTP&#xff08;精确时间协议&#xff0c;Precision Time Protocol&#xff09; 是一种基于IEEE 1588标准的网络时间同步协议&#xff0c;旨在为分布式系统中的设备提供亚微秒级&#xff08;甚至纳秒级&#xff09;的高精度时钟同步。其核心目标是通过消…...

使用WireShark解密https流量

概述 https协议是在http协议的基础上&#xff0c;使用TLS协议对http数据进行了加密&#xff0c;使得网络通信更加安全。一般情况下&#xff0c;使用WireShark抓取的https流量&#xff0c;数据都是加密的&#xff0c;无法直接查看。但是可以通过以下两种方法&#xff0c;解密抓…...

MIDI,AI 3D场景生成技术

MIDI&#xff08;Multi-Instance Diffusion for Single Image to 3D Scene Generation&#xff09;是先进的3D场景生成技术&#xff0c;能在短时间内将单张图像转化为高保真度的3D场景。通过智能分割输入图像&#xff0c;识别出场景中的独立元素&#xff0c;再基于多实例扩散模…...

三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg

前言 在当今的短视频时代&#xff0c;高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻&#xff0c;还是制作 GIF、去除广告&#xff0c;剪辑都是必不可少的一环。 然而&#xff0c;批量处理大量视频并非易事&#xff0c;常见的挑战…...