31 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android系統中Flutter應用程序的包

1.簡介Flutter是谷歌的移動UI框架,可以快速在iOS和Android上構建高質量的原生用戶界面 。Flutter應用程序是用Dart編寫的,這是一種由Google在7年多前創建的語言 。Flutter是Google使用Dart語言開發的移動應用開發框架,使用一套Dart代碼就能快速構建高性能、高保真的iOS和Android應用程序 。
HTTP應用層的抓包已經成為日常工作測試與調試中的重要一環,最近接觸新項目突然之間發現之前的抓包手段都不好使了 , 頓時模塊與模塊之間的前端與服務之間的交互都變成了不可見,整個人都好像被蒙住了眼睛 。
2.驗證是否走代理Flutter 應用的網絡請求是不走手機的系統代理的,也就是說你在系統設置中設置了代理地址和端口號后 Flutter 也不會走你的代理,而抓包是必須要設置代理的,然后走代理我們才可以成功的抓到包,現在人家都不從你這里走 , 累死你都抓不到 。
方法一:首先我們使用正常的抓包流程:通過fiddler進行抓包,可以看到,只抓到一些圖片和一些沒有用處的亂七八糟的文件,那么很有可能他不走代理 。
還有一種方法可以判斷APP是否為無代理請求模式:以fiddler為例,當我們配置好fiddler證書、模擬器wifi配置好ip和端口后,客戶端關閉fiddler抓包工具,如果該APP還可以正常運行說明請求為無代理模式 。
宏哥查了一下現在使用Flutter的應用程序,發現好多程序都用它 , 宏哥就選擇了某魚這一款APP 。
按照之前的宏哥配置,模擬器配置了代理而且這個代理是走Fiddler的,如果宏哥沒有啟動Fiddler如果是走代理的應用程序,就會出現網絡問題,如果是不走代理的應用程序,就可以正常訪問網絡 。具體操作步驟如下:
1.宏哥沒有啟動Fiddler,然后用瀏覽器訪問百度,出現網絡問題,因為代理的網絡走到Fiddler這里 , Fiddler不通,出現網絡問題 。如下圖所示:

31 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android系統中Flutter應用程序的包

文章插圖
2.宏哥沒有啟動Fiddler,然后啟動應用某魚APP , 正常訪問網絡,因為不走代理的網絡,Fiddler啟動不啟動對其沒有影響,不會出現網絡問題 。如下圖所示:
31 《吐血整理》高級系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android系統中Flutter應用程序的包

文章插圖
通過以上對比 , 我們確認了這款某魚APP不走我們手機設置的代理,因此我們就不可能抓到它的包了 。
3.為什么http請求沒有通過wifi走代理?為什么http請求沒有通過wifi走代理呢,因為之前安卓原生使用的一些http框架都是正常走代理的??,那是不是愉\贍艽脛杏衋pi方法可以設置請求不走代理 , 于是乎就研讀了一下Flutter中http相關的源碼,最終找到了答案 。
3.1http請求源碼跟蹤http.dart中的HttpClient是一個抽象類,成員方法的具體實現在http_impl.dart中,http的get請求實現如下:
Future<HttpClientRequest> getUrl(Uri url) => _openUrl("get", url);Future<_HttpClientRequest> _openUrl(String method, Uri uri) { . . . // Check to see if a proxy server should be used for this connection. var proxyConf = const _ProxyConfiguration.direct(); if (_findProxy != null) { // TODO(sgjesse): Keep a map of these as normally only a few // configuration strings will be used. try { proxyConf = new _ProxyConfiguration(_findProxy(uri)); } catch (error, stackTrace) { return new Future.error(error, stackTrace); } } return _getConnection(uri.host, port, proxyConf, isSecure) .then((_ConnectionInfo info) { . . . });}首先,我們可以發現方法中有一行注釋// Check to see if a proxy server should be used for this connection.,意思是“檢查是否應該使用代理服務器進行此連接”;
然后,有一個proxyConf對象初始化和根據_findProxy來創建新的proxyConf對象的語句,然后通過_getConnection(uri.host, port, proxyConf, isSecure)來創建連接 , _getConnection的源碼如下:
Future<_ConnectionInfo> _getConnection(String uriHost, int uriPort, _ProxyConfiguration proxyConf, bool isSecure) { Iterator<_Proxy> proxies = proxyConf.proxies.iterator; Future<_ConnectionInfo> connect(error) { if (!proxies.moveNext()) return new Future.error(error); _Proxy proxy = proxies.current; String host = proxy.isDirect ? uriHost : proxy.host; int port = proxy.isDirect ? uriPort : proxy.port; return _getConnectionTarget(host, port, isSecure) .connect(uriHost, uriPort, proxy, this) // On error, continue with next proxy. .catchError(connect); } return connect(new HttpException("No proxies given"));}從代碼中我們可以看到根據代理配置信息來將請求的host和port進行重置,然后創建真實的連接 。
跟蹤以上源碼我們發現dart中http請求是否走代理是需要配置的,而_findProxy變量和配置的代理信息有關 。

推薦閱讀