主流APP数据抓取难点:
1.请求参数加密
-sign签名,使用sha1加上md5做辅助加密
2.请求body加密
-整个请求体使用DES算法做加解密
3.代理检测反爬
-抓包设置代理后,直接不再加载数据
4.私有CA证书反爬
-由于公有的证书需要付费,有一些厂商(oppo)的证书为私有
解决办法:
一、暴力解决:
针对以上问题,暴力解决的方式就是一切不予解决,直接以侵入webview的方式获取数据。
优点:直接,简单,暴力
缺点:依赖appium环境,整套环境搭建安装起来还是比较麻烦,抓取效率低下
二、破解sign签名:
反编译源码进行动态调试,然后利用
优点: 抓取效率高
缺点:破解成本高,反编译浪费时间,成功概率较小,非常麻烦,需要看和调试代码
项目示例:(oppo软件商店抓取)
传统抓取方式的表现:
按照传统步骤charles抓包,发现进入app详情和评论页面的时候出现CA证书无法加载!
分析问题:
https是需要SSL认证的,所以去去请求的时候会带着CA证书来鉴定请求是否安全,对于
一些比较重视安全的企业来说,app内置的CA证书就够用了,但是 发现oppo软件商店这
款应用比较奇葩,CA证书是自己签发的,这样必须得绕过认证
解决CA自签发证书问题:
那么解决方法就是不带https就好了,在模拟器中,安装以下内容
Xposed框架 ——> 加载第三方模块库来侵入系统达到可自定制需求的目的
需要做的事情:
1.模拟器需要root
2.在模拟器上安装xposed框架app
3.进入Xposed app , 点击安装,完成之后可能卡死,重启就好
JustTrustMe ——> 安装
SSLSping ——> 安装
这两个模块下载完成后,进入Xposed app选择模块,导入这两个模块后重启即可
这样就不再走https了,自然绕过了CA认证!
然后再通过传统的方式去抓包:
抓取的结果如下:
发现问题:
1. sign签名
2.数据返回格式是x-protostuff (序列化协议)
解决问题(方式二:基于反编译源码动态调试):
破解app(这个在之后再做仔细的分析)
1.下载apk,修改后缀为zip,解压之后拿到dex文件(dalvik虚拟机字节码,相当于java的class文件),使用apktool反编译dex2jar转化为jar文件(将smali代码转化为class文件,一般会有针对变量和方法名的混淆) , 再使用jd-GUI打开jar文件,这样就可以看到基本的代码了,但是仅仅只是看到代码而已,距离研究分析破解而言才刚刚开始。
2.动态调试需要和反编译需要安卓环境的支持,这里暂时不做说明和实践。
解决问题(方式一:基于appium):
appium是一款自动化测试移动端的工具,可以获取app的视图,那么问题就很好解决了。
环境下载安装与配置
1.安装appium-desktop ,下载后安装即可
2.安装adb工具 (3个文件:adb.exe, xxxx.dll,xxxxx.dll) 将这三个文件放在c盘下的Windwos目录下
都复制到System32 和SysWow目录下,最后在控制台输入adb命令就可以用了
3.打开模拟器,打开开发者调试模式,进入系统的版本号,点击5次即可打开
4.使用adb命令连接模拟器,adb connect 127.0.0.1:xxxx
逍遥模拟器是21503
夜神模拟器是62001
最后使用adb devices -l 查看连接的设备应该可以看到模拟器的设备名称
5.下载Android idk环境,由于新版本(25.2+)的Android sdk会出现命令过时的情况,所以下载低版本的比较好
下载完成之后配置android_home环境变量到Path下即可,这样可以在终端直接运行android sdk命令
6.在终端运行android sdk 命令,下载那些sdk. 完成之后即可
创建appium session:
1.appium创建127.0.0.1的host
2.配置参数如下json:
{
"platformName": "Android",
"platformVersion": " 4.4.4”, ——> 模拟器android版本号
"appPackage": "com.oppo.market”, ——> main入口类位置
"appActivity": "com.oppo.market.activity.MainActivity”, ——>入口的activity
"deviceName": “127.0.0.1:21503”, ——>模拟器的host与端口
“app": “c://xxxxx” —> 模拟器app的位置
}
设置完成之后就可以看到app视图了,这样就可以拿数据了
怎么拿数据呢?
appium提供不同版本的代码支持,可以调用seleium相关的api直接获取元素
依赖:appium =>
pip install Appium-Python-Client
方案架构图:
请求 代理请求发送
代码client ————————> appium-desktop-server ————————> adb server ————> app
可以看到,整个请求链经过了好几层转换,所以环境搭建是相对较难的,但是理清晰了还是很直接的。