作者论坛账号:fnv1c
0x01 背景
高考完了,有时间水群吹牛逼了。碰巧某同学说自己平板被"锁机软件"锁了,只能通过输入动态码解锁。他提供了样本apk,说希望能逆出来动态码算法。虽然对安卓逆向非常陌生,但总比打一天游戏更有意义,于是开干。
免责声明:本文旨在与分享移动安全相关知识,相关内容已作脱敏处理。请勿用于非法用途。
0x02 前置知识和工具
本文主要是so层的脱壳逆向,几乎没有涉及java层的知识
预热篇:
前置知识:有手就行
工具:可以反编译ARM的IDA正篇:
前置知识:C++逆向经验,ELF相关的一点经验,frida基础使用
工具:ADB,frida,可以反编译ARM的IDA,xAnSo
0x03 预热篇
基础逆向发现java层通过调用JNI层函数verifyDevtoken(用户输入内容,null)
来判断用户输入解锁码是否正确。
找到对应的so,ida打开,肉眼可见验证函数。
发现对a1进行了几次虚函数调用,然后和creatDevToken函数生成的动态码比对并返回结果。
根据函数signature可以看出a1为JNIEnv,根据JNIEnv虚表可知+676出为GetUTF8Char
,即获取jstring的内容。
跟入creatDevToken逻辑比较清晰,但在最后发现一个古怪的函数调用DDD4();
0x04 正篇
发完key,他告诉我key解不了。他的应该是新版本软件,又来了个新版本样本。我人傻在那里,这就是买一赠一吗,爱了爱了。好在so名字没变,直接拖ida看,发现export炸了。。。
终于发现so库的名字和JNI函数名,但是由于加了动态soinfo强壳,只能在frida中获取库基址和函数地址,ida中看不到导出项目。看看maps有什么特点。
验证函数居然不在so的映射范围内,而是在一个新的匿名段。四个匿名段有很典型的rx,rw,ro的权限分布,猜测是子母ELF壳,母so加载时解密真实ELF,并且装入内存。魔改soinfo使得子ELF的导出项对外可见。由于soinfo中库基址指向母ELF,直接将子母ELF一起dump到文件分析。
ida这次可以读出函数的内容,但是无法创建函数,提示控制流错误。
找到了key生成函数和关键跳,大概逻辑是生成key并和用户输入对比,对比完返回结果。
自此可以观察到完整生成逻辑。
看完全部逻辑就可以写keygen了,经过测试key正确。
(为脱敏本文不附带新版本key生成过程伪代码,只记录脱壳和修复过程)
0x05 结语
脱壳逆向过程比想象中艰难恶心,但也给人一点启示。
要有终身学习的觉悟:在遇到so强壳时,因为没有安卓逆向经验,差点放弃。幸好狠下心花半个小时熟悉了下frida,追到输入的动态码后带来了继续下去的动力。如果因为从没做过安卓逆向就放弃学习,只停留在熟悉的领域,估计这辈子就和安卓逆向无缘了。
做软件不能本末倒置:当一个软件为了防破解而做的工作远大于软件内容本身时,就要仔细考虑是否需要引入这么复杂的防破解手段。对于某些用户必须使用的软件,砸着经费,版本迭代着,软件功能的风评却不改善,反而是于用户无用的加密手段越来越先进,何尝不是一种本末倒置,更给破解再二次倒卖的行为提供了滋生的温床。
--官方论坛
www.52pojie.cn
--推荐给朋友
公众微信号:吾爱破解论坛
或搜微信号:pojie_52
本文始发于微信公众号(吾爱破解论坛):【移动样本分析】某锁机软件的so脱壳与逆向分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论