关于屏幕取词的问题(转)
金山词霸”屏幕取词技术揭密(讨论稿)
作者 亦东
原因是这项技术让人感觉很神奇,也很有商业价值。
现在词典市场金山词霸占了绝对优势,所以再做字典也没什么前途了。我就是这么认为的,所以我虽然掌握了这项技术,却没去做字典软件。只做了一个和词霸相似的软件自己用,本来想拿出来做共享软件,但我的词库是“偷”来的,而且词汇不多,所以也就算了,词库太小,只能取词有什么用呢?而且词霸有共享版的。
但既然很多人想了解这项技术,我也不会保留。我准备分多次讲述这项技术的所有细节。
大约每周一两次。想知道的人就常常来看看吧!
首先想编这种程序需要一些基础知识。
会用Vc++,包括16/32位。
精通Windows API特别是GDI,KERNEL部分。
懂汇编语言,会用softice调试程序,因为这种程序最好用softice调试。
在Window 3.x时代,windows系统提供的字符输出函数只有很少的几个。
TextOut
ExtTextOut
DrawText
......
其中DrawText最终是用ExtTextOut实现的。
我研究后找到了一种解决办法,但还有些问题,有时会取错,正在继续研究,希望大家共同探讨。
要实现取词,主要要解决以下技术问题。
1.截取API入口,获得API的参数。
2.安全地潜入Windows内部,良好地兼容Windows的各个版本
3.计算鼠标所在的单词和字母。
4.如果你在Window95下,做32位程序,还涉及Windows32/16混合编程的技术。
E-Mail:yeedong@163.net
作者 亦东
我看了一些人的回帖,发现很多人对取词的原理还是不太清楚。
首先我来解释一下hook问题。词霸中的确用到了hook,而且他用了两种hook其中一种是Windows标准hook,通过SetWindowHook安装一个回调函数,它安装了一个鼠标hook,是为了可以及时响应鼠标的消息用的和取词没太大关系。
另一种钩子是API钩子,这才是取词的核心技术所在。他在TextOut等函数的开头写了一个jmp语句,跳转到自己的代码里。
你用softice看不到这个跳转语句是因为它只在取词的一瞬间才存在,平时是没有的。
你可以在TextOut开头设一个读写断点
bpm textout
再取词,就会找到词霸用来写钩子的代码了。
所以我在次强调,想学这种技术一定要懂汇编语言和熟练使用softice.
**********************************/
1 取得鼠标当前位置
2 以鼠标位置为中心生成一个矩形
3 挂上API钩子
4 让这个矩形产生重画消息
5 在钩子里等输出字符
6 计算鼠标在哪个单词上面,把这个单词保存下来
7 如果得到单词则摘掉API钩子,在一段时间后,无论是否得到单词都摘掉API钩子
8 用单词查词库,显示解释框。
所谓钩子其实就是在WindowsAPI入口写一个JMP XXXX:XXXX语句,跳转到自己的代码里。
1.取得Windows API入口,用GetProcAddress实现
2.保存API入口的前五个字节,因为JMP是0xEA,地址是4个字节
3.写入跳转语句
这步最复杂
Windows的代码段本来是不可以写的,但是Microsoft给自己留了个后门。
有一个未公开函数是AllocCsToDsAlias,
UINT WINAPI ALLOCCSTODSALIAS(UINT);
你可以取到这个函数的入口,把API的代码段的选择符(要是不知道什么是选择符,就先去学学保护模式编程吧)传给他,他会返回一个可写的数据段选择符。这个选择符用完要释放的。用新选择符和API入口的偏移量合成一个指针就可以写windows的代码段了。
这些公司和产品有:中文之星,四通利方,南极星,金山词霸,实达铭泰的东方快车,roboword,译典通,即时汉化专家等等等等。。。。还有至少20多家小公司。他们的具体实现虽然不同,但大致原理是相同的。
作者 亦东
让大家久等,很抱歉,前些时候工作忙硬盘又坏了,太不幸了。
BYTE OldValue[5];//API原来的入口代码
unsigned char * Address=NULL;//可写的API入口地址
UINT DsSelector=NULL;//指向API入口的可写的选择符
WORD OffSetEntry=NULL;//API的偏移量
{
HMODULE hKernel,hGdi;
hKernel = GetModuleHandle("Kernel");
if(hKernel==NULL)
return FALSE;
if(AllocCsToDsAlias==NULL)
return FALSE;
if(hmGdi==NULL)
return FALSE;
if(Entry==NULL)
return FALSE;
DsSelector = AllocCsToDsAlias(FP_SEG(Entry));//分配一个等同的可写的选择符
Address = (unsigned char*)MK_FP(DsSelector,OffSetEntry);//合成地址
*((DWORD*)(NewValue+1)) = (DWORD)MyTextOut;
*((DWORD*)(OldValue+1)) = *((DWORD*)(Address+1));
}
{
if(bHookAlready)
HookOff();
}
{
if(!bHookAlready){
for(int i=0;i<5;i++){
Address[i]=NewValue[i];
}
bHookAlready=TRUE;
}
}
{
if(bHookAlready){
for(int i=0;i<5;i++){
Address[i]=OldValue[i];
}
bHookAlready=FALSE;
}
}
BOOL WINAPI MyTextOut(HDC hdc,int nXStart,int nYStart,LPCSTR lpszString,UINT cbString)
{
BOOL ret;
HookOff();
ret = TextOut(hdc,nXStart,nYStart,lpszString,cbString);//调原来的TextOut
HookOn();
return ret;
}
因为我没有VC++1.52.所以代码可能会有错。
如果用VC++1.52,则要改个选项
yeedong@163.net
关于屏幕取词的问题(转)相关推荐
- 【Linux】ubuntu下词典软件Goldendict介绍(可屏幕取词)和StarDict(星际译王)的安装...
转载自:http://emuch.net/html/201012/2730970.html GoldenDict 是一款不错的.与 StarDict(星际译王)类似的词典软件.它使用 WebKit 作 ...
- [IE9] 开发IE9上的屏幕取词功能
"屏幕取词"是词典软件(如:金山词霸)里面一个必要功能. 在IE9中,由于使用Direct2D接口取代GDI做页面渲染,原来基于GDI接口的屏幕取词技术将无法继续正常工作. 因此, ...
- 金山词霸”屏幕取词技术揭密(讨论稿)
金山词霸"屏幕取词技术揭密(讨论稿) 主题 屏幕取词技术系列讲座(一) 作者 亦东 很多人对这个问题感兴趣. 原因是这项技术让人感觉很神奇,也很有商业价值. 现在词典市场金山词霸占了绝对优势 ...
- 火狐用有道词典不能屏幕取词的解决办法
2019独角兽企业重金招聘Python工程师标准>>> 1 取消火狐浏览器自动使用硬件加速功能 2 有道词典安装OCR插件强力屏幕取词功能 转载于:https://my.oschin ...
- c# 实现金山词霸一样的屏幕取词
c# 屏幕取词想做金山词霸一样的屏幕取词 告诉你两个方法: 第一: 在金山词霸中2005中带了一个XdictGrb.dll,添加引用 然后下面是代码 using System; using Syste ...
- 关于金山词霸的屏幕取词1
"金山词霸"屏幕取词技术揭密(讨论稿) (17千字) 发信人:5,555 时 间:2001-11-1 9:30:12 详细信息: "金山词霸"屏幕取词技术揭密( ...
- 解决金山词霸和有道词典不能对pdf文档屏幕取词的方法
解决金山词霸和有道词典不能对pdf文档屏幕取词的方法 http://www.docin.com/p-14101033.html
- python屏幕取词_GetWord 3.3 屏幕取词
1. 缘起 要搞一个作弊软件,需要把屏幕上的试题取下来. 据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件. 发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一 ...
- PDF转Word+转Html+英文论文轻松翻译+屏幕取词
分享一个编辑PDF,PDF转格式,一键翻译PDF论文的好办法.今天的分享,对于需要阅读大量英文文献,或者需要对PDF文件进行更高阶操作的朋友都是非常有用的.我觉得是属于超级干货了.如果你觉得我的分享不 ...
- Word 2010也可以屏幕取词翻译
Word 2010的屏幕取词翻译就像是一个迷你版词霸,不仅能做到即点即译,而且支持单词和短语发音 在早期的Word版本中就有不错的翻译功能,能够实现简单的中英文互译,而Word 201 ...
最新文章
- 快速区域积分直方图实现
- 九零后程序员心塞大哭:“我累的心脏疼,父母却说我工作很轻松”
- [2020.11.4NOIP模拟赛]简单的打击【NTT】
- HTML列表内容自动排序,JS实现HTML表格排序功能
- 普通用户的sudo权限,禁止root用户登录
- 计算机网络英文题库,强烈推荐计算机网络英文试题库(附答案)chapter.doc
- 【声学基础】概述——振动学
- ffmpeg 2.6.3在Linux下的编译
- wxpython textctrl_如何从wxpython中的textctrl接受值
- android 底部去除list渐变,layer-list渐变色的处理
- sql 列转行_转行数据分析师如何开始学习SQL | 工科生三个月转行数据分析学习心得...
- 一句话道破X64和X86的区别
- 安卓手机玩游戏卡顿怎么解决_安卓手机卡顿如何解决?教你四招,流畅度立刻飙升!...
- Win10家庭版中文用户名改英文用户名方法(亲测管用)
- PTA团体程序设计天梯赛-练习集(3)
- 信号处理--常用术语
- spark-shuffle
- xamarin android 微信,转换微信SDK为Xamarin绑定库 Android5.5.8 iOS1.8.6.2
- syscall常量解释(持续完善中)
- 如何使用《背景音乐提取器》提取歌曲中的背景音乐