【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

简介: 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

文章目录

一、动态加载

二、第一代加壳技术 ( DEX 整体加固 )

三、第二代加壳技术 ( 函数抽取 )

四、第三代加壳技术 ( Java 函数 -> Native 函数 )

五、so 动态库加壳





一、动态加载


动态加载 : 调用 Java 类时 , 使用到的时候 , 才从 DEX 字节码文件中加载对应的字节码类 ;



热修复 , DEX 加壳 , 插件化 , 都必须使用动态加载技术 ;



动态加载 的 Java 类只能完成一般的函数调用 , 如果加载的是一个 Activity 组件类 , 加载的类不具有组件生命周期的特性 , 不能当做正常的组件使用 ;


如果要正常使用 动态加载 的组件类 , 则需要对类加载器修正 , 有 2 22 种修正方法 ;


替换 LoadedApk 的类加载器 : 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )

在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader : 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )





二、第一代加壳技术 ( DEX 整体加固 )


第一代加壳技术 :


DEX 字节码文件整体加密

使用自定义 DexClassLoader 加载 DEX 文件

第一代壳的特征 : 在内存中 , DEX 文件是整体的连续的内存块 , 如果找到了 DEX 文件的起始地址 , 可以很容易将整个 DEX 文件 dump 下来 ;


DEX 脱壳加载方案 :


文件加载 : 通过监控文件访问记录 , 也可以找到 DEX 文件 ;

内存加载 : 内存中的 DEX 文件是完整的 , 也可以从内存中加载 DEX 文件 ;


保护粒度是 DEX 整体文件 ;






三、第二代加壳技术 ( 函数抽取 )


第二代加壳技术 对 DEX 文件整体进行了保护 , 将其中的 关键代码抽取到外部 , DEX 加载到内存中后 , 不是完整的 DEX 文件 , 即使将整个 DEX 文件 DUMP 下来之后 , 其中的一些被抽取出来的关键代码无法看到 , 也就是 DEX 文件中的关键类或方法是空的 ;


第二代壳的特征是 内存中的 DEX 数据不是连续的 ;


DexHunter 工具 可以遍历内存中所有类信息 , 将 DEX 完整的拼接出来 , 得到一个完整的 DEX 类 ;



保护的粒度由 DEX 细化为每个函数 ; 破解者可以将 DEX 文件拿到 , 但是其中的关键函数是空的 ;






四、第三代加壳技术 ( Java 函数 -> Native 函数 )


第三代加壳技术 : 将 Java 函数转为 Native 函数 ;


VMP 加壳

Dex2C / Java2C

该类型的加壳保护效果是最强的 , 多数加固厂商的此类加壳都是需要付费的 ;






五、so 动态库加壳


so 动态库加壳 :


基于 init , init_array , JNI_Onload 函数进行加壳 ;

基于 自定义 linker 进行加壳 ;


目录
相关文章
|
10月前
|
Java Android开发
|
10月前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
200 0
|
7月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
114 1
|
10月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
8月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
85 8
|
8月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
133 6
|
9月前
|
安全 Android开发 C++
在 Android 中使用 Kotlin 调用动态库
在 Android 中使用 Kotlin 调用动态库
477 0
|
SQL 人工智能 Java
Android 命令行工具简介
Android SDK 中包含了开发应用所需的多个软件包。本页列出了可供使用的最重要的命令行工具(按提供这些工具的软件包整理)。
|
10月前
|
Android开发
Android构建系统:Android.mk(2)函数详解
Android构建系统:Android.mk(2)函数详解
119 1
|
10月前
|
存储 编解码 API
Android Media Framework(一)OpenMAX 框架简介
OpenMAX IL是Khronos Group为嵌入式和移动设备设计的低层级接口,用于统一调用音频、视频和图像编解码器,确保跨平台兼容性。它包括Core API(管理组件加载和方法调用)和Component API(组件实现,如源、接收器、编解码器等)。组件通过端口进行数据交互,客户端使用Core API加载和控制组件。Android引入OMX IL以支持不同芯片上的编解码器。组件状态包括Loaded、Idle、Executing和Invalid。组件架构涉及参数配置、命令处理和缓冲区管理,数据交换通过回调函数完成,端口持有预分配或组件自分配的缓冲区。
176 0

热门文章

最新文章