Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
RightHand-Persistence — Техника персистентности COM в Windows | Kitploit
Инструменты/GitHubGitHub/i014n/righthand-persistence
Механизмы персистентностиЭксплуатацияПост-эксплуатацияОбучение и ОбразованиеRed Teaming
GitHubi014n/righthand-persistence

RightHand-Persistence

Техника персистентности COM в Windows

Репозиторий
9011444 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

RightHand Закрепление

вдохновлено CVE-2026-21509

C++ COM Обработчик контекстного меню для закрепления

Пример реализации обработчика контекстного меню Windows на C++ и COM, демонстрирующий скрытую технику закрепления в системе. Регистрируя собственный COM-объект, ваш код выполняется всякий раз, когда пользователь щёлкает правой кнопкой мыши по определённым целям (файлам, папкам или пустому пространству) в проводнике Windows.

Отказ от ответственности: Этот проект предназначен только для образовательных и исследовательских целей. Описанные здесь техники могут быть использованы в злонамеренных целях. Автор не одобряет использование данного кода для любых незаконных действий. Будьте ответственны и используйте эти знания этично.


POC

poc

Начало работы

Предварительные требования

  • Компилятор C++ (например, MSVC из Visual Studio или MinGW-w64)
  • Windows SDK
  • Тестовая виртуальная машина (для безопасной регистрации и выполнения)

Моя настройка

  • IDE: Visual Studio 2019
  • Разработка на ВМ: Windows 10 x64 (сборка 19045)
  • Тестирование на ВМ: Windows 10 x64 / Windows 11 x64

Архитектура проекта

root@kitploit:~
                                       DllMain.cpp     
                                +-----------------------+
                                |  DLL Template Project |
                                +-------+-------+-------+
                            ____/           |        \_____
                            |               |             |
                            v               v             v
                    +------------+  +----------------+  +--------------+
                    |   Define   |  | MyClassFactory |  |   Define     |
    clsid_defined.h |   CLSID    |  +----------------+  |   Export     | Source.def
                    +------------+     ClassFactory     |  Functions   |
                                          class         +--------------+
                                            |
                                            |
                                            v
                                     +--------------+    
                                     | MyMenuHandler|
                                     +--------------+         
                                      MyMenuHandler
                                          class

1. DllMain.cpp

Содержит стандартные функции, необходимые COM-объекту для регистрации и разрегистрации DLL.

  • DllRegisterServer(): Записывает пути реестра, соответствующие целевым расширениям файлов / пустому пространству. Выполняется при регистрации DLL.
root@kitploit:~
STDAPI DllRegisterServer() {
    std::wstring clsidString = MyStringFromCLSID(CLSID_DecrypShellExtensionx64);
    std::wstring dllPath = MyGetModuleFilename();

    // 1. Register the COM Class (CLSID)
    std::wstring clsidBaseKey = L"SOFTWARE\\Classes\\CLSID\\" + clsidString;
    SetRegistryKey(HKEY_LOCAL_MACHINE, clsidBaseKey, L"", L"MyMenuHandler Object");

    // 2. Register the DLL Path and Threading Model
    std::wstring inprocKey = clsidBaseKey + L"\\InprocServer32";
    SetRegistryKey(HKEY_LOCAL_MACHINE, inprocKey, L"", dllPath);
    SetRegistryKey(HKEY_LOCAL_MACHINE, inprocKey, L"ThreadingModel", L"Apartment");

    // 3. Register for all Shell Contexts
    // Array of paths to cover Files, Folders, Backgrounds, and Desktop
    std::wstring handlerPaths[] = {
        L"SOFTWARE\\Classes\\*\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\Directory\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\Directory\\Background\\shellex\\ContextMenuHandlers\\",
        L"SOFTWARE\\Classes\\DesktopBackground\\shellex\\ContextMenuHandlers\\"
    };

    for (const auto& path : handlerPaths) {
        std::wstring fullPath = path + L"MyMenuHandler"; // Replace with your handler's name
        SetRegistryKey(HKEY_LOCAL_MACHINE, fullPath, L"", clsidString);
    }

    // 4. Register in the Approved list (Required for many Windows versions)
    std::wstring approvedKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved";
    SetRegistryKey(HKEY_LOCAL_MACHINE, approvedKey, clsidString, L"MyMenuHandler");

    // 5. Notify the Shell that things have changed
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);

    return S_OK;
}
  • DllUnregisterServer(): Очищает реестр. Вызывается при разрегистрации DLL.

2. MyClassFactory

