一个人要走多少路
才能称的上是一个男人
一个Python程序员要绕多少弯
才能找到Android逆向的路
废话不多说,Talk is cheap。
主要面向Python爬虫工程师
Android开发人员或者Java工程师,不妨直接看非虫的《Android软件安全与逆向分析》和姜维的《Android应用安全防护和逆向分析》,对于这两本书,我个人看法是是这样的,两本都是好书,面向Android开发人员和安全人员,对小白略微不友好,实践性稍弱。建议两本都买,当作工具书,按章节查询和学习,毕竟书里的内容比百度搜索出来的结果准确太多。
不需要太多Java,Android基础,但会在教程中带大家慢慢补
没有正向的经验和思路,逆向完全是个笑话,当然我们也可以选择做脚本小子,不用懂太多Android知识,就可以逆向不少app,但App攻防战瞬息万变,这样下去是不行的。
目标
熟悉并基本掌握无壳App逆向和破解的思路
环境配置
本教程的两个原则
不用术语解释术语,不使用”显然“”这很简单“”很明显“等词进行逻辑跳跃
影响阅读体验的内容放文末注脚,读者可以点击文字右上角序号进行跳转
资源推荐
主要推荐两个公众号
就从现在正式开始吧========================================================================================
小红书APP是一个生活方式平台。在这里发现美好、真实、多元的世界,找到有意思的明星达人,与他们一起共同标记自己生活的点滴。2.2亿年轻用户每日分享海量服饰搭配、美妆教程、旅游攻略、美食测评,让你轻松升级潮流生活老司机。
用户所发表的内容被称为“笔记”。我们的目标是抓取小红书中欧阳娜娜相关的全部笔记。
首先肯定是看web端能否满足需求
鉴定完毕,这条路行不通。
其实这也反应了越来越多平台的趋势——重移动端轻pc端。
现在是移动互联网的时代,在很多领域,移动端:PC端的流量比甚至达到了9:1,即使是淘宝这类PC时代的老玩家,现在绝大部分流量也都来自移动端,而抖音、拼多多,快手这些产品,更似乎从出生就在Android和IOS的怀里。可以预见,随着5G的推广和普及,移动端能做的事会越来越多,越来越强大。各色的App,微信小程序、QQ小程序会毫无疑问成为信息和流量的汇集地。
在未来,越来越多的应用和服务,官网将只提供移动端的下载地址。
话不多说,转战移动端。
爱自己是终身浪漫的开始
抓包是逆向的第一步
我们使用小红书6.3.0,这是七月才更新的版本,可以保证一段时间内App不会发生大的改动,大家可以直接百度下载,或者使用我准备的网盘资源,里面备有该教程所需要的逆向工具和资源,且均为较新版本。
网盘链接:链接:https://pan.baidu.com/s/1R7bqU4OIuTZSSpB-A8OXWg
提取码:wdc8
出于便捷,抓包时,我们往往会使用电脑Android模拟器,比如夜神、雷电。
但在这里,我们只能使用真机,小红书APP进行了严苛的模拟器环境检测,只要使用模拟器登录,就会有如下的提示。
后续我们会逆向分析它检测模拟器的代码,看一下是否能hook或者篡改掉,但现在还是老老实实用真机吧。1
我们使用Fiddler抓取手机上的数据包,有的人可能习惯使用charles,都可以。2
这个时候我们会遇到一个奇怪的问题,不开启抓包环境时,小红书app可以正常访问。一旦启动代理尝试抓包,app就会出现断网的症状。
这是什么情况?
不会是什么抓包代理检测吧??
答对了,这是一种代理检测。
最常见的就是SSL证书验证(SSL Pinning)。比如抖音、小红书,FaceBook,Twitter等app,都有这种验证和防护。SSL Pinning一种用来防止中间人攻击的技术,广泛应用于阻止app的抓包和嗅探,Fiddler等抓包软件在原理上就是一种中间人攻击,所以一旦遇到了SSL Pinning就凉凉了。我们肯定不能让SSL验证阻拦我们抓包的脚步,下面我们解决SSL证书验证。
首先需要大家在有root权限的手机上安装Xposed框架,它是Android平台最强大的框架,可以在不修改APK的情况下影响程序的运行,网上安装Xposed相关的教程非常多。注意,Android 4和Android 4以上版本的Xposed安装包是不同的,需要安装手机系统版本进行选择。在安装过程中,有一定的风险,请一步步依据教程操作。如果嫌麻烦,可以直接淘宝花二三十安装Xposed或者Edxposed,都是可以的。Android 8-9的系统,我个人更建议安装Edxposed,可以在淘宝搞,也可以参考这篇或者其他文章:
https://blog.coderstory.cn/guide-install-edxposed/ 【后Xposed时代: 一篇文章看懂如何安装和使用Edxposed 】
接下来我们需要安装禁止ssl pinning的插件,这一类插件已经非常多了。比如很多人熟知的JustTrustMe。
我这里推荐sslunpinning,它可以针对单个App进行ssl pinning,在网盘里我放了三款突破SSL证书验证的的app,可以自行选择和下载。
下载并安装sslunpinning,打开sslunpinning界面选择小红书app,打开Xposed,在Xposed-模块列表中勾选sslunpinning 模块,重启手机使得Xposed的更改生效。
环境配置好了,接下来打开小红书,注意不要选择登录,而是选择性别和出生年月,勾选兴趣话题进入内容广场,以此防止抓包结果不同。如果已经登录操作了,可以在设置-应用-小红书中选择清除所有数据,或者卸载重装小红书。
现在,在Xposed+SSLUnpinning的加持下,我们会奇迹的发现Fiddler中数据流不停的流淌,App界面内容可以顺利的加载了出来。
我们搜索”欧阳娜娜“,不需要进入她的个人主页,直接下拉内容。
简单的刷新下拉几下动态,明显发现好几个大的数据包,而且为Json格式,我们把这些数据包标成紫色。
我们来看一下它的内容,Fiddler右下区域可以查看数据包内容,我们使用Fiddler提供的Json格式查看
读者按照这个步骤操作,接着对比一下App的界面,会发现内容一致。
走了这么久,我们终于可以开始分析网络请求了
这是一个GET请求,我们看一下它的Header和字段。
首先不要怕,抽根烟冷静一下,想一下搞爬虫是不是选错职业方向了。
搞爬虫的肯定有经验,这么多字段,肯定有不少是可以固定不变的。
我们多下拉几次动态,抽取两次请求进行对比,直接肉眼看可能会瞎,我是这么处理的,大家也可以直接肉眼对比。
将webform中的大量字段直接全选复制,找个文本编辑器,或者直接用记事本粘贴下来(我用的sublime)。Request Headers选择右上角的raw模式,只复制下来Headers部分,url不用。
稍加整理成下图这个样子
然后找一个在线文本比较网站进行对比
我用的是这个http://wenbenbijiao.renrensousuo.com/#diff
然后就可以获得很直观清晰的比对结果
我们当务之急就是明白和破解Headers中的shield,params中的t和sign。
首先说t,这是一个十位数,以15开头,这很可能是一个以秒为单位的时间戳,如果是十三位,那很可能是一个以毫秒为单位的时间戳。我们找一个在线时间戳转换工具试一下 https://tool.lu/timestamp/
时间完全吻合我发出请求的时间,这是一个时间戳。
接下来我们撸一下sign
首先我们说一下sign是个啥,数一下它的位数,32位,看一下内容,只包含1-9和a-f,这是一个32位的十六进制数,那么它很很大的可能是一个MD5加密结果。不了解MD5的可以看一下我这篇文章:https://blog.csdn.net/qq_38851536/article/details/93919613【密码学在Android加密中的应用和实践——MD5(1)】这里面说的比较清楚。
这里总结一下MD5签名的特征
1.一般来说名字为sig,sign,signature
2.加密的原文为部分或者全部请求字段的拼接
3.为了避免拼接顺序错误导致结果无法校验,将所有或者部分请求参数按照参数名ASCII码从小到大排序(常使用java collection sort实现)
4.可能会将字符串的值以URL编码,用于编码处理(urlencode)
5.加密字段中会有一个时间戳字段用来防止请求被重复使用
6.只使用一次md5防护性比较弱,可能会加盐,或者两次md5,可能会转成大写(a-f→A-F),可能会只取md5结果的9-24位,或者使用其他哈希算法
抓包分析结束,下一讲我们分析小红书sign的生成规则。
为什么app会检测手机模拟器
模拟器常常被用来搞黑灰产搞群控搞游戏增强,比如薅电商平台羊毛、电脑吃鸡,引流刷粉等(如你所见,横行在各种社交平台的机器人)。这些不友好的行为对应用来说百害无一利,所以一些APP会在启动或运行时进行环境检测,在模拟器环境下断网、闪退或报错。后续我们会探讨App是怎么实现的模拟器检测。 ↩︎
如果App抓包环境没有配置,可以参考以下教程:
http://www.111cn.net/sj/android/90542.html 图解Fiddler如何抓手机APP数据包【超详细】
环境配置好了之后,不妨尝试抓一下手机浏览器的包,如果能正常放回http和https数据包,则环境配置成功。
如果你始终无法解决环境问题,可以在评论里留言求助,我可以进行帮助和远程调试。 ↩︎