声明
以下只是搬运下我公众号的东西。很早就发过了。原帖地址:
前言
其实之前也发过浇油类的app的分析,感兴趣可以在我博客里找找。
分析
下面这个是注册:
抓包结果:用的是某厂的sdk包
下面这个是登录包:
卧槽,加密参数还不少,还有shumei啥的,有点东西啊
随便输入点信息之后,就进入了首页的内容
他是根据位置获取展示数据的,根据抓包的结果,大概率就是这两个接口了:
根据返回的加密数据长度,应该是这个结尾为city的了(啥原因不说了,搞多了你就懂了)
访问了好几个页面,基本都是一样的请求模式,请求体和返回体做了一层加密,然后请求头带有很多参数
那么本篇文章的重点就选择大家都感兴趣的首页的小姐姐列表了(也就是上面),反正加密方式都一样。
1.分析加密参数
先看看抓到的包的请求头加密参数:
还不少
开搞!
脱完壳之后,怎么脱的具体就不说了,开始搜加密参数:URS_APPID
卧槽,随随便便搜的几个加密参数都能直接找到,看来unpack工作做的很好
然后跟一下,都能找到这个地方:
这还有啥说的,直接干就完了
2.分析请求体和返回体加密
也就是下面这两个的加密解析了:
其实看到这两个加密字符,开头几个字母基本一致,大概率猜测,两个用的同一种加密方式,而且secretkey估计都是同一个
啥都没有,目前是一头雾水,问题不大,换一个抓包工具, OkHttpLogger-Frida
哎呀卧槽,刺激,直接就能拿到结果
现在怎么办,直接修改okhttp_poker.js(OkHttpLogger-Frida项目的文件)文件,把打印调用栈的逻辑加进去不就可以看到这段的调用栈了吗?
直接在printerRespoonse函数里加入如下代码:
g,貌似没啥有用的
看来得另想办法了。(这个方法对于一些app是可行,只是这里这个app没得搞)
目前,我想到的思路是(临时现想的,也许还有更好的思路)
1.hook 通用的加密方法,查看调用栈
2.hook JSONObject 对象,因为okhttp的hook,已经验证,最后返回是JSON,查看调用栈一定可以找到
3.搜索request、response、params、encode、decode等特殊字符
4.hook 请求头的加密参数,找到实际的主逻辑,进而找到请求体的加密
5.hook hashmap 的put方法看看有没有所需的参数
好的,接下来就是分析里最繁琐也最有意思的环节,通过一步步的试错尝试,找出实际的加密逻辑
我选用的hook json的方法:
hook 方法 com.alibaba.fastjson.JSON.toJSONString,结果果然调用了:
下面报了个错,是因为数据太长了,就会导致这样:
看看调用栈,这不就找到了吗,嘿嘿
继续跟逻辑,找到这个方法:
com.xxx.xxx.network.retrofit.ApiResult.getData
他返回结果实际就是展示在app上的数据,可以,返回的json已经找到,再继续跟逻辑
没过多久,跟到这个方法:
com.xxx.xxx.biz.home.impl.home.bean.UserListRequest.getCondition
这个方法的参数刚好是这个筛选条件:
感觉很接近了,继续看,发现了翻页的方法
在分析的同时,我发现一段代码,很有意思:
数据居然是sql,然后追了下,居然是本地的数据库SQLlite
搜了下,好多sql语句,有点东西啊
秀了,也就是说,这里面的小姐姐,我猜测,很可能只是本地app的sql数据.....
所以我一个刚注册的号,能收获这么多打招呼的消息?
继续看,通过上面跟逻辑,找到这个方法:
com.xxxxxx.xxxxx.xxxx.xxxx.c.j
但是jadx根本无法显示这个j方法:
换GDA,刺激,主逻辑全都在这里:
经过一段时间,终于找到核心的加密,就在如下
仔细看了下,这段像smali又像java代码,感觉不像是加密,就是把请求头参数,转成了array,然后转二进制,二进制再转字符串,所以难怪我hook标准的加密找不到,还是有点东西,具体就没去深究了
不知道由于这个app是用kotlin开发的,所以有些语法,jadx和gda都无法完美解析
具体还原工程就不展示了
测试
反正能跑就行了
结语
搜ID:geekbyte