强行设置代理
既然它不支持设置代理,我们就借助其它软件给它设置代理,比如:
Proxifier: https://www.proxifier.com
SocksCap64:https://www.sockscap64.com/sockscap64-official-homepage-chinese
这两款软件都可以让任意程序通过HTTPS/SOCKS5代理访问网络,其中SocksCap64使用黑科技API HOOK技术,HOOK了Windows Sockets API,然后把所有的TCP/UDP包通过代理转发。而Proxifier则是正规军,使用了Windows提供的正规接口,通过安装WinSock LSP模块过滤/转发TCP/UDP包,当然此处还是推荐Proxifier,稳定性和兼容性更好。SocksCap64依赖API HOOK和DLL注入技术,但不是所有程序都随便给你注入的,比如腾讯TP保护下的游戏客户端,所以兼容性和可用性不如Proxifier。不过Proxifier是收费的商业软件,不过有30天免费试用,以及网上随便一搜一大把的激活码,你懂的。
接下来,我们拿 [网易有道词典] 开刀,强行给它设置代理,看看它是怎么和服务器通讯的。
在Proxifier中添加 [127.0.0.1:8888] 这个Fiddler提供的HTTPS代理服务器
设置Proxifier规则,让 [网易有道词典] 通过代理访问网络
一个重要的设置
还有一点设置通常容易被忽略,就是在Proxifier中,设置 [Profile] — [Name Resolution] — 勾选 [Resolve hostnames through proxy],让域名解析的工作交给代理服务器,而不是在Proxifier上解析。默认情况下Proxifier自行解析域名,比如www.baidu.com解析为180.97.33.108,然后发请求给Fiddler:
CONNECT 180.97.33.108:443 HTTP/1.1
这样Fiddler并不知道它请求的是哪个域名,于是返回给客户端的伪造证书时,伪造的是为180.97.33.108颁发的证书,有的客户端会做校验,发现这个证书是颁发给180.97.33.108的,而不是颁发给www.baidu.com的,然后报错处理。
修改Proxifier设置后,把域名解析的工作交给代理服务器,Proxifier会直接向Fiddler发送请求:
CONNECT www.baidu.com:443 HTTP/1.1
这样Fiddler就知道客户端请求的是 www.baidu.com,从而返回客户端伪造的www.baidu.com证书,客户端不报错,Fiddler才能顺利抓包解密。
抓包效果
接下来就是对 [网易有道词典] 抓包的结果:
Perfect!
所有HTTP通信内容历历在目,点击 [翻译] 按钮,它发送了什么内容,服务器返回什么内容清晰可见。接下来稍作分析,就可以用Python直接向这个URL发送HTTP请求,提交翻译文本,就可以拿到翻译结果了。
这下,你知道很多程序,官方没有提供API的情况下是怎么实现功能的了吧。当然有道翻译是提供了OpenAPI的,虽然API服务是收费的,但是并不贵。分析有道词典的通信协议其实意义并不大,但是分析其它各种各样的第三方软件呢,这么大的脑洞,就留给你来填吧,嘿嘿。。。
如果要对java程序导入Fiddler证书,执行下面的命令:
"D:\Java\jdk1.8.0_144\bin\keytool" -importcert -alias Fiddler -keystore "D:\Java\jdk1.8.0_144\jre\lib\security\cacerts" -storepass changeit -file FiddlerRoot.cer
查看导入的数字证书
"D:\Java\jdk1.8.0_144\bin\keytool" -list -keystore "D:\Java\jdk1.8.0_144\jre\lib\security\cacerts" -storepass changeit
删除导入的数字证书:
"D:\Java\jdk1.8.0_144\bin\keytool" -delete -alias Fiddler -keystore "D:\Java\jdk1.8.0_144\jre\lib\security\cacerts" -storepass changeit