close

引子

上個月,一位企業客戶報告說,他們使用的第三方瀏覽器擴展無法正常工作。對該擴展的調查表明,該瀏覽器擴展依賴於一個在瀏覽器沙箱之外運行的NativeMessaging Host(NMH)組件。在審查客戶提供的進程監控日誌時,我們發現,Native Host可執行程序在啟動數十分鐘後就意外退出。並且,在這次意外退出後,下一次瀏覽器內擴展試圖調用它時,瀏覽器到本地的調用就會失敗,從而導致瀏覽器擴展無法提供其預期功能。

不幸的是,我既沒有NMH可執行文件的源代碼(甚至沒有二進制文件),在進程監控器日誌中也沒有找到明顯的線索(例如,註冊表讀取或寫入失敗),所以,我們很難搞清楚問題到底出在哪裡。我對支持工程師說,要是能看到瀏覽器擴展和NMH之間交換的JSON信息,也許就能幫我們找到問題的根源所在。

"我們需要像Fiddler這樣的工具來監視NMH信息,而不是HTTPS信息。"

這有什麼難的?

從技術上講,我並不熟悉與瀏覽器擴展有關的東西,所以,在排除了我能想到的幾個可能的根源問題後,我就忙其他的事情去了。

但這一構想一直縈繞在我的腦海里:像Fiddler一樣的工具,但用於檢查本地信息傳遞。

建立這個系統有多難?會有多大用處?

自從2015年底「拋棄」Fiddler和Telerik後,我就沒寫過多少C#代碼;偶爾寫一點,大多也是Fiddler的插件,而不是獨立的應用程序。不過,Native Messaging遠沒有HTTPS那麼複雜,所以應該不會太難,對吧?

我們希望在調試器中實現以下功能:

顯示從瀏覽器擴展到Native Host的信息

允許將這些信息記錄到一個文件中

允許在任何方向上注入任意的消息

(擴展目標)允許修改這些消息

在接下來的幾個晚上,我打開塵封多年的Visual Studio IDE,努力回憶C#異步編程的工作方式。

關於NativeMessaging Meddler

NativeMessaging Meddler的源代碼和編譯版本都可以從GitHub下載。

NativeMessaging Meddler(NMM)是一個基於.NET 4.8的Windows應用程序。它的底部提供了一行選項卡,以便於我們在不同的選項卡之間進行切換;在默認情況下,直接運行.exe程序的話,它僅顯示幫助文本:

NMM工具可以響應來自瀏覽器擴展本身的NativeMessages,也可以代理現有擴展和現有NMH可執行文件之間的消息。

安裝Demo擴展

要測試該工具的基本功能,您可以安裝Demo Extension:

在Chrome或Edge中訪問about://extensions

啟用開發者模式

按下Load Unpacked按鈕

選擇sample-ext文件夾

一個新的 "N "圖標將出現在工具欄上

安裝完演示擴展後,還必須註冊演示的Native Host應用。為此,請更新其清單,以反映您放置它的位置。

使用記事本或類似編輯器打開manifest.json文件

將path字段設置為.exe的完整路徑。確保反斜槓都是成對使用的。

將allowed_origins字段設為來自about:extensions頁面中的擴展的ID值。

接下來,更新註冊表,以便瀏覽器能夠找到您的主機:

在記事本中編輯installregkeys.reg文件,更新文件路徑以指向manifest.json文件的位置。確保反斜槓都是成對使用的。

雙擊InstallRegKeys.reg文件將其導入註冊表。

運行演示擴展

安裝好了主機和擴展後,現在就可以測試該工具了。從工具欄中的擴展點擊「N」圖標,導航到它的演示頁面。這時,NMM的實例應自動打開。

在Outgoing Messages框中鍵入「Hello World!」,單擊Post Message to port按鈕。這時,該消息應該出現在NMM應用程序內的Monitor選項卡上:

如果你勾選右上方的「Reflect to extension」選項,然後再次發送消息,應該會看到NMM工具收到消息,並將其發回該擴展的頁面,並展示在「Incoming Messages」部分。

「Reflect to extension」將收到的信息複製給發送方

如果我們想通過NMM注入我們選擇的新信息,該怎麼辦?

進入NMM的Injector選項卡,在底部輸入框中輸入一個簡單的JSON信息。然後,點擊「Send to Browser/Extension」按鈕。這時,我們會看到該信息出現在瀏覽器內的「Incoming Messages」部分。

注意:你的信息必須是格式正確的JSON,否則它將永遠無法到達。

好了,我們現在已經能夠成功地使用NMM工具來接收和發送來自Demo擴展的消息了。

代理消息

雖然我們的演示擴展很適合測試Native Messaging功能,而且如果我們正在開發一個使用Native Messaging功能的新擴展,它可能會對模擬有所幫助,但本文的重點是監視現有擴展與主機之間的通信。

好了,那就開干吧。

首先,轉到Configure Hosts選項卡,該選項卡在註冊表中搜索您的PC上當前註冊的所有本機主機(Native Host):

我們的計劃是最終讓攔截本機主機成為一種點擊式體驗,但目前,我們只是使用該選項卡來查找我們要攔截的本機主機的文件系統位置。如果某個條目多次出現,請選擇優先級最低的實例。

