時間:2023-08-06|瀏覽:277
測試實驗
測試1:360搜索輸入框并沒有這個候選詞列表,如下圖:
結論1:搜狗輸入法應該是對當前打開的頁面有判斷,不是隨便哪個網頁下面的輸入框都會出現這個列表。
測試2:在百度頁面,除了主要的搜索框以外,其他入口也會出現這個搜索選項列表,下面是站點內搜索輸入框的測試:
結論2:搜狗輸入法沒有判斷當前輸入框目標是不是搜索框。
測試3:這一次不用域名,換用IP地址來訪問百度搜索。我的環境下ping www.baidu.com解析的IP地址為:220.181.38.149,結果搜狗輸入法竟然沒有出現這個搜索選項列表:
結論3:這個搜索選項列表的出現跟網頁當前的URL有關。
測試4:這一次來把瀏覽器的進程名字改一下,我這里選擇火狐瀏覽器,將firefox.exe改為firefox1.exe,這個搜索選項列表也沒有出現:
結論4:除了URL,對進程名字也有判斷,如果不是瀏覽器進程,也不會觸發。
最終結論:搜狗輸入法檢測到用戶打開瀏覽器訪問www.baidu.com域名進行搜索時,將彈出搜索選項列表,引導用戶點擊。
技術分析
如何實現瀏覽器進程篩選?
第一個問題,搜狗輸入法怎么判斷當前是不是在瀏覽器進程中呢?總不能在微信聊天界面也給彈出搜索候選詞列表吧?
搜狗輸入法核心模塊是一個叫SogouPY.ime的文件,這實際上是一個動態鏈接庫文件,這個文件會隨你切換輸入法時加載到對應的進程中。使用IDA打開分析,發現這個模塊內部有很多瀏覽器進程名字的字符串:
你看,國內外主流的和非主流的瀏覽器基本都被列為了目標。
進一步分析發現,上面這是一個字符串數組,找到了遍歷這個數組,挨個進行比較匹配的處理邏輯。
當前頁面的URL獲取及判斷
瀏覽器進程篩選出來了,還要篩選當前是不是在搜索引擎的頁面,接著往下看!
針對不同瀏覽器使用不同的獲取方式,這里以firefox為例,搜狗輸入法使用了MSAA(Microsoft Active Accessibility)技術獲取到了當前頁面URL。
調試發現,如果修改獲取到的URL內容,搜狗輸入法的搜索選項列表就無法展示出來。
向上追溯可以找到根據不同瀏覽器進行不同的URL獲取方式分發入口。
繼續追溯,獲取當前瀏覽器信息后,還要進行是否是搜索引擎域名的判斷:
這個wcsstr函數就是在進行字符串比較了,調試得到wcsstr的參數1:獲取到的頁面URL,參數2:搜索引擎域名。又是用一個數組在進行存儲。
百度居然還有個小名,www1.baidu.com,有意思。
我們來挨個試一下這個列表中的搜索引擎:
www1.baidu.com:
www.soso.com:
這個就不用試了,現在是搜狗自家人。
cn.bing.com:
www.google.cn:
so.sowang.com:
www.chinaso.com:
www.youdao.com:
www.zhongsou.com:
如何打開搜狗搜索頁面呢?
當發現是在瀏覽器進程中訪問上面的搜索引擎域名后,就該跳轉到搜狗自己的搜索頁面了,那它是如何打開的呢?繼續往下看!
打開firefox,使用調試器WinDbg掛載到這個進程,執行這個命令:bp shell32!ShellExecuteW,給函數ShellExecuteW下斷點。
接著打開百度首頁,切換到搜狗中文輸入法,這樣使得SoGouPY.ime模塊加載到firefox的進程空間中。
然后隨意輸入字符,出現搜狗搜索選項列表,隨便點擊一個,觸發斷點!來看一下參數:
可以看到:這里通過啟動當前瀏覽器(firefox.exe)打開了URL。根據堆棧返回地址,可以進一步往前分析。
總體來說,判斷當前瀏覽器是否是IE內核,如果是,就通過獲取到瀏覽器IWebBrowser2接口指針,調用接口中的Navigate2方法來打開搜狗搜索頁面。如果不是IE內核,直接調用ShellExecuteW打開URL。
那如何判斷是不是IE內核呢?
可以看搜狗的做法:獲取當前瀏覽器類別,內部通過進程名、當前焦點窗口的Class名("InternetExplorer_Server")綜合判斷。
總結
和實驗得到的結論一致。
一圖勝千言,整個過程就是這個樣子的。
多說幾句
事實上,搜狗干這事已經有好些年了。幾年前,百度還把搜狗給告了,搜狗敗訴賠錢。不過,輸了是輸了,就是堅決不改。
這就是互聯網黑幕的冰山一角。
文章來源:科技料