目标APP就不放了,公司还在跑,记录一下逆向过程中学到的一些经验技巧
脱壳
直接拖入PKid查壳发现是360的壳
刚开始买的测试机在路上,无法直接用脱壳机,尝试使用其他脱壳方法
1.BlackDex
直接脱壳失败
2.frida-dump脱壳
壳中有frida检测,启动frida一段时间后直接闪退退出(每次退出还给我手机干重启)
开始尝试过frida 检测
直接脚本hook strstr,strcmp,pthread_create,android_dlopen_ext,更改启动端口
查看打印日志发现并没有什么问题,闪退依旧存在,我是废物所以就不硬刚了
疑问
为啥是过一段时间后才会干掉frida,猜测是线程检测间隔时间,但是查看hook日志并无异常,甚至都没有做相关特征字符串的检测
解决
后面经过多次尝试,换成了一个低版本的path-server,终于能运行了(迷)
再次运行frida-dump
能脱壳了,就他妈离谱
但是脱了个寂寞,脱下来的代码只包含系统类的内容,app的关键类一个没有
后面还是找我朋友用脱壳机脱下来了(感谢大佬+1)
抓包
1.抓包详情
观察url
抓包发现所有关键包(数据有加密)都是走的同一个url: /api/ume***/native
,一看url的这个ume,就觉得眼熟,ume,u,me,百度一搜,wc,友盟。之前好像有个产品也是这个。
但是时间久远没有啥印象了,好奇翻了下客户列表,发现了另一个同类产品(这不搞定了就直接拿下俩,血赚)
2.抓包工具自动识别protobuf
听同事说他们之前搞这个APP,用charles抓包可以直接识别protobuf,灰常方便
但是我尝试使用charles 抓包发现发送数据和返回数据都是加密的,请求体也没有特殊字符可以辅助定位,而charles也没有正确识别
百度charles解析protobuf的相关信息,发现需要请求头中的content-type值必须是 application/proto,而这个App的content-type是protobuf,不是标准的
发现并不能直接看protobuf,遇事不决,可问百度
参考博客:Charles解析protobuf之初探-腾讯云开发者社区-腾讯云 (tencent.com)
使用重写功能,重写响应头(为啥不改请求头,因为请求体是加密字符串,而响应体是字节流)
改了之后发现,还是解析不了
后来觉得charles不太好看请求,改成了fiddler
发现fd 的raw格式查看protobuf的响应体可以自动解码大概看一下内容(虽然还是有大部分乱码,但是可以参考定位请求)
否则都是同一个url,请求体都全是加密字符,返回体都是乱码,一堆请求,都不好确定哪个请求的加密值是需要逆向的
参数逆向
根据响应体中的部分关键词,直接尝试搜索,发现很难定位到
后知后觉这是protobuf,直接hook protobuf,然后打印堆栈不就完了
1.hook protobuff
看了一下脱壳后的代码,一搜protobuf
一万多个,而且hook com.google.protobuf 的所有方法发现都没有调用!
我淦!
好,放弃,下一个
2.定位加密
正当我沉迷苦海搁那儿大海捞针呢,hook hashmap啊啥的关键方法
同事问我要不要参考一下以前的代码,拿过来一搜,转明文的那个方法还在!赶紧hook,哟西,就是这个躺赢的味道
欧克,结束,全靠大佬带
其实这里想说的是,搞不定时,有老版本的代码可以参考老版本的代码,有些关键类可能还在,虽然有修改,但是可以有很好的参考价值
没有老版本的怎么办,现场去逆老版本啊,就算有强制更新,过掉继续逆就完了
3.公共库直接引
这个其实应该在定位加密那儿,之前不是说了,它是protobuf,但是hook 发现没有调用com.google.protobuf(意思是转明文关键点不在这里),不是压根没调用,光看调用,掉的太多,发现不了有效信息
这里他其实用了github上的一个开源protobuf封装的工具,所以直接在自己的项目里引用就好了,然后包括发现设备指纹的加密的so,那个类名libMMKV.so,熟悉的人应该一眼就能看出来,这是个数据库的so,调用这个说明是在这儿取值,而不是在这儿加的密,你要是unidbg跑,补死你也补不出来加密值
所以,发现类名的路径和主包路径不一致,尽量花几秒钟去搜一下,没准会省下你非常多的精力
4.加解密以及格式化
都定位到关键类了,剩下的java层分析都是小意思,跳过跳过,说三点值得记录的
3.1 格式化困难
之前说过找到了转明文的关键方法,但是,protobuf写格式是很麻烦的事情,特别是公司还用的java开发,python还能用blackBoxprotobuf去无脑解
再加上领导说把明文都搞出来,一是方便看,方便分析各个值的意思,二是给以后留个种子
别说,很有道理,要不是有以前详细的笔记,我应该也不会这么轻松吧,
看了下
一个请求就近千个字段,这让我手写?鲨了我吧,结构体一层套一层,比我肚子上的游泳圈层数还多
3.2扣代码
然后领导说,你把他的接口体全扣下来不就完了......复制粘贴总比手敲好
虽然但是,万一哪个类里边有其他加解密类,或者业务逻辑,或者有个类没脱出来,wc,那我不得把他整个APP扣下来
不过没办法,总不能手敲吧
最后搞了接近一周(加上把我写的py代码转成java的时间),复制了N多个类出来,删除调试,改了N多代码,总算跑通了(其实最主要的是找对应的类)
3.3 unidbg模拟执行so
本来是不想学unidbg的,因为听说unidbg有诸多限制,还有很多检测,越来越难搞,看了下web补环境的困难,就没学习
后面由于种种缘故,认识到了unidbg在实际生产中的重要——不用浪费手机rpc(省钱,所以重要)、方便迁移、比手机稳定
上个月刚买了龙哥星球才学了一点,这就排上用场了,哈哈哈哈哈哈
补环境需要补的不多且都很简单就不说了
-
签名——java层封装的一个函数,专门获取签名信息并加密
-
jni 函数——很基础,没有特殊补的
-
java类——获取了这个类的一两个属性,由于不多且不会变化就直接写死返回,没有写一个类出来
原文始发于微信公众号(逆向成长日记):某航空APP逆向笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论