例如,假設我們對Chrome瀏覽器中一些Windows-to-Web身份驗證場景中使用的BrowserCore主機感興趣。我們可以看到清單文件的位置,以及從清單文件中提取的EXE的名稱:

在某些情況下,您可能會發現Exe字段顯示「???」,如上面的vidyo條目那樣。這是因為,如果清單文件無法解析為合法的JSON,就會出現這種情況。Chromium在寬鬆模式下使用定製的JSON解析器來解析清單,它允許JavaScript風格的注釋。但是NMM工具使用嚴格的JSON解析器,無法解析這些注釋。不過,這對我們的目的來說並不重要。

注意清單文件的位置,並在您選擇的編輯器中打開它。注意:如果該文件在特權位置,您可能需要以更高的權限來打開您的編輯器(以管理員身份)。

提示:您可以通過Alt+DblClick選擇一個項目,或者在選擇該項目時點擊Alt+Enter,以打開Windows資源管理器,找到清單的位置。

在清單中,通過在文件名末尾的.exe前引入.proxy一詞來改變路徑字段。

然後,請保存該文件。

注意:在某些情況下,即使是管理員也無法在默認情況下寫入該文件。在這種情況下,你需要使用管理員的權限來取得文件的所有權,以授予自己修改文件的權限。

當然,也還有其他不需要改變文件系統權限的方法,但我們在這裡就不做介紹了。

接下來,將nmf-view.exe文件複製到包含Native Host的文件夾中,並將其重命名為前面寫入清單的文件名。

現在,我們已經成功安裝了NMM代理。每當瀏覽器擴展下次試圖啟動Native Host時,它就會激活我們的NMM調試器,而NMM調試器又會生成原始的Native Host(在本例中是BrowserCore.exe),並代理兩者之間的所有信息。

現在,請訪問一個您可以登錄的網站,如https://office.microsoft.com。然後,點擊右上方的登錄按鈕,監視我們的調試器生成的Native Host,收集來自Windows 10 Accounts擴展的請求,將其傳遞給BrowserCore.exe,讀取Host的回覆,並將其傳回擴展。我們的調試器允許我們從兩個方向讀取JSON消息的全文。

注意:這個截圖是經過編輯的,因為它包含秘密令牌。

乾的漂亮,是吧?

篡改消息

當我完成所有這些工作時,我很興奮。同時,我也很失望……JSON的純文本渲染並不具有很好的可讀性,而且建立一個編輯消息的用戶界面工作量也很大。我感嘆……我在15年前就已經為Fiddler寫好了我想要的所有代碼。它同時具有JSON渲染和消息編輯功能……但是,現在我已經不再使用Fiddler,所以不能直接複製其源代碼了。

然後,我突然想明白了。我不需要在NMM中重新實現Fiddler的部分功能。我可以讓這些工具協同工作:NMM可以把它從瀏覽器擴展和Native Host收到的信息傳遞給Fiddler,如果Fiddler修改了信息,NMM就可以用修改後的信息來替代。

太棒了!

配置篡改過程

首先,重新編輯manifest.json文件,在路徑中添加一個.fiddler組件,並將.proxy.exe文件重命名為.proxy.fiddler.exe,具體如下所示:

這段新的文字預示着你希望NMM開始使用Tamper using Fiddler選項設置。為了調試像BrowserCore.exe這樣的「single-shot」本地主機,我們不能直接使用NMM的監控選項卡右上方的複選框,因為調試器和本地主機生成和完成事務的速度比我們這些弱小的人類點擊鼠標的速度快得多。注意:您也可以指定字符串.log.,以啟用將流量日誌寫到桌面上的選項。

現在,啟動Fiddler;可以使用-noattach命令行參數,這樣它就不會註冊為系統代理。在Web Sessions列表下的QuickExec框中輸入bpu ToApp並按回車鍵。

這將創建一個請求斷點,對所有包含ToApp字符串的請求都會觸發該斷點,NMM用它來記錄發送到原始Native Host的請求。

通過Fiddler的檢查器,我們可以使用JSON Treeview、TextView或SyntaxView檢查器來檢查消息的JSON。

如果我們對消息感到滿意,請點擊Run to Completion按鈕,這時,NMM應用程序就會把未經修改的原始消息發送到原始的Native Host。然而,如果我們想篡改消息,可以從下拉菜單中挑選一個成功響應,如200_SimpleHTML.dat:

這時,模板響應將出現在響應文本視圖中:

現在,請用您想要使用的文本覆蓋模板文本:

……然後按綠色「Run to Completion」按鈕。這時,Fiddler將修改後的文本返回給NMM代理,然後NMM代理將修改後的消息傳遞給原始Native Host:

就這裡來說,原始Native Host並不知道如何處理GetFiddledCookies請求,所以,它會返回一個錯誤,而該錯誤將傳回瀏覽器。

提示:如果您的目標是篡改從Native Host發送到擴展的消息,請在Fiddler的QuickExec框中輸入bpu ToExt。或者,您也可以使用Fiddler的其他篡改功能,比如讓它只攔截包含某些文本的消息,自動重寫某些消息,等等。

祝您閱讀愉快!

參考及來源:https://textslashplain.com/2022/01/08/debug-native-messaging/

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()