CLSIDs и Соединительные Папки
Оглавление
- Соединительные папки
- CLSIDs и COM Объекты
- Закрепление на уровне пользователя
- Сохранение Dll как Exe - Windows Run
- Папки быстрого доступа + Соеденительные папки + Библиотеки + Файлы ссылок = Эксплуатация
- Закрепление в проводнике с использованием соединительных папок и шелла (пошаговое руководство
Соединительные папки
Соединительная папка в Windows - это метод, при котором пользователь может вызвать перенаправление в другую папку, обычно в другую известную папку. Соединительная папка считается жесткой ссылкой. Существует несколько способов создания соединительных папок. Модификация реестра может повлечь за собой создание такой папки. Другой способ - это запись desktop.ini внутри папки. Третий, и, вероятно, самый полезный для нас, это метод который является только соглашением об именах. Метод заключается в том, чтобы просто создать папку как таковую. MyFolder.{CLSID папки, с которой вы хотите “соединиться”}. После того как вы назвали папку таким образом, двойной щелчок по ней приведет вас к известной папке, представленной CLSID. Microsoft дает вам много примеров работы такого подхода. Таким образом, вы можете легко создать папку которая “соединяется” с “Панелью управления (все задачи)” и называть ее “Моя панель управления”. Вы также можете применять эту технику к изображениями, документам, Internet Explorer, Мой Компьютер. Все эти специальные папки были назначены уникальные CLSID. Смотреть в CLSID установленные по умолчанию в Windows. Ниже приведен пример папки подключения к “Панели управления (все задачи)”. Кроме того, если вы не знакомы с CLSID, см. Что такое ключ реестра CLSID
Имя папки “My Control Panel”.{ED7BA470-8E54-465E-825C-99712043E01C} для перехода к панели управления.
Windows достаточно удобно скроет CLSID для вас.
Соединение работает!
И что?
Что происходит, когда CLSID не соответствует ожидаемым папкам? Что если это вообще не папка? Вот где это становится немного интересным.
CLSIDs и COM Объекты
Используя CreateGuid я сгенерировал новый GUID {24138469-5DDA-479D-A150-3695B9365DC0}.
добавьте CLSID, и мы получим это.
CLSID не становится скрытым, если не с чем его соотнести. Когда вы перемещаетесь в папку, она выглядит как обычная папка. Однако, если вы посмотрите Procmon, вы увидите это:
Из информации Procmon вы можете видеть, что навигация внутри папки заставляет проводник искать этот CLSID в HKEY_CURRENT_USER. По умолчанию подавляющее большинство CLSID хранятся в HKEY_LOCAL_MACHINE, но CLSID в HKEY_CURRENT_USER могут все еще использоваться. Итак, теперь давайте настроим наш ключ.
До:
Добавленны записи:
По умолчанию, {24138469-5DDA-479D-A150-3695B9365DC0} - это ключ имени COM объекта:
Значения ключа InProcServer32:
Теперь, когда мы перемещаемся в нашей соединительной папке, мы видим:
Значения ключа InProcServer32:
Выполнение происходит, когда verclsid.exe вызывает присоединение процесса на нашей DLL. Найс.
Закрепление на уровне пользователя
К сожалению, похоже что это больше механизм закрепления в системе, чем вектор выполнения кода. Главным образом, потому что это потребовало бы и записи реестра и навигации в соединенительной папке. Рассматривая его как механизм закрепления, все что нам нужно сделать это установить ключи реестра и создать папку соединения в месте, в которое (или в дочернюю папку) проводник (или другой пользовательский процесс) будет перемещаться при запуске. Желательно, чтобы проводник перемещался в соеденительную папку. Мы так же могли бы сделать это с помощью библиотечных файлов в Windows 7+ (смотреть Файлы Библиотек Windows в Эксплуатации). Для более широкого охвата, используя ту же технику, я в конечном итоге заглянул в папки в которых находилось меню “Пуск”. Они загружаются в начале, уже существуют в AppData и их чаще всего просматривают через меню “Пуск”.
Итак, перейдите в %appdata%\\Microsoft\\Windows\\Start Menu
и вы должны увидеть каталоги под меню “Пуск”. Тем не менее вы должны быть осторожны при изменении любой из этих папок, так как они часто комбинируются с папками в другом месте для меню “Пуск”, и это может быть предупреждением если в меню «Пуск» цели есть две папки с одним и тем же именем. При желании вы также можете создать новую папку вместо уже существующей. В общем, возьмем что-то вроде папки “Accessories”.
Запустим команду как показано ниже чтобы изменить папку на соединенительную папку (используйте Windows API, если кодите).
И обратите внимание, что при перезагрузке снова запускается verclsid.exe.
Сохранение Dll как Exe - Windows Run
Это еще не отработанный метод, и в настоящее время он находится на стадии проверки концепции.
В настоящее время существует набор выбора CLSID (еще предстоит определить, чем именно они отличаются - пока что думю, что необходимы дополнительные записи в реестре), к которым можно получить доступ через cmd или Windows -> run. Синтаксис выглядит примерно так:
или
Эти примеры открывают папку «Мои документы» в проводнике Windows. Однако, если сделаны правильные записи это может помочь нам повторно использовать техники закрепления exe для dll.
Папки быстрого доступа + Соеденительные папки + Библиотеки + Файлы ссылок = Эксплуатация
Давайте объеденим и испольхуем эти находки. Для некоторой теории по библиотекам можно глянуть Windows Library Files In Execution.
В общем, если у нас есть эксплоит файла ссылок, мы бы хотели его скрыть. Мы также знаем из экпериментов с CLSID и соединительными папками, что мы можем принудительно изменить навигацию соединительной папки (достаточно обработки файла чтобы заставить её загрузить DLL, если CLSID находится в реестре). Еще одна приятная вещь библиотеках заключается в том, что они могут выглядеть очень похоже на каталог и продолжать обработку, даже если внешний вид проводника был изменён во время рендеринга. Мы объединим некоторые из этих вещей с техникой, в которой desktop.ini версия соединительной папки используется для запуска рендеринга файла ссылок. Это приводит нас к уникальному CLSID ({0AFACED1-E828-11D1-9187-B532F1E9575D}), который является CLSID для “папки быстрого доступа”. Так что же происходит, когда вы соединительную папку MyFolder.{0AFACED1-E828-11D1-9187-B532F1E9575D}? Итак, Microsoft разработала Shortcut Folders (Папки быстрого доступа), цели которой храняться в файле target.lnk, прямо под соединительной папкой. При перемещении по соединительной папке файл ссылки обрабатывается и срабатывает выполнение. Комбинация векторов означает, что в каталоге в который перемещается цель виден только файл библиотеки, а все остальные папки/файлы могут быть скрытыми.
Закрепление в проводнике с использованием соединительных папок и шелла (пошаговое руководство
Если вы не хотите закрепления с помощью verclsid, вы можете добавить пару дополнительных записей для уверенности что вас загружает Проводник. Чтобы настроить эту технику закрепления, вы должны:
Установите следующие ключи реестра в HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER (с учетом 64-битных и 32-битных реестров):
Создать:
Ключ | Имя | Значение | Заметка |
---|---|---|---|
SOFTWARE\Classes\CLSID | Оно не всегда создается в HKEY_CURRENT_USER | ||
SOFTWARE\Classes\CLSID<CLSID> | Создай свою CLSID, ф не ту что уже используется в системе | ||
SOFTWARE\Classes\CLSID<CLSID> | (Дефолтное) | Имя класса | Это опционально. У многих классов есть имена |
SOFTWARE\Classes\CLSID<CLSID>\InProcServer32 | |||
SOFTWARE\Classes\CLSID<CLSID>\InProcServer32 | (Дефолтное) | {Путь до DLL} | Это путь до DLL. DLL должна соответствовать архитектуре ОС. |
SOFTWARE\Classes\CLSID<CLSID>\InProcServer32 | Threading Model | Apartment | REG_SZ |
SOFTWARE\Classes\CLSID<CLSID>\InProcServer32 | LoadWithoutCOM | REG_SZ, но оставь как пустую строку | |
SOFTWARE\Classes\CLSID<CLSID>\ShellFolder | |||
SOFTWARE\Classes\CLSID<CLSID>\ShellFolder | HideOnDesktop | REG_SZ, но оставь как пустую строку | |
SOFTWARE\Classes\CLSID<CLSID>\ShellFolder | Attributes | 0xf090013d (4035969341) | REG_DWORD |
Затем, создайте соединительную папку в каталоге в который осуществляется переход при входе в систему. Хорошее место в Windows 8/8.1 - это меню “Пуск” (тем более что классического меню “Пуск” больше нет).
C:\Users{User}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories{МояПапка}.{CLSID}
Примеры создания соединительной папки:
mkdir (CreateDirectory) C:\Users{User}\Appdata\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories\Indexing.{26A81239-BD1F-48E3-BED4-EB313CFCB041} где {26A81239-BD1F-48E3-BED4-EB313CFCB041} это CLSID которое используется в записях реестра.
Также убедитесь, что вы делаете записи реестра перед созданием соединительной папки, чтобы избежать проблем с кэшированием при первом запуске.