本文来源于:Coding这件小事

前几天在百度搜索的时候,一不小心误点搜索候选词,给我跑到搜狗搜索里面去了,索性花了点时间分析一下这其中的猫腻,不看不知道,一看吓一跳。

在浏览器中打开百度,使用搜狗输入法输入关键词时将出现搜索候选词列表:

随便点击列表中的某一个选项后,页面跳转到了搜狗搜索的结果页:

测试实验

测试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。根据堆栈返回地址,可以进一步往前分析。

IDA反汇编太多,就不截图了。总体来说,判断当前浏览器是否是IE内核,如果是,就通过获取到浏览器IWebBrowser2接口指针,调用接口中的Navigate2方法来打开搜狗搜索页面。如果不是IE内核,直接调用ShellExecuteW打开URL。

那如何判断是不是IE内核呢?

可以看搜狗的做法:获取当前浏览器类别,内部通过进程名、当前焦点窗口的Class名(”Internet Explorer_Server”)综合判断:

总结

和实验得到的结论一致。

一图胜千言,整个过程就是这个样子的:

多说几句

事实上,搜狗干这事已经有好些年了。几年前,百度还把搜狗给告了,搜狗败诉赔钱。不过,输了是输了,就是坚决不改。。。

对于搜狗输入法的这骚操作,你怎么看?

最近热文:

2020最新Java学习路线图,附配套视频!

那个割肾换iPhone的男生,现在怎么样了?

卧槽,放假7天时间,大神直接造了台计算机!

火遍全网的中文版 PDF ,速度安排下载!

IDEA 2020.2 最新破解教程,有效期到2089年!

2T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,软考,英语,等等。在公众号内回复「资源」,即可免费获取!

喜欢文章,点个在看

搜狗用这个骚技术,把百度气的吐血了!相关推荐

  1. jar 工程我怎么在网页上url访问某一个方法_搜狗用这个骚技术,把百度逼上了绝路。。。...

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 前几天在百度搜索的时候,一不小心误点搜索候选词,给我跑到搜狗搜索里面去了,索性花了点时间分析一下这其中的猫腻,不看不知道,一看吓一跳. 在 ...

  2. 搜狗用这个骚技术,把百度逼上了绝路...

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 前几天在百度搜索的时候,一不小心误点搜索候选词,给我跑到搜狗搜索里面去了,索性花了点时间分析一下这其中的猫腻,不看不知道,一看吓一跳. 在 ...

  3. 从SEO效果看谷歌百度360搜狗有道bing技术现状

    为什么80%的码农都做不了架构师?>>>    从SEO效果看谷歌百度360搜狗有道bing技术现状声音 maybe yes 发表于2015-08-20 16:52 原文链接 : h ...

  4. 搜狗与360加紧抢食百度份额

    "可能阿里最终还是要做搜索的,搜狗也要做搜索,是否会有业务冲突?其中原因还是要问王小川."在搜狗与阿里这段恋情宣告结束的那天晚上,360董事长周鸿祎正准备第二天的特供机发布会,一向 ...

  5. 百度与华为重磅合作!李彦宏:技术是百度的信仰

    导语:这是百度第三年举办AI开发者大会.一生二,二生三,三生万物.AI虽然不能产生万物,但是正在"唤醒万物". 作者 | 阿司匹林 出品 | AI科技大本营(ID:rgznai10 ...

  6. 语音技术(百度语音)开发 - 第一篇

    语音技术(百度语音)开发 - 第一篇 AI接入指南 短语音识别标准版.查看文档 短语音识别API文档 .调用流程.speech 参数填写.参数说明.等等 官方demo地址 创建应用.百度云平台 网上案 ...

  7. Ocr 图文识别技术——基于百度云OCR技术学习与总结

                                                               Ocr 图文识别技术--基于百度云OCR技术学习与总结 1.百度智能云 控制台   ...

  8. 移动端地图技术分享 百度高德SDK

    移动端地图技术分享 字数4797 阅读8121 评论7 喜欢16 http://www.jianshu.com/p/41179be5893a 该文章属于<简书 - 刘小壮>原创,转载请注明 ...

  9. 黑帽SEO技术教程百度网盘收集

    相关关键词:  黑帽seo  大神 最新百度快速排名,百度引蜘蛛代码 http://pan.baidu.com/s/1qwbWV 最新PHP目录轮链程序下载,黑帽SEO http://pan.baid ...

最新文章

  1. Could not initialize class org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImplKt
  2. linux生日_代码简介:让我们用25个Linux事实来庆祝Linux的25岁生日。
  3. MVC匿名类传值学习
  4. 火狐浏览器pentadatyl插件的基本设置
  5. 攻防世界Reverse第九题no-strings-attached
  6. AdaBoost算法详解与python实现
  7. java 循环map 优雅写法_Java for循环Map集合优化实现解析
  8. 【机器学习】sklearn实现---归类为5大类
  9. 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
  10. python爬取CVPR2018关于detection的论文
  11. MSP430杂谈--IIC通信
  12. Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 64 bytes) in D
  13. 福建工程学院计算机专利,基于车床硬件平台的再制造数控滚齿机专利_专利查询 - 天眼查...
  14. TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
  15. 如何在 Windows Server 2003 中配置权威时间服务器
  16. 在WPF里面实现以鼠标位置为中心缩放移动图片
  17. java 字符单词匹配_如何使用Java RegEx匹配单词字符?
  18. 加号和减号在一起怎么读_数学符号里的“加减”是“±”,那么“减加”怎么打?求高手!!!!!!!!! word中加号和减号放在一起怎么打出来?...
  19. 瑞星千万巨款贿赂官员 制造冤狱铲除竞争对手图片
  20. Programming Languages PartA Week4学习笔记——SML函数式编程

热门文章

  1. 达达开放平台php,【即时配送】达达开放平台授权绑定提示“已开通其他渠道”?...
  2. 路由器打印机虚拟服务器,怎么用路由器设置打印机服务器
  3. JAVA POI拆分合并的单元格
  4. python图像去雾算法实现
  5. 牛客复试上机题 日期问题:
  6. python绘制堆叠图_python
  7. (九)office2016-excel快速求和
  8. linux中的su-命令的功能,Linux中su命令起什么作用呢?
  9. 人工智能芯片龙头之一gti概念股_芯片概念股有哪些?芯片概念股龙头一览
  10. Docker系列 WordPress系列 国服最强博客看板娘没有之一