
点个关注你最好看

「注意:本教程纯属为技术交流所用,请各位看完本文后不要试图对任何使用本程序的网站进行破坏攻击入侵等,本人发此贴纯属技术交流探讨, 并无怂恿别人去尝试攻击的意思!若不接受以上条件的请自觉关闭, 由此产生的后果与作者(本人)无关!」
「如要转发或提 ISSUES,请联系作者!」
「Author:857-小数据神学工作者」
E-Mail:FreeOnePlus128@gmail.com
CreateTime:2021 年 12 月 15 日
一、目标
通过 Mitmproxy 作为中间人拦截请求和响应包,然后通过 Python 解析响应包的 Data 数据,或是修改请求参数,模拟用户请求,完成爬虫操作。
「PS:本教程不涉及手机 ROOT,如有需要,请自行百度|GOOGLE~」
二、 方案及组件
2.1 组件说明
「Mitmproxy」 :拦截数据和模拟发送,无论是 Mac、Windows 还是 linux 都可以安装部署
「Python」:脚本编写和脚本环境搭建,用于解析拦截数据或者生成模拟发送数据参数
「Openssl」:生成系统级的证书
「ROOT 后的安卓手机|Android 模拟器」(二选一):安卓系统环境,安装目标 APP,用代理进行转发数据流
手机/模拟器都还需要安装「RE 文件管理器」
由于安卓手机的版本不同,不同版本的安全策略也不一样,高版本的安全策略程度高,无法通过直接 root 和安装证书即完成对 APP 的安全验证的规避操作,绝大部分 APP 都已不认可用户自己安装的证书,因为可能具有欺诈性,所以需要安装系统级的证书,并且绕开 Android 的证书安全策略。
所以以下分两种情况:
Android 5 及以下:
Root 用户级证书安装 网络代理设置
Android 5 以上:
Root Magisk Manager(Magisk 版本需要根据 Android 的版本随之升级,此教程使用的是 Android 9,Magisk 版本为 22.1【最低要 21.0,否则后续进行不了】) Magisk 组件(给开源 Android 集成自研能力) Riru(Xposed 框架依赖组件) Riru - EdXposed(Xposed 框架依赖组件) EdXposed Manager (Xposed 框架管理器) JustTrustMe(Android 安全策略绕开组件)
「注意:安装 Magisk Manager 以及 Magisk 组件需要科学上网!」
2.2 不同方案都需要的组件安装
2.2.1 Python 安装
Version:3.10
安装方式:https://www.python.org/downloads/
下载安装,可无脑安装器安装,也可二进制文件自主编译,看技术力
PS:安装器安装时可勾选添加 Python 路径到 PATH 中,选了就不用再去搞 PATH,手动二进制的话,需要去修改环境变量文件:
.bush_profile
文件(MAC)添加 /etc/profile.d/mitmproxy.sh
(Linux)系统高级设置-添加环境变量-新增路径(Windows)
添加环境变量$PYTHON_HOME
,该source
就source
2.2.2 Mitmproxy 安装
2.2.2.1 Mac 安装
直接使用 pip 安装即可
pip install mitmproxy
复制
pip 本质上会一是安装 mitmproxy 库的相关代码,二是安装 mitmproxy/mitmdump/mitmdump 三个可执行程序,可执行程序被安装在$PYTHON_HOME/Scripts 文件夹下。
2.2.2.2 Windows 安装
PS:由于该教程是用 MAC 写的,没有相应 Windows 截图,只能凭记忆给大家描述了
直接安装可能会报错,提示 pip 版本过低,需要更高版本21.3.1
解决方案:先更新 PIP 版本
python -m pip install --upgrade pip
复制
继续执行,还是可能会报错 —— 提示当前机器没有 C++ 14 相关环境
解决方案:别偷懒,直接下载 VS 最新版(虽然安装起来有点费空间,大概几个 G,提前做好准备工作),然后安装 C++相关环境(这一步很恶心人~需要有耐心)
https://visualstudio.microsoft.com/zh-hans/downloads/
复制
继续执行,可能会报新错误 —— 提示没有 Windows SDK
解决方案:打开 VS 安装器(也可以理解为 VS Manager 软件),找到你下载的 VS 的版本(一台机器随便你安装多少个 VS 版本),选择修改,查找添加新的组件 Windows SDK
至此,安装 mitmproxy 的 Windows 环境都 OK 了,然后执行 PIP 命令
pip install mitmproxy
复制
安装好以后,执行命令:mitmdump
(命令行式 mitmproxy),如果成功则大功告成,如果不成功那再看看教程步骤,哪一步出了纰漏,最大概率是 VS 环境没有安装好。
2.2.3 证书生成及安装
证书生成只需要在安装好以后,在命令终端(Mac 和 Linux 有 GUI 版打开终端,Windows 打开 CMD,Linux 无 GUI 版直接搞)执行mitmdump
,当出现以下界面,即代表运行成功
规则服务器监听了所有通过 http 协议和 8080 端口进行传输数据的数据流,端口可以修改,只需要在启动的时候添加参数 -p xxxx
其中,xxxx 代表自定义端口号。
这个端口是用来监听的,也就是说不是用来拦截 APP 指定端口的,是用来监听代理端口的,不要设置一些敏感端口,比如 80,443 之类的。
执行成功该命令以后,证书会自动生成到用户文件夹下:
Mac:/User/用户名/.mitmproxy/ Windows:C://用户/用户名/.mitmproxy/
「注意:两个系统下的文件夹都是隐藏文件夹,Windows 的需要设置显示隐藏文件方可看到,Mac 建议在终端下使用 cp 命令复制到指定文件夹下!」
文件夹下会有好几个证书
mitmproxy-ca-cert.p12 mitmproxy-ca.p12 mitmproxy-dhparam.pem mitmproxy-ca-cert.pem mitmproxy-ca.pem
具体证书的命名含义我也就不讲了,有兴趣的可以百度了解一下,然后我们使用 mitmproxy-ca-cert.pem
这个证书,将其复制至指定目标文件夹【个人建议新建一个文件夹来存放需要后期使用到的各种文件】。
Mac: cp /User/用户名/.mitmproxy/mitmproxy-ca-cert.pem /User/用户名/Document/AndroidCrawler/
Windows:打开文件夹复制粘贴 mitmproxy-ca-cert.pem
这个整数就是我们中间代理 mitmproxy 的证书,把它安装到我们需要爬取的系统上,就可以实现证书认证,从而让 APP 放心的把数据交给我们、放心的接收我们修改以后的数据~
如果直接发送到 Android 或者模拟器安装,高版本 Android 下安装成功以后也没啥作用,因为是用户级的证书,不被系统认可,那么解决问题的办法就是,让该证书变成系统级的证书。
首先,安装 Openssl 工具(Mac 自带,直接开搞)。
先查看安装好的 Openssl 工具版本 openssl version
#openssl版本在1.0以上的版本的执行这一句
openssl x509 -inform PEM -subject_hash_old -in 你的证书路径
#openssl版本在1.0以下的版本的执行这一句
openssl x509 -inform PEM -subject_hash -in 你的证书路径复制
执行结束后会有这样的加密串
在 BEGIN CERTIFICATE 之前会有「类似于」 c8750f0d
这样的串,然后复制它。
用这个串重命名你的证书文件mitmproxy-ca-cert.pem
,改为「类似于」 c8750f0d.0
的名字。
在 Mac 的 Finder 下重命名似乎后缀名无法更改,需要在终端进行mv
命令修改。
mv 你的证书路径/mitmproxy-ca-cert.pem 你的目标路径/c8750f0d.0
复制
至此,证书也成功生成了,前期准备工作都已完成,接下来就是搞事情了。
2.2.4 ADB 安装
ADB 是用于开发平台(Mac|Windows|Linux 等)模拟操作安卓手机端的工具,它可以完成模拟操作手机、获取手机信息、传输文件、安装 APK 等需求,后续我们会使用到。
2.2.4.1 Mac 安装
使用 Homebrew 安装(还没有安装 Homebrew 的先安装它,怎么安装不写了,百度一搜一大片) brew install android-platform-tools
配置环境变量
打开终端, cd ~
打开.bash_profile 文件,如果不存在先创建,可以用 vim open .bash_profile
在文末加入(内有路径需要改为自己的,别蒙头复制粘贴)
export ANDROID_HOME=/Users/你的用户名/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools复制
source .bash_profile
输入
adb
或者adb -version
,验证是否安装成功,成功如下
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as /Users/freeoneplus/Documents/android-sdk-macosx/platform-tools/adb
//下面是各种参数详解,就不贴了复制
2.2.4.2 Windows 安装
下载地址:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
下载后的压缩包解压缩到你想放的目录下
打开此电脑
——>属性
——>系统高级设置
——>环境变量
然后把ADB存放路径
添加到Path
里(这太简单了,不赘述了)
然后各种保存以后,打开CMD
输入adb
或者adb -version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\AndroidSDK2.2\platform-tools\adb.exe
//下面是各种参数详解,就不贴了复制
2.3 方案步骤
2.3.1 方案一 —— Mitmproxy + 安卓机 (Android 9)
2.3.1.1 安装 Magisk Manager 和 Magisk(需要科学上网)
Version:17.0+
下载地址:https://github.com/topjohnwu/Magisk/releases
通过数据线或其他方式传给手机,安装即可。
打开 Magisk Manager,安装 Magisk
Version:22.1 +
安装后重启手机。
2.3.1.2 安装 Riru 模块(需要科学上网)
Version:10 +
(不要太高,建议 25.4.4,太高下一模块没法依赖上,安装不了)
下载地址:https://github.com/RikkaApps/Riru/releases
一样,传给手机,打开 Magisk Manager,选择模块,选择本地安装,找到下载好的 ZIP 压缩包,进行安装。
安装后重启手机。
2.3.1.3 安装 Riru-EdXposed 模块(需要科学上网)
Version:0.5.2.2+
(低版本没测试,但是低版本依赖不了 Riru 的高版本,如果要降,要连同 Riru 模块一起降级,否则安装不通过,一直提示请先安装 Riru)
下载地址:https://github.com/RikkaApps/Riru/releases
一样,传给手机,打开 Magisk Manager,选择模块,选择本地安装,找到下载好的 ZIP 压缩包,进行安装。
安装后重启手机。
2.3.1.4 安装 EdXposed Manager APP(需要科学上网)
Version:4.6.2+
下载地址:https://github.com/ElderDrivers/EdXposedManager/releases
下载,传输,安装。
2.3.1.5 安装 JustTrustMe 模块
Version:0.2
下载地址:链接: https://pan.baidu.com/s/1YllByaVOnt3lL4RE17X0jg 密码: 6n5g
下载,传输,安装,重启。
然后打开 EdXposed Manager,看模块栏目,是否已提示成功运行 JustTrust,如果成功,至此,安全策略组已完整搞定。
2.3.1.6 安装证书
通过数据线连到 Android 手机,把我们刚刚弄好的证书c8750f0d.0
(「你的证书名字不应该和我写的一样,格式类似即可」)传过去。
安装 RE 文件管理器(给这个文件管理器 ROOT 权限,可以访问系统级文件夹)。
复制证书到该目录下:
/system/etc/security/cacerts
复制
重启手机。
2.3.1.7 代理配置
打开手机的无线,将你的电脑和手机连到同一个无线上(要同一个路由器)
打开找到你本机的 IPv4 地址:
MAC:
两种方法都行
打开终端,输入
ifconfig
image-20211124171503579 找到你的 en0 网卡,查看地址
打开系统偏好设置-网络
Windows:
打开 CMD 命令行,输入
ipconfig
找到对应网卡的 IP 地址(我用 Mac,截不了 Windows 的图)
打开设置-网络与设备-当前连接的网络-查看属性-IPv4(好像是这样,具体名字可能有出入)
找到 IPv4 地址,复制。
点击 Wi-Fi,查看右边的 IP 地址
两种方法都行
在手机上进行下一步操作:
设置----无线和网络 WLAN----长按 wifi 名----修改网络----显示高级选项----代理----手动---服务器主机名输入 xxx.xxx.xxx.xxx(根据自己电脑 ip 修改)服务器端口输入 8080(如果想自定义端口也行,只要和 mitmproxy 启动监听时的端口一致即可)----保存
至此,代理配置完毕。
2.3.1.8 启动监听
在终端执行mitmdump
,可加参数-p 作为自定义端口号
mitmdump -p 9998
复制
如果出现下图,则表明没问题
再往后,就是写 python 脚本进行数据接收和处理了,下回分解。
2.3.2 方案二 —— Mitmproxy + Android 模拟器(Android 7.1.2)
模拟器:推荐夜神模拟器(雷电也行)
模拟器内核版本:Android 7+
2.3.2.1 准备模拟器环境
下载模拟器(https://www.yeshen.com/)
安装好以后先下载你准备研究的 APP(可以先下载至本地,然后上传安装,也可以直接在模拟器的应用商店上面下载,但是自带的应用商店的版本一般都很老,可能下载以后也不能打开)
打开设置,启用开发者模式
打开这个功能
找到最下面关于平板电脑
进去以后找到最后一项,版本号
image-20211215130912635
然后进行死亡连环指,连续点击直到通知已打开开发者模式
然后回退到上级菜单,找到开发者选项
往下滑,找到 USB 调试功能
打开模拟器设置,启用 Root 权限
Mac 界面
Windows 界面
然后在模拟器的右上角有个设置齿轮 ⚙,点击
检查你的 Root 权限是开启的,保持开启即可,无需其他多余操作
至此,模拟器的环境配置结束
2.3.2.2 安装证书
模拟器安装证书的过程容易出错,出错以后证书无法生效,导致一直处于证书不信任状态,进而会导致我们请求无法成功(TimeOut)或者反复认证(弹窗警告)或者信息获取短缺(部分链拿取不到),给我们研究自动化造成很多困扰,这一步务必认真~
查看电脑是否成功连接到手机
adb devices -l #显示所有已连接的设备详细信息:127.0.0.1:62001
复制若未连接,则连接 ADB
adb connect 127.0.0.1:62001 #默认端口
复制进入我们已经重命名以后的证书所在位置
#Mac
cd /User/你的用户名/你存放的具体路径/
#Windows
#可能需要先切换盘符
D: #切换到D盘
cd 你的路径复制传入手机
adb push c8750f0d.0 /sdcard
复制「注意!这里的
c8750f0d.0
是你之前生成证书时改的名字,别直接无脑复制粘贴了哈」安装 mitm 证书到手机的 ADB SHELL 操作
#获取手机的root权限
adb shell
su
#挂载系统目录为可写
mount -o rw,remount /
mv /sdcard/c8750f0d.0 /system/etc/security/cacerts
#修改证书权限
chmod 644 /system/etc/security/cacerts/c8750f0d.0复制「还是注意!这里的
c8750f0d.0
是你之前生成证书时改的名字,别直接无脑复制粘贴了哈」最后,我们可以看一下我们用的模拟器内核是发行版还是其他版本
adb shell
cat /system/build.prop | grep build.type复制如果返回
ro.build.type=user
则代表没啥毛病,如果是其他版本可能需要做操作(后面补充一个)打开模拟器,查看是否已成功安装 CA 系统级证书
Mitmproxy
打开设置,进入安全模块
image-20211215140010157 找到凭据存储里的信任的凭据
在系统 tab 里往下翻,找到 m 开头的,查看是否有 mitmproxy 证书
如果有,则代表证书顺利安装成功,没有,则需要重新安装一下,这个必须得有,不然搞不了
上面提到如果不是发行版,假设是开发版的,可能有报错
错误信息:'/dev/block/dm-0' is read-only
对于开发调试的版本,用户必须先disable-verity
,然后再执行后续的操作
adb root
adb disable-verity
adb reboot
adb remount
adb shell
mount -o rw,remount /system复制
至此,证书安装结束
2.3.2.3 代理配置
与真机一样,如果需要捕获数据,就得把网络代理配置给中间人去进行信息的抓取,所以直接来干~
1.打开设置,点击 WLAN
2.长按你看到的那个虚拟 WIFI
3.选择修改网络
4.点击高级选项,选择手动配置
5.输入你的本地 IP 和 mitmproxy 监听的端口号
6.本地 IP 去这里找
Windows
Mac
系统设置——>网络和 Internet
左上角——>系统偏好设置——>网络
左边列表里找到你正在使用的网络,右边复制你的内网 IP 地址(因为现在基本没可能 IPV4 个人用公网 IP 了~)
7.然后保存你手机的网络配置
至此,配置代理网络结束
2.3.2.4 启动监听
打开命令终端,输入
mitmweb -p 你刚刚写的代理接口的端口号
复制弹出 mitmwebUI 界面
在模拟器上打开任意你想要抓取的 App,测试使用,比如我们打开浏览器
搜索 857 是什么
mitmwebUI 会把所有请求的串都给我们展示出来
接下来我们就需要找到真正我们需要的接口请求链接,然后进行过滤,这应该属于应用了
2.3.2.5 DEMO-1 百度搜索
1.从拦截到的请求链中,找到百度发送搜索请求的链接
2.可以点击一个串,然后右边看它的请求头或者响应内容,希望找到的是一个完整的 H5 页面
3.查找的时候,可以尽量看接口,大部分搜索接口,都会以 search 或者 s 这样的命名方式命名,所以我们很快定位到了请求连接
4.点开响应,发现是一个挺大的文件,309.8kb,那大概率就是它
Display anyway
按钮
5.的确是熟悉和喜闻见乐的 H5 页面
想看全部内容的话,还可以点击右下角的show full content
按钮进行查看
6.确认是该连接串以后,那么我们就可以用这个链接串的固定头进行筛选过滤了
# 原链接
https://m.baidu.com/from=844b/s?word=857%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&ts=0&t_kt=0&ie=utf-8&fm_kl=021394be2f&rsv_iqid=2591761736-2&rsv_t=791bVD%252BdGHAbMlNIs1MqSfhJO1q03VBqZqI2tvFyPXnESa0sjwdAhXFD8g&sa=is_1&ms=1&rsv_pq=2591761736&rsv_sug4=1639549768086&tj=1&inputT=1639549770482&sugid=13987157572640490342&ss=100&rq=857
# 过滤固定头的规则
https://m.baidu.com/from=844b/s复制
7.拿着https://m.baidu.com/from=844b/s进行过滤
打开左上角
Start
Tab在 search 搜索框里输入我们找出来的过滤规则
符合条件的的确只有这一条,那就稳妥了,接下来我们在模拟器打开的百度页面搜索框继续搜索
8.继续搜索857李奇峰是什么人
9.查看过滤出来的链接,是不是多了一条,如果是,则说明我们前置所有工作都是成功的
2.4 Mitmproxy+Python 本地化存储数据
❝无论是真机还是模拟器,作用都只是为了发起对 APP 的请求
Mitmproxy 则是在请求过程中充当一个中间人的角色,经手所有信任了它的请求连接
经手过后,还仅仅只是经手了,截止现在还是没有把数据持久化下来,进行进一步的操作
❞
其实 Mitmproxy 是 Python 的一个三方库,既然是和 Python 完美嵌在一起的,那么一定就可以使用 Python 程序对中间人经手的数据进行处理,绝大多数需求,都是想将网络资源固化至服务器/本地/数据库,然后进行进一步的操作分析,那么本教程的范围截止到将数据固化即结束,后续再行讨论~
2.4.1 Python 程序编写
编写思路
1. 拦截连接串
2. 根据拦截规则进行匹配(比如我们刚刚设置的固定头)
3. 将拦截到的数据进行持久化(持久化至磁盘或者数据库)复制编写代码如下(非常简单的 DEMO)
# coding=utf-8
import codecs
def response(flow):
# 过滤列表
rule_url = "https://m.baidu.com/from=844b/s"
url = flow.request.url
if flow.request.url.startswith(rule_url):
text = flow.response.text
f = codecs.open("request.html", 'a', 'utf-8')
f.write(str(text) + '\r\n-----------------------------------\r\n')
else :
f = codecs.open("pass.txt", 'a', 'utf-8')
f.write(str("非过滤列表URL\r\n" ))复制程序作用很简单,就是将符合条件的链接过滤出来,并将返回的响应值持久化到 txt 文本文件中
保存 Python 程序,命名为
857test.py
使用 Mitmproxy+Python 的启动方式启动我们整套项目
mitmweb -p 你的代理端口 -s 你的Python脚本路径
#eg:
mitmweb -p 9922 -s 857test.py
#如果你不想要WebUI窗口监听,只想命令行监听,那么吧mitmweb改为mitmdump就行
#eg:
mitmdump -p 9922 -s 857test.py复制开始测试
857 李奇峰是什么人 大数据行业前景分析 857 是什么意思 打开模拟器,搜索了如下三条
可以看到 WebUI 上的确过滤出来了三条链接,说明拦截是成功的,那看看有没有执行 Python 脚本进行持久化
打开执行命令文件夹
我们可以看到,该过滤下来的请求也都过滤下来了,并持久化到了磁盘上
至此,APP 爬虫的请求过滤持久化教程告一段落,后续我再写一些在实际开发过程中的应用心得
三、多说几句
首先,爬虫项目,要摆正态度,以搜索引擎的思想和用途是可以的,如果其他,要考虑一些风险因素,工作成果是给公司或者其他人提供的,但是风险和最终风险承受人还是开发者,切要小心。
项目实施过程中,能调用和捕获只是第一步,还有各种反爬和校验机制在内,所以此教程只是适合入门使用,距离落地稳定可靠的项目只能起一个启蒙作用,后续还需要大量的研发工作,简单罗列一下后续应该关注到的点:
较为稳定的爬虫工作,是拿到接口以后,对接口的各类参数进行解析,然后模拟参数和模拟终端,通过程序进行反复调用然后获取数据,若初级一些的,是模拟终端操作,比如使用“按键精灵”制作模拟脚本,使用 ADB SHELL 进行模拟控制,使用 python 框架进行模拟操作等等,但这样的操作终究是模拟人的行为进行处理的,适合个人简单抓取玩玩某些小量资源,不适合需要稳定、持久、容错高的项目开发方式,因为模拟人的行为进行操作,要考虑的不稳定因素太多了,比如机器性能、网络性能、网络波动、操作卡顿等等,所以在这多言几句。 常见的反爬能力,有 IP 监测、终端型号监测、请求行为监测(鼠标点击位置、鼠标滑动位置、鼠标点击间隔、请求频率限制等)、验证码(文字、图形、语音等)、session 校验、cookie 校验、字体文件映射等等方式,每一个比较坚挺一些的网站,都会或多或少的应用以上的反爬能力,而每一种反爬能力,也都对应的有办法解决(欺诈或者绕过),所以爬虫与反爬永远都是进步的,同样的能力都是不断在更新的。 如果是 WEB 端的数据爬取,那么以上的一套体系依旧可以使用的,只是这方面成熟的资料已经蛮多了,就不做重复造轮子的事情了,可能有些同学比较喜欢 Java 开发,那么你可以用 python 负责数据持久化,用 Java 负责后续的业务处理即可,如果是 Web 端,那么 Java+Selenium+Jsoup 也是不错的套餐选择。
技术无罪,研究技术和分享技术都应该是本着纯粹和开源的态度进行交流讨论的,而本人能力有限,若在教程过程中有谬误之处,还望各位同学多多指正,后续若时间充裕,会写一份企业级的爬虫项目构思和简述供大家参考,感谢各位~

音乐将一切平凡的画面赋予深厚的意义



MacOS安装node,npm踩坑

【BUG】Flink CDC 2.0.0迷之异常!!!

3秒学不会Palo Doris的数据导入你打我!

详解Java线程池监控,看不懂找我!!