重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用Fiddler对Android应用进行抓包的方法:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟主机、营销软件、网站建设、罗江网站维护、网站推广。
1、启动Fiddler,打开菜单栏中的 Tools Fiddler Options,打开“Fiddler Options”对话框。
2、在Fiddler Options”对话框切换到“Connections”选项卡,然后勾选“Allow romote computers to connect”后面的复选框,然后点击“OK”按钮,记住代理端口号(注意,此界面中的端口号可修改为你喜欢的,建议保持默认)。
3、设置完成后,重启Fiddler
4、在本机命令行输入:ipconfig,找到本机的ip地址。
5、打开android设备的“设置”-“WLAN”,找到你要连接的网络,在上面长按,然后选择“修改网络”,弹出网络设置对话框,然后勾选“显示高级选项”。
6、在“代理”后面的输入框选择“手动”,在“代理服务器主机名”后面的输入框输入电脑的ip地址,在“代理服务器端口”后面的输入框输入8888,然后点击“保存”按钮。
7、然后启动android设备中的浏览器,访问百度的首页,在fiddler中可以看到完成的请求和响应数据。
将浏览器的代理设置成Fiddler能够实现Fiddler抓取浏览器的请求。同理,Android手机配置Fiddler作为代理服务器,从而让Fiddler能够截获Android的流量来实现抓包。
可以通过ipconfig命令等查看,最简单的就是将鼠标移到Fiddler窗口右上角的online字样上面,会自动提示当前电脑IP地址。
比如,我当前PC IP地址为172.20.224.63
打开Fiddler上Tools--Options,选择Connections选项卡,可以查看到代理端口地址。默认为8888。你可以自行配置成其他端口号。
还有,请勾选“Allow remote computers to connect”(这是允许Android手机通过代理进行网络访问)。
手机连接和PC位于同一局域网的wifi,连接成功后,进入到高级选项中。(不同手机有不同的进入方法,早期手机是长按已经连接上的wifi,现在有些手机直接提供了进入配置的箭头按钮。)
将代理服务器主机名修改为第一步获取的IP地址,端口号为第一步获取的端口号。然后保存。
以上配置OK,打开手机进行网络访问吧,看看Fiddler上有没有HTTP请求包。
实际测试,如果发现没有数据包,你需要检查Fiddler是否打开,是否允许远程电脑访问,以及端口号和IP地址是否配置正确,然后重启试试看(重启Fidder、手机重连Wifi,重新配置等)。
以上配置的仅仅是抓取HTTP请求,对于HTTPS请求,你还是看不到。下面介绍下,HTTPS抓包配置。
HTTPS也是需要通过Fiddler代理来抓取的,所以呢,前面的配置代理的过程不变。下面介绍其他涉及到证书安装方面的。
打开Tools-Options,选择HTTPS选项卡,按照下图进行勾选。
PC上安装好了根证书之后,还需要在手机上安装根证书,才能保证Fiddller能够正确解析出HTTPS包。(原理是,手机通过Fiddler做了代理后,HTTPS请求进行握手时候获取的证书就是Fiddler自己生成的证书,这个证书在手机上默认不受信任,这样会导致手机端认为服务端非法从而断开HTTPS握手,导致请求失败。所以,我们需要让手机信任Fiddler的根证书。)
手机在配置好HTTP代理后,打开浏览器,输入: 。实际上 ipv4.fiddler 会引导到Fiddler所在PC的IP地址上。所以,你输入;pc ip:port也是可以的。(题外话, ipv4.fiddler 这个域名不是外网通用域名,你知道为啥会正确解析不?猜想是Fiddler自己提供了本地DNS解析服务)
OK,以上是所有的配置。
配置成功后,观察Fiddler,手机进行一些操作,看看HTTPS的请求能解析不。如果你遇到下面的异常:
很大可能是由于手机上没有安装Fiddler的根证书。当然,还有例外,如果手机Android系统为7.0以上,即便安装了Fiddler的根证书,也会出现这个异常。原因请参考
你好,
先给手机刷root权限,执行命令:
adb root
adb remount
ok后:把tcpdump放到c盘根目录下:C:\
2. 执行命令:
adb push c:/tcpdump /data/local/tcpdump
(这个命令是把tcpdump拷到手机中去 )
3. adb shell chmod 6755 /data/local/tcpdump
是给tcp分配权限
4. adb shell
/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap
输入 这个命令就等于启动了抓包工具
5. 要停止抓包就Ctrl+C
6. sdcard的capture.pcap复制出来到电脑上用wireshark打开即可
以后每次抓包只要重复第4、5、6步就ok了。
通过这张图可以看出在未使用VpnService的情况下,App会走系统网络来进行各种网络通信。而在使用VpnService的情况下,IP层网络通信传输的包将经由本地的虚拟通道交由VpnService来处理,这样一来我们便可以捕获这些数据从而达到抓包的目的。
至今还没有完全理解这个API的意义。按照google的文档来说就是:
看起来像是添加一个虚拟IP地址的意思,然而按照教程中的描述则为:
参数变成了子网掩码,但是按照实际的使用来看更偏向于第一种。
添加路由来过滤发送特定IP地址的流量,如果不进行任何过滤则需要设置为0.0.0.0/0或::/0
添加DNS服务器的地址,如果不添加的话将使用手机默认的DNS服务器。
添加白名单,白名单中的app的流量将不会经过vpn虚拟通道而直接走系统网络。
设置是否为阻塞模式,默认为非阻塞。个人感觉很重要的API,github上的很多项目没有设置为阻塞导致具体实现的时候用的都是线程轮询的方式,这一样一来大大提升了系统的开销。设置为阻塞模式后将大大减少进程上下文的切换。
设置虚拟通道的最大传输字节数,需要根据具体情况具体分析。在抓包的场景下最好尽可能得设置大一些。
简单来说是否允许一些app在使用一些非主流的方式访问网络的情况下不走虚拟通道。个人觉得最好允许。
VpnService启动后创建Builder进行各种初始化,结束后调用establish()获得本地虚拟通道的文件描述符(mFD)。通过输入流读取需要发送IP数据包后解析包的解析(网上有各种第三方的库可供选择)。首先判断是版本是IPV4还是IPV6,之后根据不同的版本来判断使用的是什么协议。
实际抓包的时候可以看到很多协议种类,当然主要的还是UDP与TCP。
可以创建一个稀疏数组,key为源端口,value为Datagram通道,通过Datagram通道向外发送UDP数据,从而减少系统开销。最终通过Datagram通道拿到UDP响应数据后写入mFD的输出流。
TCP的情况比较麻烦,涉及到三次握手以及四次分手,在github上看到个人感觉比较好的做法是,本地建立一个代理服务器来模拟这个过程。这个还需要深入研究。
套接字在发送之前一定要调用protect来防止循环链接,否则发出去的包又回回到mFD的输入流造成死循环。
另外mFD如果不关闭的话是没办法停止VpnService的。
[img]