取詞的過程
0 判斷鼠標(biāo)是否在一個(gè)地方停留了一段時(shí)間
1 取得鼠標(biāo)當(dāng)前位置
2 以鼠標(biāo)位置為中心生成一個(gè)矩形
3 掛上API鉤子
4 讓這個(gè)矩形產(chǎn)生重畫消息
5 在鉤子里等輸出字符
6 計(jì)算鼠標(biāo)在哪個(gè)單詞上面,把這個(gè)單詞保存下來
7 如果得到單詞則摘掉API鉤子,在一段時(shí)間后,無論是否得到單詞都摘掉API鉤子
8 用單詞查詞庫,顯示解釋框
如何掛鉤子:
所謂鉤子其實(shí)就是在WindowsAPI入口寫一個(gè)JMP XXXX:XXXX語句,跳轉(zhuǎn)到自己的代碼里。
步驟如下:
1.取得Windows API入口,用GetProcAddress實(shí)現(xiàn)
2.保存API入口的前五個(gè)字節(jié),因?yàn)镴MP是0xEA,地址是4個(gè)字節(jié)
3.寫入跳轉(zhuǎn)語句
這步最復(fù)雜
Windows的代碼段本來是不可以寫的,但是Microsoft給自己留了個(gè)后門。
有一個(gè)未公開函數(shù)是AllocCsToDsAlias,
UINT WINAPI ALLOCCSTODSALIAS(UINT);
你可以取到這個(gè)函數(shù)的入口,把API的代碼段的選擇符傳給他,他會(huì)返回一個(gè)可寫的數(shù)據(jù)段選擇符。這個(gè)選擇符用完要釋放的。用新選擇符和API入口的偏移量合成一個(gè)指針就可以寫windows的代碼段了。