<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 爬蟲時,高版本 App 如何進行抓包?

          共 2338字,需瀏覽 5分鐘

           ·

          2020-09-18 09:40



          我們都知道 iphone 和低版本 Android 抓包,只需要設(shè)置代理和配置證書就可以順利抓包


          但是升級了 targetSdkVersion 到 28 后發(fā)現(xiàn),在 Android 7.0 以上機型 Charles 抓取 https 包時顯示找不到證書,但是 Android 6.0 機型還是可以正常抓包。

          這其中的原因是,從 Android 7.0 開始,默認的網(wǎng)絡(luò)安全性配置修改了


          解決方法如下:

          現(xiàn)象:android7.0 以上的手機 https 抓包失敗(安裝了 https 證書也不行)

          原因:android7.0+ 的版本新增了證書驗證(系統(tǒng)證書),具體如下:

          1、Android 6.0(API 23)及更低版本應(yīng)用的默認網(wǎng)絡(luò)安全性配置如下:

          <base-config cleartextTrafficPermitted="true">    <trust-anchors>                <certificates src="system" />                <certificates src="user" />    trust-anchors>base-config>

          2、而在 Android 7.0(API 24)到 Android 8.1(API 27)的默認網(wǎng)絡(luò)安全性配置如下:

          <base-config cleartextTrafficPermitted="true">    <trust-anchors>                <certificates src="system" />    trust-anchors>base-config>

          3、而在 Android 9.0(API 28)及更高版本的默認網(wǎng)絡(luò)安全性配置如下:

          <base-config cleartextTrafficPermitted="false">    <trust-anchors>                <certificates src="system" />    trust-anchors>base-config>

          對比很容易發(fā)現(xiàn),在 Android 7.0(API 24)到 Android 8.1(API 27),默認不再信任用戶添加的 CA 證書,所以也就不再信任 Charles 和 Fiddler 抓包工具的證書,所以抓取 HTTPS 包時才會失敗


          而且在 Android 9.0(API 28)及更高版本上,不僅默認只系統(tǒng)預(yù)裝的 CA 證書,還默認禁止所有明文通信(不允許 http 請求)


          解決辦法:

          前提:在手機端和電腦端都必須安裝 https 的安全證書
          配置
          測試包時,項目設(shè)置默認信任所有證書(系統(tǒng) + 用戶,Charles 和 Fiddler)
          1、在項目工程 res-xml 目錄中創(chuàng)建一個名為 network_security_config.xml 的文件,文件內(nèi)容如下:

          <network-security-config>    <base-config cleartextTrafficPermitted="true">        <trust-anchors>            <certificates src="system" overridePins="true" />            <certificates src="user" overridePins="true" />        trust-anchors>    base-config>network-security-config>

          2、在 AndroidManifest 里的標簽中,添加如下代碼,在清單文件中指向該文件:

          <manifest ... ><application android:networkSecurityConfig="@xml/network_security_config"... >        ...application>manifest>


          重新打包項目,然后抓包,即可成功

          Webview 抓包失敗

          上面可以解決 Android 原生抓包問題,但在 Android7.0 以上的手機,開著網(wǎng)絡(luò)代理訪問不了Webview

          若要抓包webview,需要在 Webview 的 WebViewClient 中,將一行代碼給注釋掉:

          super.onReceivedSslError(view, handler, error)

          這樣是為了忽略掉 SSL 證書錯誤

          因為開啟代理后網(wǎng)絡(luò)會變得不安全,證書會報錯誤,Webview 檢測到證書錯誤之后就不請求任何數(shù)據(jù)。注釋是為了忽略掉父類的處理,默認執(zhí)行下去。

          警告

          這樣的配置操作是敏感且危險的,只能用于測試環(huán)境方便抓包,線上包一定注意要恢復(fù)配置,不然 APP 會面臨被他人抓包的風(fēng)險。


          如何只在調(diào)試模式下允許抓包呢?

          使用??即可實現(xiàn):只在?android:debuggable?為?true?時才生效的配置


          <network-security-config> <debug-overrides> <trust-anchors> <certificates src="system" /> <certificates src="user" /> trust-anchors> debug-overrides>network-security-config>

          網(wǎng)上有些解決方式是將 Charles 和 Fiddler 的證書添加到?raw?文件夾下的方式也可以,但是繁瑣了點


          在 Android 9.0(API 28)以上允許部分 http 請求

          最佳的解決方式肯定是全部使用 https 請求,安全性更高,如果有些請求或測試環(huán)境下還是需要使用 http 請求,需要在網(wǎng)絡(luò)安全性配置添加白名單:

          <network-security-config>        <domain-config cleartextTrafficPermitted="true">        <domain includeSubdomains="true">sample.domaindomain>    domain-config>        <debug-overrides>        <trust-anchors>            <certificates src="system" />            <certificates src="user" />        trust-anchors>    debug-overrides>network-security-config>

          后記
          通過查找資料,還有一個方法,通過重載 WebViewClient 的 onReceivedSslError() 函數(shù)并在其中執(zhí)行 handler.proceed(),即可忽略 SSL 證書錯誤,繼續(xù)加載頁面

          代碼如下:

          WebView webview = (WebView) findViewById(R.id.webview);webview.setWebViewClient(new WebViewClient() {@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {// 不要調(diào)用super.onReceivedSslError,因為其包含了一條 handler.cancel(),第一次訪問時無法加載,第二次以后可以加載// super.onReceivedSslError(view, handler, error);// 忽略SSL證書錯誤,繼續(xù)加載頁面        handler.proceed();    }}



          推薦閱讀


          帶你用 Python 實現(xiàn)自動化群控(入門篇)

          這些自動化場景,批處理完全可以取代 Python

          抖音超火的九宮格視頻是如何生成的,Python 告訴你答案


          瀏覽 70
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  熟妇乱伦视频 | 日逼的网站 | 国产二区三区 | 成人久久91久久 | 影音先锋男人站你懂的 |