鼠标屏幕取词-技术
二、小故事串起來,就是秘密所在
別以為剛才那幾個小故事都是雜亂無章地堆在一起,只要你把它們看明白了,那取詞的秘密也就大白于天下了。讓我們看看詞霸在幾個小故事中各扮演了什么角色……
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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 消息称OPPO Watch 3系列标配E
- 下一篇: 三星新款Flip4/Fold4保护壳现身