加固加壳脱壳分析(3)_实战手动脱壳某家加固
手动脱壳准备
一个加固的Apk文件
frida环境
一台Root手机
手动脱壳准备
本次的脱壳目标就是一个叫每日优先的软件
我在论坛里分析了很久 最后发现这个软件适合用来练手
目标就是脱出完整的dex文件分析源码
整个目录结构
我们用jdax打开
可以看到没有我们要找的目标包和类,所以软件dex被加壳保护起来了。
分析哪家的壳
百度搜索 secneo.apkwrapper
找到了这个加固厂商为梆梆加固
可以通过这个分析加固特点了
核心加固技术:
1.防逆向(Anti-RE) 抽取classes.dex中的所有代码,剥离敏感函数功能,混淆关键逻辑代码,整体文件深度加密加壳,防止通过apktool,dex2jar,JEB等静态工具来查看应用的Java层代码,防止通过IDA,readelf等工具对so里面的逻辑进行分析,保护native代码。
2.防篡改(Anti-tamper) 每个代码文件、资源文件、配置文件都会分配唯一识别指纹,替换任何一个文件,将会导致应用无法运行,存档替换、病毒广告植入、内购破解、功能屏蔽等恶意行为将无法实施。防调试(Anti-debug) 多重加密技术防止代码注入,彻底屏蔽游戏外挂、应用辅助工具,避免钓鱼攻击、交易劫持、数据修改等调试行为。
3.防窃取(Storage Encryption) 支持存储数据加密,提供输入键盘保护、通讯协议加密、内存数据变换、异常进程动态跟踪等安防技术,有效防止针对应用动、静态数据的捕获、劫持和篡改。
编写脱壳脚本
核心思想 就是运行时的dex文件从内存里面dump里下载下来
hook框架选择
我们选择frida来进行hook
hook点研究
通常的hook点都是拦截dex解密加载过程的方式
其实可以选择内存中存放dex文件的位置,也就是内存检索DEX文件
具体参考 https://mp.weixin.qq.com/s/n2XHGhshTmvt2FhxyFfoMA
具体的检索流程
1.遍历当前进程所有可以读的内存段
2.判断所谓的内存段到底是不是dex
3.把文件dump下来
1.检索遍历进程内存
使用函数 Process.enumerateRanges('r--')
枚举读出可以读出的内存区块
这个函数返回一个列表 我们可以遍历这个内存区块列表
找出基址和内存大小
2.过滤内存区块
Memory.scanSync
函数可以加载内存区块传入 基址 大小 第三个参数是 过滤大小
使用正则过滤加载自己需要的大小
比如这个"64 65 78 0a 30 ?? ?? 00" 的意思就是 只加载这个区间的内存 也就是所谓的dex内存地址
3.检索遍历进程内存
开始过滤符合要求的dex
过滤掉系统的dex文件
if (range.file && range.file.path
&& (range.file.path.startsWith("/data/dalvik-cache/") ||
range.file.path.startsWith("/system/"))) {
return;
}
我们这里只过滤一下就是大小要大于0x70,为什么呢 因为dex head大小就是0x70
function verify_dex(dex_ptr, range) {
if (range != null) {
var range_end = range.base.add(range.size);
// verify header_size
if (dex_ptr.add(0x70) > range_end) {
return false;
}
// 这里+0x3C 是 string_ids_off, 也就是 string_ids 段的偏移位置 这里的值要正好等于0x70
return dex_ptr.add(0x3C).readUInt() === 0x70;
}
return false;
}
4.返回真正的dex文件地址和大小
前面已经拿到了想要的内存开始地址,但是dex的大小还是没有拿到
这个dex文件大小需要额外的获取
在header头信息里面的0x20字段写了dex文件大小
直接读取即可
var dex_size = dex_ptr.add(0x20).readUInt();
测试脚本功能
现在可以测试这个基础脚本了
基本上可以拉下来我们需要的dex文件
后面直接使用jadx即可查看内容了
其他的细节问题
修复dex文件错误,适配一些对dex文件的魔改情况
后面讲解