基於OkHttp的一種防抓包方案

更木小八發表於2018-05-03

基於OkHttp的一種防抓包方案

最近在讀OkHttp3.9.0的原始碼,在瞭解了其代理機制之後發現了一種繞過代理,避免被抓包的方法。 在介紹這種防抓包方法之前,需要先了解一下OkHttpsocket連線建立的過程。

由於這個過程比較複雜,我簡述一下,在建立socket連線之前,OkHttp會獲取系統的代理資訊,如果設定代理,那麼通過DNS解析其IP然後使用代理IP來建立socket連線。如果沒有設定代理,那麼會使用請求中的url的IP地址,來建立連線。

如果要防抓包,那隻需要繞過代理就可以了。

OkHttp使用ProxySelector來獲取代理資訊,在構造OkHttpClient時是可以設定的,其預設值是ProxySelector.getDefault(),該預設值會反應出系統的代理資訊。 那麼我們就可以提供自己的ProxySelector實現來達到繞過系統代理的能力。程式碼如下:

OkHttpClient client = new OkHttpClient.Builder()
                            .proxySelector(new ProxySelector() {
                                 @Override
                                 public List<Proxy> select(URI uri) {
                                     return Collections.singletonList(Proxy.NO_PROXY);
                                 }
                            
                                 @Override
                                 public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
                            
                                 }
                             }).build();
複製程式碼

相關文章