鼠标屏幕取词-技术

二、小故事串起来,就是秘密所在
别以为刚才那几个小故事都是杂乱无章地堆在一起,只要你把它们看明白了,那取词的秘密也就大白于天下了。让我们看看词霸在几个小故事中各扮演了什么角色……

1.获得鼠标当前位置
通过HOOK机制钩住系统中的鼠标消息,那就能在所有的窗口中获得鼠标的位置了。
2.向鼠标下的窗口发重画消息
通过调用几个API函数,程序就能得到当前鼠标位置下窗口(此窗口泛指窗口、菜单、按钮等界面元素)的控制权,然后冒充系统向它发送“窗口重画”的消息,那收到消息的窗口就会调用系统中的API(TextOut等)来重画了。
3.截获API调用参数
程序调用显示文字的API,当然不可能只是告诉它“画”,还必须告诉它“画什么”,因此,在API函数调用时还附带了一个参数,在显示文字的调用中,这个参数当然就是要显示的文字。于是,取词程序编写了自己的文字显示函数,用它的地址冒充API的真实地址,于是对显示文字API的调用都必须通过取词程序的显示函数,至此,要显示的文字就被截获了。

小知识:你不知道的其他秘密
★东方快车,南极星就是用这样的原理完成界面翻译和内码转换的。
★在鼠标取词时,被取词的位置经常会闪烁一下,这就是窗口的重画消息在“作怪”。

“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在WINDOWS系统中实现却是非常复杂的,总的来说有两种实现方式:

  第一种:采用截获对部分GDI的API调用来实现,如TextOut,TextOutA等。

  第二种:对每个设备上下文(DC)做一分Copy,并跟踪所有修改上下文(DC)的操作。

  第二种方法更强大,但兼容性不好,而第一种方法使用的截获WindowsAPI的调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用WindowsAPI拦截技术,你可以改造整个操作系统,事实上很多外挂式Windows中文平台就是这么实现的!而这项技术也正是这篇文章的主题。

  截WindowsAPI的调用,具体的说来也可以分为两种方法:

  第一种方法通过直接改写WinAPI 在内存中的映像,嵌入汇编代码,使之被调用时跳转到指定的地址运行来截获;第二种方法则改写IAT(Import Address Table 输入地址表),重定向WinAPI函数的调用来实现对WinAPI的截获。

  第一种方法的实现较为繁琐,而且在Win95、98下面更有难度,这是因为虽然微软说WIN16的API只是为了兼容性才保留下来,程序员应该尽可能地调用32位的API,实际上根本就不是这样!WIN 9X内部的大部分32位API经过变换调用了同名的16位API,也就是说我们需要在拦截的函数中嵌入16位汇编代码!

  我们将要介绍的是第二种拦截方法,这种方法在Win95、98和NT下面运行都比较稳定,兼容性较好。由于需要用到关于Windows虚拟内存的管理、打破进程边界墙、向应用程序的进程空间中注入代码、PE(Portable Executable)文件格式和IAT(输入地址表)等较底层的知识,所以我们先对涉及到的这些知识大概地做一个介绍,最后会给出拦截部分的关键代码。

 

转载于:https://www.cnblogs.com/dragonsuc/archive/2009/01/19/1378280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 之 HttpResponse 类

Response 对象,派生自HttpResponse 类,该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

oracle时间类型插入,oracle 插入时间字符串 Date类型

