6月27日,因搜狗输入法通过搜索候选词为搜狗搜索导流量,奇虎公司、百度公司,以及动景公司和神马公司分别起诉搜狗公司不正当竞争。
海淀法院对三案集中宣判认定搜狗公司构成不正当竞争,应停止不正当竞争行为,分别为三案原告公开消除影响,向奇虎公司、百度公司各赔偿经济损失500万元等,向动景公司和神马公司共赔偿2000余万元。
这个案件争议主要体现为两种情形:
一是在浏览器环境下登录百度搜索引擎网站、360搜索引擎网站,用户在搜索框中搜索时,因使用搜狗输入法并点击了搜索候选词而直接进入搜狗搜索网站;
二是用户在360手机浏览器和UC浏览器顶部栏中搜索时,因使用搜狗输入法并点击了搜索候选词而直接进入搜狗搜索网站。
争议焦点主要集中在浏览器环境下的搜索用户流量归属、搜索候选词是否对用户造成服务来源的混淆以及技术创新、用户选择权等因素对诉争行为性质的影响等方面。
在2015年时,看雪会员就曾对搜狗输入法恶意劫持流量的事件,进行过详细的技术分析,内容如下:
1、搜狗输入法版本
7.5.0.5674
2、现象
1) 在浏览器中使用百度搜索引擎输入关键词时将出现搜索选项列表,点击后跳转至搜狗搜索,如下图所示:
3、测试实验
1)搜狗输入法并不劫持360搜索,如下图:
结论:说明搜狗输入法对当前打开的页面有判断,猜测是通过页面URL进行了判断。
2)百度页面除了搜索框其他入口也会触发该搜索选项列表出现,如下图在登录框输入文本时也触发了搜狗搜索选项列表:
结论:搜狗输入法并未对输入文本框目标进行判断
3)使用IP地址代替域名打开百度首页
测试机 ping www.baidu.com得到的IP地址为:61.135.169.121,结果搜狗输入法未出现搜索选项列表,如图所示:
结论:本次实验一定程度上验证了实验1)的猜想。该搜索选项的出现跟网页当前URL有关系。
4)实验中将浏览器可执行文件做修改,如将firefox.exe改为firefox1.exe,则该搜索选项列表同样未能出现:
结论:搜狗输入法对当前进程有判断,如果不是浏览器进程将不会触发搜索选项列表。
5)最终结论:搜狗输入法在用户打开浏览器访问www.baidu.com进行搜索时,将出现搜索选项列表,诱导用户点击打开搜狗搜索,从而实现恶意劫持百度搜索流量的目的。
4、技术分析
1)进程筛选
搜狗输入法核心模块为SogouPY.ime,实质为一个DLL文件。使用IDA打开分析,加载基址为:0x177C0000,其模块内部有如下逻辑:
将所有常见浏览器可执行文件名硬编码存入全局字符串数组,并将当前进程exe文件名在列表中遍历,获取其在列表中的索引,若未找到,则返回-1,下面是IDA反汇编结果:
2)当前页面URL获取及判断
针对不同浏览器使用不同的获取方式,这里以firefox为例,搜狗输入法使用了MSAA(Microsoft Active Accessibility)技术获取到了当前页面URL,相关详情可参考如下链接:http://www.cnblogs.com/wxxweb/archive/2012/01/09/2317094.html
在SogouPY.ime模块中,函数sub_17833900 便是该代码的实现,用于获取firefox浏览器中当前页面URL地址。调试发现,若篡改获取到的URL内容,则会阻止搜狗输入法打开搜索选项列表。另外该函数除了获取URL,还获取HTML的Title字段。
向上追溯得到获取页面信息总分发入口:根据浏览器不同类别从不同方法获取。
继续向上追溯,获取当前浏览器信息后(浏览器类别、当前页面URL、当前页面Title等)后,进入了判断的环节。
函数sub_17D11B00内部根据上面获取到的URL判断是否是搜索引擎:
调试得到wcsstr的参数1:获取到的页面URL,参数2:
顺便让我知道了世界上还有个www1.baidu.com,火星了。比照这些搜索引擎挨个试了一下(前面两个不用试了吧):
www1.baidu.com:
cn.bing.com:
www.google.cn:
so.sowang.com:
www.chinaso.com:
www.youdao.com:
www.zhongsou.com:
这里与前面的实验1比较冲突的是对www.haosou.com并没有展开这个搜索候选词列表。猜测应该是有其他的云控策略在决定,暂时未分析到。
3)搜狗搜索打开点:
打开firefox,使用WinDbg Attatch该进程,执行命令:bp
shell32!ShellExecuteW,给函数ShellExecuteW下断点。打开百度首页,切换搜狗中文输入法,随意输入字符,出现搜狗搜索选项列表,点击其中一个,命中断点!
这里看出:这里通过启动当前浏览器(firefox.exe)打开了URL。
根据堆栈返回地址,分析该调用来自函数sub_17812DF0 。
IDA反汇编太多,不便截图。总体来说,该函数判断当前浏览器如果是IE内核,则通过获取到浏览器IWebBrowser2接口指针,调用其Navigate2方法访问搜狗搜索页面。
如果是非IE内核,则调用上面的ShellExecuteW打开URL。
判断方法同2)中的Sogou_GetWebBrowserType(sub_178356D0),该函数获取当前浏览器类别,内部通过进程名、当前焦点窗口窗口类名(”Internet Explorer_Server”)综合判断进行分类。下面是IDA反汇编逻辑部分截图:
5、总结
和实验得到的结论一致:
1、搜狗输入法判断当前是否是浏览器进程。
2、根据当前焦点窗口句柄,进一步根据不同浏览器获取当前打开的页面地址,标题等信息。
3、如果判断当前打开的是搜索引擎,则弹出搜索词候选框,引导用户点击。
4、用户点击后,在WM_LBUTTONUP消息中派遣函数中根据浏览器是否为IE内核来分别使用IWebBrowser2->Navigate2方法或ShellExecuteW打开搜狗搜索。
PS:这个进程跟搜狗输入法这个功能有非常大的关系,候选词列表正是该进程访问搜狗服务器获取到的。如果结束该进程,或禁用其网络功能,搜狗输入法这一功能就无法正常工作了。