最近试了一下利用mitmproxy来抓取安卓手机流量,用于分析。前面使用过Charles,但是是图形化界面的,不方便把数据存下来,mitmproxy支持python编程,容易把数据存放起来,所以这里分享一下使用方法。
安装
- 首先下载网易mumu模拟器,用于android手机模拟,这是因为真机有诸多的限制,所以用模拟器方便一点,下载链接为: http://mumu.163.com/
- 然后需要安装mitmproxy,安装也很简单:
pip install mitmproxy
配置
- 打开mumu模拟器
- 配置mitmproxy
设置代理,其中ip为电脑本机的ip,在命令行中输入:ifconfig就可以得到,我的为:
(base) ➜ ~ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether f4:5c:89:ab:a4:3d
inet 192.168.0.105 netmask 0xffffff00 broadcast 192.168.0.255
media: autoselect
status: active
安装证书:打开模拟器的浏览器,输入地址:mitm.it
选择对应平台并安装证书,安装完成后就可以抓 https 的包了
创建python demo.py
import json
from mitmproxy import ctx
import pymysql
HOST=''
USER_NAME=''
PASSWORD=''
SPIDER_CAR_DB=''
conn = pymysql.connect(host=HOST,
user=USER_NAME,
password=PASSWORD,
database=SPIDER_CAR_DB,charset="utf8")
def response(flow):
url='url'
cursor = conn.cursor()
# text = flow.response.text
# data = json.loads(text)
# ctx.log.info(str(data))
if flow.request.url.startswith(url):
text = flow.response.text
data = json.loads(text)
print(data)
ctx.log.info(str(data))
sql = 'INSERT INTO yourdb(`information`) VALUES("%s");' %(str({'detail':data['detail']}))
# INSERT INTO maihaoche(`information`) VALUES('{"sex": 1, "age": 18, "nick_name": "小萌"}');
ctx.log.info(sql)
try:
cursor.execute(sql)
conn.commit()
except Exception as e:
conn.rollback()
ctx.log.info(str(e))
ctx.log.info("connection error")
response()
修改上述相应的配置为你的配置就行了。然后运行:
mitmweb -s demo.py
最后一步就是点机模拟器的APP,上面会打开一个网页,网页上面就会发现有相应的请求,然后再看你自己的数据库,应该会保存数据,如果有错误,则会报错。
参考文献
[1].一步一步教你 HTTPS 抓包. https://juejin.im/post/584b711d8e450a006c586ca6
[2].使用Charles抓包安卓模拟器(MuMu). https://www.jianshu.com/p/1d0360e50a01