说到屏幕取词,就是通过拦截windows的显示API,获取输出的文本,然后提取出自己想要的信息的一个技术手段。windows有这么几个常用的,TextOutA,TextOutW,ExtTextOutA,ExtTextOutW以及Diretc3D的一些绘制函数(nopad,IE的输入框使用的是ExtTextOut, chrome使用的D3D的绘制函数,一些UI库的静态文本框基本是使用textOut),只要HOOK住这个这些函数,就可以完成我们相应的功能了。目前我使用的是detours库:
该方法使用比较简单,比如;
static BOOL(WINAPI *OLD_DrawTextExW)(HDC hdc, LPWSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) = DrawTextExW;
int WINAPI MyDrawTextExW(HDC hdc, LPWSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams);
然后在初始化那里调用下面代码,
DetourAttach(&(PVOID&)OLD_DrawTextExW, MyDrawTextExW);
当系统每次调用DrawTextExW的时候就会进入我们写的函数MyDrawTextExW。该方法只能对本进程有效,不能HOOK住其它进程里面的东西,如果想HOOK住其它进程里面的函数,那么我们需要进行远程注入,需要调用CreateRemoteThreadEx或者CreateRemoteThread进行远程注入,只要注入到其它进程里面就可以拦截我们想要的API了。最后我们通过管道或者一些通信手段将我们想要的信息发出来即可
远程注入的方法参考 http://blog.youkuaiyun.com/xiaocaiju/article/details/7668473
至于屏幕取词,原理更加简单,首先先注册一个粘贴板事件,调用 SetClipboardViewer (参加MSDN),然后再通过鼠标钩子拦截鼠标按下以及鼠标弹起时的位置,模拟CTRL + C的按键,发出去就可以了,
keyAction(VK_CONTROL, 1);
keyAction('C', 1);
keyAction('C', 0);
keyAction(VK_CONTROL, 0);
当收到粘贴板事件后,通过处理粘贴板里面的数据进行相关操作即可