python获取输入法状态_绝了!搜狗输入法这骚操作!

公众号关注 “ 杰哥的IT之旅 ”, 选择“ 星标 ”, 重磅干货,第一 时间送达!

a81a9d55bae23ade08d6fb5cbc6a810f.png

转自:编程技术宇宙

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

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

b3c0cf7dff81b7a6200e2a759d9fe717.png

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

34057dedc99a541ef76cc7b11e3d77c4.png

测试实验

测试1:360搜索输入框并没有这个候选词列表,如下图:

d000d747d6f75138c6adf7d623ca5ee7.png

结论1:搜狗输入法应该是对当前打开的页面有判断,不是随便哪个网页下面的输入框都会出现这个列表

测试2:在百度页面,除了主要的搜索框以外,其他入口也会出现这个搜索选项列表,下面是站点内搜索输入框的测试:

5f89c01e6821e08c674ed4259a3f77e0.png

结论2:搜狗输入法没有判断当前输入框目标是不是搜索框

测试3:这一次不用域名,换用IP地址来访问百度搜索。我的环境下ping www.baidu.com 解析的IP地址为:220.181.38.149,结果搜狗输入法竟然没有出现这个搜索选项列表:

023656e2e69839940e5e4e6e1ded51df.png

结论3:这个搜索选项列表的出现跟网页当前的URL有关

测试4:这一次来把浏览器的进程名字改一下,我这里选择火狐浏览器,将firefox.exe改为firefox1.exe,这个搜索选项列表也没有出现:

3e766247d1bdb6bf1a56573906953b80.png

结论4:除了URL,对进程名字也有判断,如果不是浏览器进程,也不会触发

最终结论:搜狗输入法检测到用户打开浏览器访问www.baidu.com域名进行搜索时,将弹出搜索选项列表,引导用户点击。

技术分析

如何实现浏览器进程筛选?

第一个问题,搜狗输入法怎么判断当前是不是在浏览器进程中呢?总不能在微信聊天界面也给弹出搜索候选词列表吧?

搜狗输入法核心模块是一个叫SogouPY.ime的文件,这实际上是一个动态链接库文件,这个文件会随你切换输入法时加载到对应的进程中。使用IDA打开分析,发现这个模块内部有很多浏览器进程名字的字符串:

1fa7de42e1098652f32c5af84f463e73.png

你看,国内外主流的和非主流的浏览器基本都被列为了目标。

进一步分析发现,上面这是一个字符串数组,找到了遍历这个数组,挨个进行比较匹配的处理逻辑:

bc8cdf47bda8cb0afa6df0672e10feaf.png

当前页面的URL获取及判断

浏览器进程筛选出来了,还要筛选当前是不是在搜索引擎的页面,接着往下看!

针对不同浏览器使用不同的获取方式,这里以firefox为例,搜狗输入法使用了MSAA(Microsoft Active Accessibility)技术获取到了当前页面URL。

调试发现,如果修改获取到的URL内容,搜狗输入法的搜索选项列表就无法展示出来。

向上追溯可以找到根据不同浏览器进行不同的URL获取方式分发入口:

c25a6a4ac58d18d07e6f1cf50198b48c.png

继续追溯,获取当前浏览器信息后,还要进行是否是搜索引擎域名的判断:

a192f3b4a3ca596f0a2875056f836e88.png

这个wcsstr函数就是在进行字符串比较了,调试得到wcsstr()的参数1:获取到的页面URL,参数2:搜索引擎域名。又是用一个数组在进行存储:

2edd267cf752dc1eaa92a08c5f45a392.png

百度居然还有个小名,www1.baidu.com,有意思。

我们来挨个试一下这个列表中的搜索引擎:

www1.baidu.com:

f5db3160c4a1f2d0c9a9945341af986c.png

www.soso.com:

这个就不用试了,现在是搜狗自家人。

cn.bing.com:

5285c5a9fba342a7bc7b63a7cad26964.png

www.google.cn:

db18a217f731f60b3433e9962fe69a82.png

so.sowang.com:

0b6c9b9b3f75837806bd0ac48ea4a968.png

www.chinaso.com:

e2e3ab2890343f0e992db6a1d1788006.png

www.youdao.com:

f9d77dd657c29de88bb9711947fee348.png

www.zhongsou.com:

5952d9c7b59ae38429d5be998f3515f8.png

如何打开搜狗搜索页面呢?

当发现是在浏览器进程中访问上面的搜索引擎域名后,就该跳转到搜狗自己的搜索页面了,那它是如何打开的呢?继续往下看!

打开firefox,使用调试器WinDbg 挂载到这个进程,执行这个命令:bp shell32!ShellExecuteW,给函数ShellExecuteW下断点。

接着打开百度首页,切换到搜狗中文输入法,这样使得SoGouPY.ime模块加载到firefox的进程空间中。

然后随意输入字符,出现搜狗搜索选项列表,随便点击一个,触发断点!来看一下参数:

f649ff49641a7874402054aabca90523.png

可以看到:这里通过启动当前浏览器(firefox.exe)打开了URL。根据堆栈返回地址,可以进一步往前分析。

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

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

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

211656c7b1be0bdfa3e8b68b3cf49d49.png

总结

和实验得到的结论一致。

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

0caaa783f2376c07b44f5c400c71ab6b.png

多说几句

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

0a429b21c4286c2a58804c6a7f8596c1.png

对于搜狗输入法的这骚操作,你怎么看?
回复下方  「关键词」,获取优质资源

回复关键词 「CDN」,即可获取 89 页 CDN 排坑指南手册
回复关键词 「ECS」,即可获取 96 页 ECS 运维 Linux 系统诊断手册
回复关键词 「linux」,即可获取 185 页 Linux 工具快速教程手册
回复关键词 「Python进阶」,即可获取 106 页 Python 进阶文档 PDF
回复关键词 「Python自动化」,即可获取 97 页自动化文档 PDF
回复关键词 「Excel数据透视表」,即可获取 136 页 Excel数据透视表 PDF
回复关键词 「Python最强基础学习文档」,即可获取 68 页 Python 最强基础学习文档 PDF
回复关键词 「wx」,即可加入杰哥的IT之旅读者交流群

本公众号全部博文已整理成一个目录,请在公众号后台回复「m」获取!

推荐阅读:

1、什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?
2、拥有此神技,脚本调试从此与 echo、set、test 说分手!
3、百度网盘国际版 Dubox 体验:干净好用,却与国内用户无缘
4、这几个用 Pyecharts 做出来的交互图表,领导说叼爆了!
5、有个程序员老公有多爽???
6、手把手教你用 Python 搞定网页爬虫!

7d7e3069cf58e8f356a781c97b47e933.png

点个[在看],是对杰哥最大的支持!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值