Windowsのショートカット(.lnk)のリンク先って見たら分かるんじゃんって思ってたけど、実はパッと見で分からくする方法があるんですね。

大量の空白とかで埋めたり、.lnkに関わる様々なフラグを設定すると引数表示しなかったり、そもそも表示と異なるものを実行したりできると。
Windowsのショートカット(.lnk)って構造が複雑過ぎじゃない????
リンク先の表示偽装の5パターン
上記記事で紹介されているのをざっくり紹介
1.CVE-2025-9491
\x20(スペース)、\x09(タブ)、\x0A(LF)、\x0D(CR)を大量に挿入して256文字超にする。ExplorerのUIは先頭256文字だけを表示するようだった?らしい。notepad.exeを実行するように見せかけて、見えないところにmshtaでJSを実行するとかできる。
2.引数非表示
HasExpStringフラグやEnvironmentVariableDataBlockというところに関係する値をNULLにする。コマンドの引数が非表示になるらしい。わーお。
3.""で表示偽装
HasTargetIDListとHasExpStringフラグを使用して、TargetAnsi/Unicodeに"c:\test.pdf"みたいな引用符("")入りパスを設定。すると、表示されるのは引用符で囲まれたもの、それが無効な値と判断されLinkTargetIDListにセットされた別のパスがリンク先となるらしい。わおわーお。
4. 2回目のエラー修正で修復後実行
HasExpStringとHasLinkTargetIDListとHasLinkInfoフラグを使用。LinkTargetIDListに構造上不正な値を入れておき、LinkInfoに本命をセット。1度目のリンククリックはエラーになるらしいが、Windowsの自動修復機能により2回目の実行には本命が実行される。何でそんな構造に????ただし、最新バージョンでは効果無し?
5.ANSIだけ実行させる
HasExpStringとHasLinkTargetIDListフラグを使用。LinkTargetIDListに偽リンクを設定。EnvironmentVariableDataBlockのTargetUnicodeをNULLにして、TargetAnsiに本命リンク先設定。Unicodeでのリンク先実行に失敗して、ANSIで実行されるらしい。
おあつらえ向きにツールも作成されています。
github.com
もう一度言うけど、ショートカットって構造が複雑すぎじゃね
ショートカットって改めてみるとかなり複雑なバイナリ構造になっている。
learn.microsoft.com
ショートカット(.lnk)って割と偽装方法があったことが分かったので、気を付けねば。
ショートカットって作るときは右クリックするだけなのに、パラメータ多すぎっしょ。