部分App无法使用系统代理抓包的原因及解决办法(Fiddler+Drony)

有一些安卓App在进行分析的时候,发现常用的系统代理连接好后,该App就无法正常使用,或是常用的抓包工具Fiddler、Charles等无效。比如支付宝、微博等App就是这样的情况。下面就来阐述一下无法使用的原因及解决方案。

原理

若不想了解可以直接跳到下文的解决方案处。

当客户端想要完成一次HTTP请求的时候,首先要根据请求中的URL通过DNS找到服务器,然后与服务器经过三次握手建立TCP连接。建立连接后客户端会将HTTP报文发送给服务器。

我们在启动Fiddler或是Charles时,该软件会自动设置一个系统代理指向自身,从而完成数据包的抓取工作。使用Windows时可以自动设置系统代理,使用Linux可以通过设置环境变量的方式来设置代理,而手机就是在连接网络的时候手动改指定代理服务器的信息。当系统设置代理后,各类应用在发送请求的时候就不再是直接通过DNS然后连接服务器,而是首先连接系统指定的代理服务器,随后代理服务器再根据请求去连接真正的服务器。只有这样,代理服务器才能随意的进行HTTP包的截获、修改甚至进行“中间人攻击”来解密https包。

而部分应用在遇到系统设置的代理的时候,直接绕过代理直接发送请求或是直接报错。这样的后果就是要么App无法连接网络,要么Fiddler等软件无法正常抓包。

解决方案

解决方案就是利用一些手段,强制的让这些App走到代理服务器就可以了。

方法有好多种:

①修改Hosts,直接控制DNS解析,欺骗App认为我们的服务器就是他需要到达的服务器。这样做的话缺点就是针对每个域名都要提前设置好,比较繁琐。再有就是移动设备上十分不容易操作。

②建立一个新的网络,将其中特定设备的流量转发到代理服务器上。优点是对于设备不需要特殊的配置,直接在网络设备上配置即可。缺点就是需要专门的网络设备,配置过程一样较为繁琐。

③利用VPN将终端的流量转发到代理服务器上。这种方法的优势是操作较便捷,缺点就是VPN一般针对于全部软件的流量进行转发,配置不当数据量会很恐怖。

综合考虑,这里我们就选用方案③。

这次操作中,使用的是一台root过的安卓设备(因为要解密https流量需要在系统证书区安装Fiddler根证书,只有root后或刷有第三方recovery的设备才可以。至于为什么需要安装根证书,详见中间人攻击原理),需要的软件是Fiddler和Drony。

安装Fiddler根证书到系统证书区

首先在Fiddler中导出根证书。Tools->Options,选择HTTPS选项卡,在右侧Actions按钮上点一下,然后选择Export Root Certificate to Desktop,即导出根证书到桌面。在此例中导出的文件名称是FiddlerRoot.cer。

然后利用openssl工具计算证书的Hash值,给证书改名。为确保安全,Android系统的系统证书区里面的证书都是以Hash值为名称。

openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer

将输出中类似269953fb这样的字符串复制,将FiddlerRoot.cer改名为hash.0,就像本例中改为“269953fb.0”(去掉引号)。扩展名中的0是防止证书Hash碰撞,概率极低。

改名把改好名的证书放到Android设备/system/etc/security/cacerts目录中,重启手机即可生效。可以在手机的系统证书区看到Fiddler根证书的相关信息。

配置Drony

Drony是一款代理软件。安装在手机上后打开。滑动上方选项卡,选择设置(Settings),首先点选网络中的无线网络。

然后选择自己连接的WiFi。点击进入。

然后在选项中首先设置代理类型为手动(Proxy Type->Manual),主机名和端口填写局域网中Fiddler主机的IP和Fiddler的端口。(注意,Fiddler软件中Connection选项卡里面的允许远程网络连接选项务必打开!否则无论如何是连接不上的。)

 向下翻,代理类型选择普通http代理。(Proxy Type->Plain http proxy)

继续下翻,过滤默认值选择允许全部(Filter default value->Direct all),然后点击规则(Rules)。

默认的规则里面应该是空的。点击右上角加号新建一个规则。(即单独针对某一个App进行代理转发。)


网络ID(Network ID)处确认是正确的WiFi名称。行动(Action)选择本地代理链全部(local proxy chain),应用就选择想要转发包的应用。剩下的无需填写。填写好后点击右上角存盘。

然后返回到主页,点击下方“关”按钮开启。该按钮上的文字代表程序状态,显示“开”就是代表代理已开。

现在就可以打开待抓包的应用了,发现应用使用正常,http包也已经正常出现,https包也成功解密。

posted @ 2021-03-04 20:56  framelinker  阅读(7262)  评论(0编辑  收藏  举报