文章目录
前言
一、Dalvik 下的函数指令抽取与恢复
二、dex 函数指令恢复时机点
1、dex 函数指令恢复
2、Android 源码中搜索 dexFindClass 函数
3、类加载流程 : 加载、链接、初始化
前言
函数抽取 加壳 , 是 二代壳 技术 ;
一、Dalvik 下的函数指令抽取与恢复
函数指令 抽取 : 进行函数抽取加壳 , 首先要熟悉 dex 文件的结构 , 需要定位 dex 字节码文件中 , 函数指令 的偏移地址 ; 将 dex 文件中的函数指令 , 先抽取出来 ;
参考博客 : Android中实现「类方法指令抽取方式」加固方案原理解析 , 作者 姜维 , 同时也是《Android应用安全防护和逆向分析》 作者 ;
函数指令恢复 : 可以选择在 下面的 2 22 个时间点 , 恢复函数指令 ;
类加载之前恢复 : 在类加载到内存之前 , 将之前抽取出来的指令 恢复 回去 ; ( 比较简单 ) ;
参考博客 : Android中实现「类方法指令抽取方式」加固方案原理解析 , 作者 姜维 , 同时也是《Android应用安全防护和逆向分析》 作者 ;
运行时恢复 : 函数运行时 , 通过 HOOK 修改运行时的函数的指令逻辑 ;
参考博客 : Android免Root权限通过Hook系统函数修改程序运行时内存指令逻辑 , 作者 姜维 , 同时也是《Android应用安全防护和逆向分析》 作者 ;
推荐的 HOOK 框架 : https://github.com/ele7enxxh/Android-Inline-Hook , 注意该框架只支持 32 3232 位模式 ;
二、dex 函数指令恢复时机点
1、dex 函数指令恢复
将 dex 中的函数指令 , 抽取出来后 , 还要在合适的时机 , 将抽取出来的函数指令恢复回去 ;
如果要针对 函数 抽取 加壳 的 应用 , 进行 脱壳 , 需要 找准 函数指令 恢复的时机点 ;
在 《Android中实现「类方法指令抽取方式」加固方案原理解析 | 作者 : 姜维》 博客中 , 选择的指令还原的时机是 native 层的 dexFindClass 时 ;
( 图片来自 《Android中实现「类方法指令抽取方式」加固方案原理解析 | 作者 : 姜维》 博客 )
2、Android 源码中搜索 dexFindClass 函数
在 Android 源码路径中 , 搜索上述 dexFindClass 函数 ;
进入 http://androidxref.com/4.4.4_r1 页面 , 搜索 dexFindClass 函数 , 该函数定义在 dalvik/libdex/DexFile.cpp#dexFindClass 中 ;
3、类加载流程 : 加载、链接、初始化
这里在回顾下之前的 类加载 流程 博客 : 【Java 虚拟机原理】Java 类加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 ) , 类加载的过程涉及到 加载 , 链接 , 初始化 操作 ;
在上述类加载流程中 , 有很多时机点可以选择 ;