一、安装Fiddler
要实现Android抓包需要在电脑上安装抓包工具,这里我们使用Fiddler。安装Fiddler非常简单,只需要从官网下载并安装即可。安装完成后,我们先打开Fiddler并确保其能够正常运行。在Windows系统下,可以在控制面板的“Internet选项”中配置代理,使得Fiddler可以在监听状态下捕获HTTP(S)流量。
二、设置Android设备
现在,我们需要设置Android设备以便Fiddler能够监听并捕获设备上的HTTP(S)流量,这一步需要在设备上进行操作。具体来说,我们需要将设备的HTTP代理设置成跟PC上的Fiddler相同的IP地址和端口。设备的操作步骤如下:
- 在设备的“设置”中找到“Wi-Fi”选项并点击进入。
- 长按要连接的Wi-Fi,并选择“修改网络”。
- 在修改网络的选项中,找到“高级选项”。
- 在高级选项的Proxy Settings部分,选择“手动”并输入Fiddler监听的IP地址和端口号。
输入完成后,我们就可以在设备上正常地访问网络,在Fiddler里也能看到捕获到的设备上的HTTP(S)流量。
三、使用Python脚本实现自动抓包
手动抓包虽然可以较为方便地获取到HTTP(S)请求和响应流量数据,但对于大量请求的场景,费时费力,不够高效。因此,我们可以使用Python脚本实现自动抓包功能。
在Python中,我们可以使用mitmproxy模块来实现自动抓包,mitmproxy是一款高性能、可扩展的代理服务器,通过对网络流量的拦截和转发,可以对HTTP/HTTPS请求进行实时的修改和拦截。在使用mitmproxy之前,需要首先安装mitmproxy,在命令行中输入以下命令即可完成安装:
pip install mitmproxy
安装完成后,我们再来编写Python脚本。具体步骤如下:
- 导入mitmproxy模块。
- 新建一个类并继承mitmproxy.http.HTTPFlow。
- 在__init__方法中,调用父类的__init__方法,设置一个实例变量self.raw_request和self.raw_response,用于存储HTTP请求和响应的原始报文。
- 重写mitmproxy.http.HTTPFlow中的request和response方法,在这两个方法中,将HTTP请求和响应的原始报文存储到self.raw_request和self.raw_response中。
- 在main函数中,创建一个mitmproxy实例,指定我们刚刚新建的类作为其参数,然后调用mitmdump.run()启动mitmproxy,开始抓包。
以下是完整的Python代码:
import mitmproxy.http class MyFlow(mitmproxy.http.HTTPFlow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.raw_request = None self.raw_response = None def request(self): self.raw_request = self.request.raw_content def response(self): self.raw_response = self.response.raw_content def main(): addons = [MyFlow()] mitmdump = mitmproxy.tools.dump.DumpMaster(options={ "mode": "transparent", "verbosity": 0, "addons": addons, }) mitmdump.run() if __name__ == "__main__": main()
运行这段代码后,mitmproxy会自动启动并开始监听HTTP(S)流量。我们可以在控制台中看到捕获到的HTTP请求和响应的原始报文。这里要注意的是,mitmproxy默认只能监听到通过该代理服务器发出的流量,而不是整个网络环境中的流量。因此,我们需要在设备上设置代理,让其通过我们所在电脑上的代理发出请求。同时,如果一些应用程序不遵循系统代理设置,我们还需要针对这些应用程序设置单独的代理,否则将无法捕获它们的流量。
四、总结
通过上述步骤,我们可以使用Python编写自动化抓包脚本,捕获HTTP(S)请求和响应的原始报文。这种方式可以极大地提高工作效率,对于应用程序的调试和分析也非常有帮助。