点击上方[全栈开发者社区]右上角[...][设为星标⭐]

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

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


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


测试实验

测试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”)综合判断:


总结

和实验得到的结论一致。

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


多说几句

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


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

觉得本文对你有帮助?请分享给更多人

关注「全栈开发者社区」加星标,提升全栈技能

本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!

如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。

好文章,留言、点赞、在看和分享一条龙吧❤️

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

  1. jar 工程我怎么在网页上url访问某一个方法_url及url参数与seo网站优化的关系

    短视频,自媒体,达人种草一站服务 首先我还是援引下百度百科关于url的定义. 统一资源定位符(Uniform Resource Locator,缩写为URL)是对可以从互联网上得到的资源的位置和访问方 ...

  2. jar 工程我怎么在网页上url访问某一个方法_Java高级编程之URL处理

    URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是如处理URL的.URL ...

  3. php重定义地址栏url,thinkphp框架实现路由重定义简化url访问地址的方法分析

    本文实例讲述了thinkphp框架实现路由重定义简化url访问地址的方法.分享给大家供大家参考,具体如下: 如果按照正常访问的话,则需要输入一长串的url地址,这样会显得十分冗长,我可以可以通过对路由 ...

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

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

  5. ftp上传当天文件的方法_五种方法将文件上传到FTP服务器

    您知道电脑硬盘是如何读取和存储数据的吗?恢复软件是如何找回数据的吗?通过这个视频教程,你将了解你丢失的数据是否还在,这些文件能否找回. 请点击 - >>>> 观看视频 如何安全 ...

  6. 如何从几何角度上理解方程组只有一个解_深度科普---电磁波(三):无激励下的真空中的Maxwell方程组的解...

    很久没有写过与自己专业相关的文章了,于是计划穿插进几篇有关电磁波的深度科普的文章.计划分为几个部分: 1. 真空中的 方程组 2. 材料中的 方程组和电磁场的边值条件 3. 无激励下的真空中的 方程组 ...

  7. html局部可复制,截取网页局部区域css样式的方法和系统的制作方法

    截取网页局部区域css样式的方法和系统的制作方法 [技术领域] [0001]本发明涉及计算机网络技术领域,特别是涉及一种截取网页局部区域CSS样式的方法和系统. [背景技术] [0002]CSS(Ca ...

  8. Magento教程 12:Magento快速上传大量商品的方法

    利用.CSV档上传大量商品是最佳选择 在Magento上传大量商品到时,经常会遇到的几个问题,非常耗时间.出现错误.有部分商品是缺货状态. 当你有上百个不同属性的商品,而且只有部分商品是现货供应的情况 ...

  9. html网页打不开二级网页,二级网页打不开的解决方法

    现浏览器能打开网站主页,但网站内的其他页面打开处于加载状态,或加载页面错误,或点击链接没反应等等现象.有可能是IE组件或内核异常,或注册表异常导致的.下面是学习小编给大家整理的有关介绍,希望对大家有帮 ...

最新文章

  1. python 保存网页到印象笔记_如何将网页内容保存到印象笔记?
  2. linux 手动睡眠
  3. 03.JavaScript对DOM操作
  4. Flutter Exception降到万分之几的秘密 1
  5. 结对作业2:单元测试
  6. 5G iPhone若推迟至10月发布 将会拉低苹果两个财季营收
  7. qt插件开发框架搭建_Flutter框架之:开发环境搭建
  8. aix 文件升级-替换
  9. Access SqLDbHelper
  10. 关于redis启动流程介绍
  11. 《Linux命令行大全》第2版来啦!这一版做了哪些更新?
  12. linux war 权限,Linux中mv重命名作用及打包war压缩文件及分配权限
  13. 实验四 图像复原及几何校正
  14. linux+开机启动sshd_Linux sshd服务自动启动
  15. JavaSE学习笔记(七)(常用类)
  16. vue端口号被占用报错npm ERR! @1.0.0 dev: `node build/dev-server.js`
  17. 什么叫做私有网络VPC?
  18. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
  19. linux (ubuntu)安装包安装sublime
  20. ug安装lmtools显示未连接服务器,服务器(LMTOOLS)设置教程

热门文章

  1. Windows 8 IIS中配置PHP运行环境的方法
  2. Spring使用@Required注解依赖检查
  3. C#正则表达式MatchCollection类浅析
  4. Spring 声明式事务处理....XML
  5. 计算机竞赛作文,计算机打字比赛作文例文
  6. 从数据结构角度分析foreach效率比for循环高的原因
  7. CSS五种水平居中:text-align margin incline-block flex relative
  8. Linux字符串三剑客笔试题集合
  9. Bug貌似发现了centos系统配置host主机的问题
  10. Yii的GridView