“鼠標屏幕取詞”技術是在電子字典中得到廣泛地應用的,如四通利方和金山詞霸等軟件,這個技術看似簡單,其實在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(輸入地址表)等較底層的知識,所以我們先對涉及到的這些知識大概地做一個介紹,最後會給出攔截部分的關鍵代碼。