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

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

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

测试实验

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

总结

和实验得到的结论一致。

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

多说几句

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

我知道你在看

绝了!搜狗输入法这骚操作!相关推荐

  1. 计算机考研压分的学校,篡改分数,恶意压分...考研院校的骚操作大盘点!小心避坑!...

    篡改分数,恶意压分...考研院校的骚操作大盘点!小心避坑! 摘要:对考研的同学来说,择校是至关重要的一环.尤其是在往届考生群中,大家讨论最多的就是要不要换学校.一些同学经历了被歧视.专业课压分 作者 ...

  2. 办公使用NAS服务器的作用,NAS存储服务器的作用有哪些?可以有哪些骚操作

    原标题:NAS存储服务器的作用有哪些?可以有哪些骚操作 对于企业及个人来说,PC硬盘及手机内存不够的情况是经常都能遇见的,这时候相信绝大多数的人都是想着去添加硬盘或者加内存来解决问题.但是喜欢深入了解 ...

  3. 五分钟没有操作自动退出_这又是什么骚操作??5只蚂蚁战略配售基金拟增设B类份额,自动赎回退出!!...

    他来了,他来了,这又是什么骚操作??昨天,五只创新未来18个月封闭运作混合型证券投资基金发布联合声明,会为这个战略配售基金安排一个月的退出选择期. 5只创新未来18个月封闭运作混合型证券投资基金发布联 ...

  4. GitHub 骚操作,个人页还能这么玩?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 之前写过一篇 GitHub 骚操作的文章 GitHub 竟 ...

  5. 杀疯了!通过游戏“元宇宙”,Deepmind让AI学会玩各种没玩过的游戏,骚操作不断...

    来源:大数据文摘本文约1800字,建议阅读7分钟 面对任务一看就会的AI,离我们心里的通用人工智能还有多远呢? 对于AI来说,完成一个单一任务或许相对简单,但是涉及到合作和博弈时,AI往往显得有些愚蠢 ...

  6. K项目的一些心得之全球模板里的几个骚操作

    K项目的一些心得之全球模板里的几个骚操作 1,数据迁移阶段,物料主数据分类视图里,batch class的代码跟物料号相同. 这意味着如果需要迁移的物料有1万个,导入程序会自动创建1万023类型的分类 ...

  7. git idea 可视化_那些你应该知道的,但是你一定不知道的 Git 骚操作

    Hello 大家好,作为团队中的主程阿粉经常参与很多核心功能的开发,而且很多时候一个需求没做好中间又插入新的紧急的需求或者 bug 修复,每次遇到这种情况,如果两个地方代码不冲突的话还好,可以直接在本 ...

  8. 笔记合并_.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  9. RabbitMQ 的这些骚操作你知道吗?

    RabbitMQ的Java客户端统一使用com.rabbitmq.client作为顶级包名.其中,最核心的类主要有:ConnectionFactory.Connection.Channel.Consu ...

最新文章

  1. PAT 1015__部分正确__已解决
  2. 计算机组成原理 — FPGA 现场可编程门阵列
  3. 初识OSGI.NET插件框架
  4. WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
  5. Mysql的键值对操作ELT FIELD
  6. Android 对okhttp的封装
  7. mybatis 乐观锁和逻辑删除
  8. java 停止线程播放音频_Notification 播放 关闭 声音----转载
  9. desktop docker 无法卸载_在docker-for-desktop OSX上删除kubernetes集群
  10. Pycharm 入门问题
  11. [恢]hdu 2317
  12. opencv3.4.3的DNN模块调用bvlc_googlenet.caffemodel实现图像分类
  13. quot;蓝筹quot;如何使程序猿?
  14. JavaScript Math.random()随机数函数
  15. 明显调用的表达式前的括号必须具有(指针)函数类型
  16. Thinkpad连续响4遍4个短嘀故障记录
  17. 保证线程安全的三种方式
  18. win7快捷关闭计算机,win7关机快捷键和重启快捷键是什么?
  19. 拼音表大全图_阿波罗 STM32F767 开发板资料连载第五十九章 T9 拼音输入法实验
  20. bugku(Crypto)---ook

热门文章

  1. wc 统计已过时,cloc 每一行代码都有效
  2. 2个8位移位寄存器驱动4位数码管
  3. 开源飞控ardupilot避障传感器的使用-1乐迪超声波避障SUI04
  4. 华为HCNP认证考试通过啦
  5. linux快速同步多台服务器之间的数据scp和rsync命令用法
  6. 天线增益——雷达基础知识
  7. CS144-Lab0
  8. Genesis10.0 安装教程
  9. android音乐播放器文章,Android论文音乐播放器文章.doc
  10. 读书笔记:写给大家看的设计书(第三版)