金山词霸”屏幕取词技术揭密(讨论稿)
作者 亦东
原因是这项技术让人感觉很神奇,也很有商业价值。
现在词典市场金山词霸占了绝对优势,所以再做字典也没什么前途了。我就是这么认为的,所以我虽然掌握了这项技术,却没去做字典软件。只做了一个和词霸相似的软件自己用,本来想拿出来做共享软件,但我的词库是“偷”来的,而且词汇不多,所以也就算了,词库太小,只能取词有什么用呢?而且词霸有共享版的。
但既然很多人想了解这项技术,我也不会保留。我准备分多次讲述这项技术的所有细节。
大约每周一两次。想知道的人就常常来看看吧!
首先想编这种程序需要一些基础知识。
会用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,则要改个选项
金山词霸”屏幕取词技术揭密(讨论稿)相关推荐
- 金山词霸”屏幕取词技术揭密
金山词霸"屏幕取词技术揭密 "金山词霸"屏幕取词技术揭密(讨论稿) ...
- 屏幕取词技术实现原理与关键源码
转自: https://www.cnblogs.com/seacryfly/archive/2012/01/08/2316511.html 虽然屏幕取词技术早已经不是什么秘密,以至于除了汉化工具.翻译 ...
- 鼠标屏幕取词技术的原理和实现
鼠标屏幕取词技术的原理和实现 "鼠标屏幕取词"技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在WINDOWS系统中实现却是非常复杂的,总的来 ...
- “鼠标屏幕取词”技术
"鼠标屏幕取词"技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在WINDOWS系统中实现却是非常复杂的,总的来说有两种实现方式: 第一种:采 ...
- 1.1. 鼠标取词 屏幕取词技术实现原理
1.1. 鼠标取词 屏幕取词技术实现原理 1.2. 需要用到winapi (不推荐,传统方法.] 需要进行全局鼠标Hook 然后在Hook事件里 根据鼠标的位置找到相应window的handle ...
- Linux 下的屏幕取词技术
Linux 下的屏幕取词技术 作者: 于明俭 屏幕取词即当鼠标在应用软件所显示中/英文的地方滑过, 则有一小窗口 出现在离单词附近, 上面出现鼠标下面单词的解释. 屏幕取词以前一直是 MS Windo ...
- Android金山屏幕取词,金山词霸屏幕取词方法分析
随着使用英语的人数越来越多,它逐渐成为我们日常生活中交流.阅读的语言,现在我们出去,如果不懂点英语,还真的无法快乐地和其他小伙伴愉快的玩耍.可是自己平时工作或者学习的原因,根本没有时间静下心来去学习, ...
- 关于金山词霸的屏幕取词1
"金山词霸"屏幕取词技术揭密(讨论稿) (17千字) 发信人:5,555 时 间:2001-11-1 9:30:12 详细信息: "金山词霸"屏幕取词技术揭密( ...
- 关于屏幕取词的问题(转)
金山词霸"屏幕取词技术揭密(讨论稿) 这篇文章最早是发在北极星论坛的一系列帖子,那时候闻怡洋(好像他也是MVP)也在那里混 原始的帖子我已经没有了,但不知道是谁帮我收集整理了下来(非常感谢) ...
最新文章
- 一加7充电_夜话丨一加7超级快充明天见
- python怎么下载-下载 python
- 【数字信号处理】基本序列 ( 实指数序列 | 收敛序列 | 发散序列 )
- 纯JavaScript实现的调用设备摄像头并拍照的功能
- 7-20 表达式转换 (25 分)(代码详解+题目分析)
- 搞dedecms站 找后台的一些经验[转]
- 互联网始于 50 年前的 3420 室
- 在wex5平台grid里面的gridselect下拉不能显示汉字问题
- 关于PCM音频数据的相关转换算法
- excel删除行闪退_Excel出现闪退如何处理?
- sqlplus连接Oracle 11g 数据库
- 一篇了解TrustZone
- (SWAT-2)SWAT中土地利用数据库建立
- 浅学一点空间转换3D和动画知识
- 前端毕业设计项目:基于Vue+Nodejs实现宿舍管理系统
- 十六进制转字符串,字符串转十六进制,相互转换
- 2021年前端面试题及答案
- 这可能是Python里最强的绘制地图神器
- 大数据项目(基于spark)--新冠疫情防控指挥作战平台项目
- wifi信号增强android,WiFi信号增强放大器app下载
热门文章
- 查找html的第三个input元素,获取HTML元素的3个方法
- 全站仪和手机连接软件_不懂全站仪?看这篇就够用了
- php上传文件测试代码,php 文件上传函数的超详细示例
- linux fpga 开发环境,- Vivado+Zedboard之Linux开发环境搭建
- npm报错,安装不上依赖,npm代理报错
- 使用MyBatis框架连接MySQL数据库查询记录,全部步骤
- lucene全文检索mysql教程_对于数据库里的多张表怎么利用lucene等实现全文检索
- java 变量与常量_java的变量和常量
- 收藏:如何获取当前已经打开的IE对象(VB6代码)
- Linux开机过程(转)