和MysqL不同,MysqL 可以直接插入 时间字符串的,UPDATE HR_EFF_EVALUATORSET LEVEL_ 2,ROLE_NAME_ 他评,ASSESS_ROLE_ 具体人员,ASSESS_WAY_ 10,WEIGHT_ 百分制,NOTE_ 欧敏测试,PLAN_ID_ 110001231000002,STATUS_ 0,CREATE_TIME_TO_DATE(2016-12-…

esper(4-3)-Non-Overlapping Context

语法 create context context_name start start_condition end end_condition 如: // 9点到17点此context才可用(以引擎的时间为准)。如果事件进入的事件不在此范围内,则不受该context影响 create context NineToFive start (0,…

牢骚贴

如果你不是在科研机构工作,抑或你不是自己做自己的项目,那么或许你会有我一样的情况。 老总要的是效率、效率、效率。。。。。。还是效率。他不管你用了什么oo或者设计技巧,他要的是在最短的时间完成项目,至于这个项目的可维护性、…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师?>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换,全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector,输入正确的selector来完…

linux什么用户什么任务,Linux 用户

查看所有用户cat /etc/passwd查看linux下用户组cat /etc/group用cat /etc/passwd |cut -f 1 -d :系统默认用户 http://zhidao.baidu.com/question/133424460Linux 用户user和用户组group管理 概念主要讲在Linux 系统中用户和用户组管理的概念,相关命令;对单用户多任…

使用字符缓冲流读取数据

package text;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException; public class Buff5 { public static void main(String[] args) {          BufferedReader bosnull;          try {//      …

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分,也是最后一部分,包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是,这些徽标均来自 Google 国际站点,也就是 www.google.com,Google 在众多本地站点上还有大量本土化的…

HBuilder:最快的Web开发IDE

HBuilder:最快的Web开发IDE http://www.csdn.net/article/2014-02-07/2818326-HBuilder-the-fastest-web-ide发表于2014-02-11 10:38| 26194次阅读| 来源CSDN| 59 条评论| 作者CSDN移动前端开发HBuilder数字天堂王安Web开发HTML5DCloud摘要:HBuilder是DC…

linux如何利用命令保存文件,如何在Linux中将命令输出保存到文件?

有时,Unix命令的输出可以使我们了解到这种情况的重要性,在这种情况下,我们想保存结果以供以后参考,在本文中,我们将看到如何将命令的输出保存到文件中。创建一个新文件可以使用>符号和新文件名来保存磁盘使用命令的…

Pycharm 项目无法导入自己写的模块(问题记录贴)

问题: 从外部导入一个Python项目后,发现包错误,如图: 解决步骤: 1.将目录下的"5-6——apriori.py"复制一份,重命名为”apriori.py"; 2.查资料知,pycharm不会将当前文…

Win2000/XP/2003路由制作之Nat共享上网

Win2000/XP/2003(必须SERVER(服务)版本的)ROUTEROS不会或则你的路由器突然坏了。紧急情况下,为了让老板的网吧正常营业,随手找个电脑就可以正常工作了。好吧。言归正传。NAT服务器软硬件准备俗话说“巧妇难…

Linux中的Interrupted system call错误

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个项目,上线时候遇到了一些问题,服务跑一段时间后连接不上。 发现报了Interrupted system call这个错误引起的。 查了下资料,大致原因是系统繁忙处理不过来导致的。 根据网…

linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信

进程通信又称IPCIPC方法方法:管道(最简单)信号(开销最小)共享映射区/共享内存(无血缘关系)本地套接字(最稳定)Linux文件类型: - 文件d 目录l 符号链接s 套接字 伪文件b 块设备 伪文件c字符设备 伪文件p管道 …

EMOS 如何停止反病毒和防垃圾邮件功能

1、修改main.cf配置文件,红色部分为需要注释的部分vim /etc/postfix/main.cf# smtpd related configsmtpd_recipient_restrictions permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_hostname,reject_non_fqdn_sender,reject_non_fqdn_recipient,rejec…

图论部分简单总结

总的感受: 这里大概囊括了一下图论的基础知识,图论是一个比较考验思维的部分。 尤其是后面有关二分图,网络流等的分支,对建模转化的要求还是很高的。 进入正题了: 一、最短路: 这一个部分不想多讲,虽然是很基础的一个部分&#xf…

Oracle学习笔记:数据字典

oracle数据字典 说起字典,下面让我来打个比方。我们读书写字,靠的是什么?你会说:字!那我问你,你所用的字又是什么呢?!这时,你只可能把字典(新华字典、康熙字典…

linux分区转换gpt命令,Linux中磁盘如何转换GPT格式

Fdisk命令虽然很交互,操作也方便,但是对于大于2T的磁盘无法操作,假如我们想用大于2T的磁盘怎么办?可以把磁盘转化为GPT格式。GPT格式的磁盘相当于原来MBR磁盘中原来保留4个partition table的416个字节只留第一个16个字节,类似于扩…

JAVA格式化当前日期或者取年月日

Date d new Date(); System.out.println(d); SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateNowStr sdf.format(d); System.out.println("格式化后的日期:" dateNowStr); 转载于:https://www.cnblo…

DHL出台货运新方案

DHL出台货运新方案(来自:北京国际快递) 这是中国货运行业内首次由货运公司发起的关于货运安全方面的战略合作项目,货运公司与机场货运站、航空公司首次共同协作致力于货物的安全保障。 国际快递巨头DHL日前宣布,旗下的货运部门DHL全球货运物流…