取詞的過程
0 判斷鼠標是否在一個地方停留了一段時間
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的代碼段了。