大家好,我是阿爬!这里是诉说阿爬和阿三爬虫故事的爬友圈
本期继续由阿爬逆向一款旅游类App(同程),帮助阿三解决旅游平台众多导致的选择困难症
一、对抗点介绍
a.接口请求参数加密
b.接口响应结果加密
c.扣java算法代码
二、揭开加密面纱
1. 抓包分析
依然使用: 很(V)好-P-用=N= + charles来抓包,找到酒店列表页,发现列表页接口请求参数是一串乱码
响应结果也是一串乱码
这样就不能直接通过关键参数搜索了
2.frida hook 找突破口
思考片刻后还是得用hook解决,于是启动hook url的js代码,找到对应url和堆栈
此刻拿出神器:jadx打开对应apk,发现App没有加壳,直接可以看到源码,根据堆栈信息很快定位到了函数入口
3.关键函数确认
大概梳理一下函数执行流程,发现核心点在a函数
为了验证是否真的,于是hook这个函数,去对比参数和结果,在hook结果中有很多结果,此时如何找到正确结果呢?经验告诉我列表页一般都是分页的,会存在page或者size字段,所以搜索一下,果然发现有相关信息
至此大致分析完成,开始算法还原
三、算法还原
根据逻辑,接下来开始还原算法,
1.解决a函数,进入a函数
乍一看以为是一个原生的AES加密,当看到导入的包时我的经验告诉我不对劲,跟进去看果然是自实现的一套AES加密。经过一番冷静,打开Java IDEA,开始一步一步扣代码,图中小箭头的地方都是需要还原的类或者方法,由于内容多就不演示扣代码过程了。
在函数最后返回处的Base64也是烟雾弹
跟进去也是自实现的方法,于是也得一步一步扣下来,最后扣完后检验一下是否能运行成功,还好一次就过了,再验证一下结果也是一样。
最后还需要将java代码进行打包成jar(具体流程我就不写了,自行搜索)
重点的加密参数解决了,还有一个小参数值没有解决,如图:
这个参数比较简单,直接hook就可以得到了
2. hook一下JSONObject中v对应的结果,用python的字典数据类型组装一个完整的数据
3.最后通过python实现gzip的压缩和解压功能
由此整个参数加密过程还原完毕,响应结果解密很简单,直接用gzip解压即可得到明文数据
四、刨根问底
总结一下注意点:
1.扣java代码时和扣js代码差不多,缺啥补啥,不一样的是,如果有的类只使用固定值,则不需要把这个类补上,只需要补这个值即可
2.在自实现AES算法传参时,用python字符串传参时注意转义字符,python传过去的字符串必须和hook到的字符串格式一直,错一个标点符号都不能拿到结果。
3.请求正确后再检验哪些参数有校验,再动态去生成,封装。
最后贴出结果图
阿三看完这期又要发火了,你说了这么多还是没有解决我的问题啊。阿爬表示委屈
做技术不容易啊,阿爬表示这是个长期活儿。好了,本期到此结束,下期见!
欢迎大家评论区留言,关注阿爬了解更多爬虫故事!
特别声明:本文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。