抓包那点事

最近在抓某团APP的包,遇到了不少情况,在这里记录一下。

第一回合:fiddler与APP

熟练地打开fiddler和mumu安卓模拟器,配置好代理IP和端口,开始愉快的抓包了。

配置代理,证书已经装过了

测试一下,一切OK:

代理已经生效

然后正式开始抓包,打开某团APP:

除了一些图像其他的都没有抓到,悲剧

很遗憾,我们的代理明明已经生效了,但是为什么除了图片,其他的请求都没有抓到,难道它不是走的HTTP协议吗?

要想弄清楚这一问题,我们要知道什么是代理。(我也查了不少的资料,推荐一篇很好的博客)

部分APP无法代理抓包的原因及解决方法(flutter 应用抓包)​www.cnblogs.com/lulianqi/p/.html

Fiddler 或 Charles 这类使用的代理的抓包软件与Wireshark是完全不同的(Wireshark 使用的网卡数据复制,只要是经过指定网卡都会被抓取),其只能对使用代理的应用层网络协议生效,比如常见的HTTP(https),Websocket。

借用的图片

一般http客户端在进行http请求前会先检查系统代理,如果有设置代理,客户端会直接使用完整uri去连接代理服务器。但是不同的平台通常会改写自己的的http客户端的,虽然他们都按照协议要求实现了代理功能,但是并不一定在默认情况下会直接使用系统代理。这样说你可能不太明白。

一般APP会先检测代理

proxyAddress = System.getProperty("http.proxyHost"); String portStr = System.getProperty("http.proxyPort");

如果发现有系统代理,它可以直接使用代理:即用完整uri去连接代理服务器,这样抓包软件不仅知道http请求及响应的所有报文,甚至还可以随时修改请求及响应。它也可以拒绝使用代理:

System.clearProperty("http.proxyHost"); System.clearProperty("http.proxyPort"); System.clearProperty("https.proxyHost"); System.clearProperty("https.proxyPort");

这样做它就清除了代理,请求已经不走系统代理了。

这样做也有局限性,还有另一种做法:

System.setProperty(“key”,"value");

这个方法能够设置代理ip/端口,

对应的参数为:

key: http.proxyHost==》 System.setProperty("http.proxyHost","ip") key: http.proxyPort

其实你就理解成把http.proxyHost 等参数处理成全局静态变量,这样你在wifi那里设置的参数就会被这个方法设置的参数所覆盖了。

到这里,你就明白为什么你的代理不生效了,APP和代理是一个相互选择的过程。但是怎么解决还是没有办法。

第二回合:Packet Capture与APP

Packet Capture一个使用SSL网络解密的 捕获数据包/网络嗅探 工具,通过自建一个vpn达到无root抓包应用。下载的话,各大应用商店都有吧。

安装好之后,先实战一下(安装证书之类的就跳过不讲了):

开始页面,选择app抓包抓包成功

简单点,选择10K以上的包查看。

抓包成功

成功是成功了,但是也太乱了吧,下面解释一下为什么这种方式能够抓到包。

首先你要清楚VPN和代理服务器的区别:虽然这两者都可以伪造你的IP,也可以实现抓包功能。但是两者的原理却不一样,代理服务器是:把你的请求(这里只说HTTP请求)发送到另一个中间服务器,由它和网站完成交互,最后把信息转发给你。而VPN是构造了一个虚拟专用网络,实际上也是一种特殊的代理服务器,不过是在操作系统级别设置。VPN连接捕获其配置的设备的整个网络连接,也可以看作虚拟网卡,它会监控虚拟网卡上的所有请求(不只是HTTP请求)。这就说明为什么VPN能成功,因为他创建了一个专属网络,所有的网络活动都在这个网络里进行,自然能抓到包了。

但是这种方法不好用,找个请求累的要死,还是放弃吧。

第三回合: Fiddler 和VPN的结合

延续上面的思路,我们能不能先用VPN建立一个虚拟网络,然后在设置代理服务器,这样不就能抓到包吗?思路是好的,但是Packet Capture建立的是VPN服务器和Fiddler的代理服务器是并列关系,我还是太年轻了。。。。

开启fiddler之后,连图片都没有了,显然美团的全部请求都走了Packet Capture建立的虚拟网络中。

连图片都消失了。。。。

但是还真有这样思路:drony 是一个十分方便的VPN软件(https://github.com/SuppSandroB/sandrop/wiki/Drony-FAQ),drony会在你的手机上创建一个VPN,将手机上的所有流量都重定向到drony自身(不是流向vpn服务器) ,这样drony就可以管理所有手机上的网络流量,甚至可以对手机上不同APP的流量进行单独配置。

赶紧尝试一番:

打开后的页面

然后向左滑动,(尴尬。。。)

点进去之后你就你连接的wifi,继续点击

继续点击,别忘了打开fiddler:

继续向下翻把这两个也改一改,代理类型和过滤

然后回到settings页面

点这个,添加APP

最后点一下第一张图的off:

结果很悲剧,还是不行,只有图片。

讲道理,应该能行啊,不知道哪里出了问题,改用花瓶(Charles)试试,老规律,前面的配置和证书安装(电脑和手机的证书都要安装)就不讲了,

先打开Charles,抓包试试:

测试一下,没有问题

打开某团,开始抓包:

还是没有抓到包

接着打开drony,记得改下端口,Charles的默认端口是8888

然后打开drony,再次抓包:

竟然抓到了

这次竟然抓到包了,奇了怪了,难道Charles和fiddler的原理不一样,还是少了哪个步骤?大大的问号。不信邪的我又试了一遍,还是一样的结果,头大,希望有大佬告诉我原因。

尽管过程很坎坷,但是我们最终还是利用Charles和drony抓到了包,主要是又了解了很多抓包工具,尽管还有很多没有写到,例如:突破SSL Pinning封锁,还有Android7.0以上的证书问题,以后有机会尝试吧。在推荐几篇好的文章:

loco:当你写爬虫抓不到APP请求包的时候该怎么办?【中级篇】183 赞同 · 86 评论文章