搜狗用这个骚技术,把百度逼上了绝路。。。
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]
前几天在百度搜索的时候,一不小心误点搜索候选词,给我跑到搜狗搜索里面去了,索性花了点时间分析一下这其中的猫腻,不看不知道,一看吓一跳。
在浏览器中打开百度,使用搜狗输入法输入关键词时将出现搜索候选词列表:
![](https://filescdn.proginn.com/927cddde5ad9d91b8432246f5c4a1c12/abe806a44805a56ab414fa4c6f8e3141.webp)
随便点击列表中的某一个选项后,页面跳转到了搜狗搜索的结果页:
![](https://filescdn.proginn.com/353019902f0e77e349dc9b0c9f638d3f/35a3b67ea8711dc0e0652ec773b4d6ad.webp)
测试实验
测试1:360搜索输入框并没有这个候选词列表,如下图:
![](https://filescdn.proginn.com/4bd78c4a1dc7a6c57254b4591c7f51d2/ec7f1563906c80238f0041f0fa4536db.webp)
结论1:搜狗输入法应该是对当前打开的页面有判断,不是随便哪个网页下面的输入框都会出现这个列表
测试2:在百度页面,除了主要的搜索框以外,其他入口也会出现这个搜索选项列表,下面是站点内搜索输入框的测试:
![](https://filescdn.proginn.com/1b2509635fae21c6b6c4ed96806db909/0832c0a660b674dbf4c24cf6058a7e45.webp)
结论2:搜狗输入法没有判断当前输入框目标是不是搜索框
测试3:这一次不用域名,换用IP地址来访问百度搜索。我的环境下ping www.baidu.com 解析的IP地址为:220.181.38.149,结果搜狗输入法竟然没有出现这个搜索选项列表:
![](https://filescdn.proginn.com/45e9c786b5e3ab3819cf54ce9a116fde/6f0141111a7a6e13d127d04e46580318.webp)
结论3:这个搜索选项列表的出现跟网页当前的URL有关
测试4:这一次来把浏览器的进程名字改一下,我这里选择火狐浏览器,将firefox.exe改为firefox1.exe,这个搜索选项列表也没有出现:
![](https://filescdn.proginn.com/882f9eefbdaaa75ddee3efdde4aeb8c9/652bd1be9236c83c0932814a0959c022.webp)
结论4:除了URL,对进程名字也有判断,如果不是浏览器进程,也不会触发
最终结论:搜狗输入法检测到用户打开浏览器访问www.baidu.com域名进行搜索时,将弹出搜索选项列表,引导用户点击。
技术分析
如何实现浏览器进程筛选?
第一个问题,搜狗输入法怎么判断当前是不是在浏览器进程中呢?总不能在微信聊天界面也给弹出搜索候选词列表吧?
搜狗输入法核心模块是一个叫SogouPY.ime的文件,这实际上是一个动态链接库文件,这个文件会随你切换输入法时加载到对应的进程中。使用IDA打开分析,发现这个模块内部有很多浏览器进程名字的字符串:
![](https://filescdn.proginn.com/cfb80188a3569878495b08bfe789e27b/401d09a0552b04f52cfc7646fd4ea5e3.webp)
你看,国内外主流的和非主流的浏览器基本都被列为了目标。
进一步分析发现,上面这是一个字符串数组,找到了遍历这个数组,挨个进行比较匹配的处理逻辑:
![](https://filescdn.proginn.com/bf34ebea0843f8a44fc1cb5802dd9ff0/283cf57f747d926f4080f7a9d3ce1d30.webp)
当前页面的URL获取及判断
浏览器进程筛选出来了,还要筛选当前是不是在搜索引擎的页面,接着往下看!
针对不同浏览器使用不同的获取方式,这里以firefox为例,搜狗输入法使用了MSAA(Microsoft Active Accessibility)技术获取到了当前页面URL。
调试发现,如果修改获取到的URL内容,搜狗输入法的搜索选项列表就无法展示出来。
向上追溯可以找到根据不同浏览器进行不同的URL获取方式分发入口:
![](https://filescdn.proginn.com/bb2cd3c66096c6bb8896bb975900e6b1/4de7f0bd9692e01163bb65f53eb2e46e.webp)
继续追溯,获取当前浏览器信息后,还要进行是否是搜索引擎域名的判断:
![](https://filescdn.proginn.com/1a0e49e278bbed0cb6c74f99c64f2e50/26f6ca2bd2da1a49c9278b38b7838197.webp)
这个wcsstr函数就是在进行字符串比较了,调试得到wcsstr()的参数1:获取到的页面URL,参数2:搜索引擎域名。又是用一个数组在进行存储:
![](https://filescdn.proginn.com/e7455c8591e9607d3dd12be8ea4b5f71/8a73c5fe349a02e58ce987c12d8438b0.webp)
百度居然还有个小名,www1.baidu.com,有意思。
我们来挨个试一下这个列表中的搜索引擎:
www1.baidu.com:
![](https://filescdn.proginn.com/743e255ef8ce929e38fafe86f454b850/75df811cc6e7933bdf0aca5c90aa77f7.webp)
www.soso.com:
这个就不用试了,现在是搜狗自家人。
cn.bing.com:
![](https://filescdn.proginn.com/2e1c9cb46c738aeb96481bfd12c12cd5/86b4016ee9e62b27bf2a28eff815df66.webp)
www.google.cn:
![](https://filescdn.proginn.com/6767b4c52a98a3d4be50b8ffd3f03cd5/aa5dfe88235928a7fb1d40c9a0ddba47.webp)
so.sowang.com:
![](https://filescdn.proginn.com/f1348dfeb785c6747952f535df799350/95048d80ac587b61b99353d970871acd.webp)
www.chinaso.com:
![](https://filescdn.proginn.com/56d60fbfb06941cd080b9b39a1085244/b61d9b1d0dca04c9657cd7fc2dc2077e.webp)
www.youdao.com:
![](https://filescdn.proginn.com/5a07cd12c5fd9b6a28bede2a6095725d/b3f5062a3fb996accf6436bbb901099e.webp)
www.zhongsou.com:
![](https://filescdn.proginn.com/daab12318e73085fa12d62423713c5f9/ffa00dc6be562b5c65d7228f01e664b2.webp)
如何打开搜狗搜索页面呢?
当发现是在浏览器进程中访问上面的搜索引擎域名后,就该跳转到搜狗自己的搜索页面了,那它是如何打开的呢?继续往下看!
打开firefox,使用调试器WinDbg 挂载到这个进程,执行这个命令:bp shell32!ShellExecuteW,给函数ShellExecuteW下断点。
接着打开百度首页,切换到搜狗中文输入法,这样使得SoGouPY.ime模块加载到firefox的进程空间中。
然后随意输入字符,出现搜狗搜索选项列表,随便点击一个,触发断点!来看一下参数:
![](https://filescdn.proginn.com/e96dd03f58ac9302bc65bdb063771b5d/ed5846b767ca4854f7442e634a9fe68b.webp)
可以看到:这里通过启动当前浏览器(firefox.exe)打开了URL。根据堆栈返回地址,可以进一步往前分析。
IDA反汇编太多,就不截图了。总体来说,判断当前浏览器是否是IE内核,如果是,就通过获取到浏览器IWebBrowser2接口指针,调用接口中的Navigate2方法来打开搜狗搜索页面。如果不是IE内核,直接调用ShellExecuteW打开URL。
那如何判断是不是IE内核呢?
可以看搜狗的做法:获取当前浏览器类别,内部通过进程名、当前焦点窗口的Class名(”Internet Explorer_Server”)综合判断:
![](https://filescdn.proginn.com/a7787d450fb68c304d9ddb7e96a2ab56/dd0ccd596a982ae2b0ea70767fd10c3c.webp)
总结
和实验得到的结论一致。
一图胜千言,整个过程就是这个样子的:
![](https://filescdn.proginn.com/49fed6e5fb52266f95dd551dc003001a/32351b133f1e6e41c123c6d6f799f58c.webp)
多说几句
事实上,搜狗干这事已经有好些年了。几年前,百度还把搜狗给告了,搜狗败诉赔钱。不过,输了是输了,就是坚决不改。。。
![](https://filescdn.proginn.com/a6e16440bb7685abe6495ecabc7d803a/4af680a4e5162fdc8153b07638887450.webp)
对于搜狗输入法的这骚操作,你怎么看?
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,留言、点赞、在看和分享一条龙吧❤️