Необходим для создания экземпляра COM-объекта. Подробнее о фабриках классов.

3. Clsid_defined.h

Содержит GUID, под которым приложение будет зарегистрировано в Проводнике. Вы можете сгенерировать новый GUID с помощью guidgen.exe из Visual Studio или онлайн Генератора GUID.

root@kitploit:~
// {CEF1AA1B-42F7-4A54-AF46-BCEE5B3FE6BF}
DEFINE_GUID(CLSID_DecrypShellExtensionx64, 0xcef1aa1b, 0x42f7, 0x4a54, 0xaf, 0x46, 0xbc, 0xee, 0x5b, 0x3f, 0xe6, 0xbf);

4. Source.def

Файл определения модуля. Он указывает, какие функции экспортирует DLL. Подробнее о DEF-файлах.

root@kitploit:~
EXPORTS
    DllGetClassObject PRIVATE
    DllCanUnloadNow PRIVATE
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE

5. MyMenuHandler.cpp

Основной класс, реализующий IShellExtInit и IContextMenu. Здесь задаются собственные действия.

  • MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgId) Вызывается каждый раз при щелчке правой кнопкой на зарегистрированной цели. Используется для определения того, какой файл или папка были нажаты.
root@kitploit:~
HRESULT MyContextMenuHandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgId)
{
    MessageBoxA(NULL, "Initialize Called!", "Debug", MB_OK);

    // 1. Check if we clicked on a FILE/FOLDER
    if (pdtobj)
    {
        STGMEDIUM medium;
        FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
        if (SUCCEEDED(pdtobj->GetData(&fe, &medium)))
        {
            DragQueryFileA((HDROP)medium.hGlobal, 0, m_szFile, MAX_PATH);
            ReleaseStgMedium(&medium);
            return S_OK; // Success!
        }
    }

    // 2. Check if we clicked the BACKGROUND (pidlFolder)
    if (pidlFolder)
    {
        if (SHGetPathFromIDListA(pidlFolder, m_szFile))
        {
            return S_OK; // Success!
        }
    }

    // 3. Fallback: If we got neither, still return S_OK to show the menu.
    // You just won't have a path populated in m_szFile.
    return S_OK;
}
  • MyContextMenuHandler::InvokeCommand(LPCMINVOKECOMMANDINFO picp) Вызывается, когда пользователь щёлкает по конкретной пользовательской опции в контекстном меню. Здесь выполняется ваша полезная нагрузка для закрепления или пользовательское действие.

Тестирование

На целевой виртуальной машине скопируйте скомпилированную DLL и выполните следующие команды:

1. Регистрация

Зарегистрируйте DLL с помощью стандартных двоичных файлов Windows.

root@kitploit:~
regsvr32.exe RightHandPersistence.dll

2. Перезапуск Проводника

Перезапустите процесс explorer.exe, чтобы он загрузил новое расширение оболочки в память.

root@kitploit:~
taskkill /f /im explorer.exe & start explorer.exe

3. Разрегистрация

Чтобы удалить обработчик контекстного меню и очистить реестр, используйте флаг /u с regsvr32.exe. Эта команда вызовет вашу функцию DllUnregisterServer.

root@kitploit:~
regsvr32.exe /u RightHandPersistence.dll

Кастомизация

1. Нацеливание на конкретные места

Windows по-разному категоризирует «пустое пространство» и файлы. Чтобы нацелиться на фон, сопоставьте ключи реестра со следующими местами.

Более подробно о сопоставлении расширений можно узнать в документации Microsoft по обработчикам контекстного меню.

2. Создание пользовательских команд меню

Вы можете задать собственный текст для меню (например, «Пользовательское копирование» или «Выполнить диагностику»), реализовав метод IContextMenu::QueryContextMenu. Щелчок по этому тексту запускает вашу логику внутри IContextMenu::InvokeCommand.


Ссылки

  • Создание обработчиков контекстного меню (Microsoft Learn)
  • Интерфейс IShellExtInit (Microsoft Learn)
  • Интерфейс IContextMenu (Microsoft Learn)
  • Регистрация обработчиков расширений оболочки (Microsoft Learn)
  • Экспорт из DLL с помощью DEF-файлов (Microsoft Learn)
  • GuidGenerator.com
Скачать инструмент
Цель правого кликаПуть в реестре
Файлы (все)HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
Папки (значок)HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers
Фон папкиHKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers
Фон рабочего столаHKEY_CLASSES_ROOT\DesktopBackground\shellex\ContextMenuHandlers