自主研究|Windows LNK 檔案
Windows LNK 檔案自主研究
從 LNK 基礎檔案結構、攻擊技巧到實際復現與分析工具開發的自主研究。
- Year
- 2024
- Role
- 研究/攻擊復現/工具開發/文章整理
- Team
- 個人研究
- Share
- 100%
專案總覽
受到資安大會議程啟發後,我花費約半年時間研究 Windows LNK 檔案,從基礎結構一路延伸到攻擊技巧、實際復現與分析工具開發。
問題與動機
LNK 檔案看似只是捷徑,實際上包含多種路徑、參數與中繼資料。攻擊者可利用使用者對捷徑的信任隱藏實際執行目標,增加分析與辨識難度。
檔案包含 Header、Shell Item、LinkInfo、StringData 與 ExtraData 等多段結構。
Windows 檔案總管通常不直接顯示 .lnk 副檔名,而名稱、Icon 與描述皆可自訂;攻擊者還能以大量空白隱藏過長參數,使畫面顯示內容與實際啟動行為不一致。
方法與核心內容
研究從規格與樣本拆解開始,逐步復現常見攻擊方式,再開發小型分析工具協助辨識基礎檔案結構與可疑資訊。
依 MS-SHLLINK 規格整理各區段與欄位用途,並以 Python Parser 驗證 Header、LinkFlags 與 TargetIDList。
重現圖示與名稱偽裝、過長參數、環境變數路徑及 EmbedExeLnk 尾端內嵌 Payload 等行為。
技術脈絡
將研究拆成規格理解、樣本分析、攻擊復現與工具整理四個階段。
MS-SHLLINK 二進位結構
研究依序解析 ShellLinkHeader → LinkTargetIDList → LinkInfo → StringData → ExtraData。Header 固定為 76 bytes,HeaderSize 為 0x4C,LinkCLSID 為固定 GUID;其中 LinkFlags 決定後續是否存在目標清單、路徑、參數、Icon 與環境變數區塊。
自製 Parser 的主要檢查
- 驗證 HeaderSize、CLSID 與 reserved 欄位,先排除非 LNK 或異常格式。
- 依 LinkFlags 決定要讀取的可選結構,避免以固定 offset 誤判。
- 以 little-endian 長度解析 TargetIDList 的每個 ItemID。
- 擷取 command-line arguments、icon location、working directory 與 ExtraData 供人工判讀。
研究中觀察到的介面特性
- 即使開啟顯示副檔名,檔案總管仍可能不直接呈現
.lnk字尾。 - 名稱、Icon 與滑鼠懸停描述皆可自訂,不能只依畫面外觀判斷目標。
- HotKey 欄位可為桌面捷徑設定組合鍵,因此解析時也應納入檢查。
EmbedExeLnk:尾端內嵌 Payload
LNK 對檔尾附加資料的檢查較寬鬆,因此可在合法結構後附加經 XOR 處理的 EXE 或其他內容。捷徑先開啟誘餌文件,再以隱藏 PowerShell 尋找自身、讀取尾端資料、解密到 %TEMP% 並執行,不必另外從 C2 下載 payload。
使用到的結構
- StringData:描述、command-line arguments 與 icon location。
- ExtraData:EnvironmentVariableDataBlock。
- LinkFlags:
HasName、HasArguments、HasIconLocation、IsUnicode、HasExpString、PreferEnvironmentPath。
野外樣本與行為比對
研究比較 PuppetFox、RolandSkimmer、Confucius、野外 LNK 與 EmbedExeLnk 樣本,透過 VirusTotal behavior、完整 command line、process creation 與檔案結構還原初始執行行為;研究範圍聚焦 LNK 第一階段,未把後續 payload 歸因當作本次結論。
從欄位轉成偵測訊號
可疑判斷不能只看圖示或顯示名稱。研究提出以 LinkFlags、過長參數、隱藏 PowerShell、環境變數路徑與非預期尾端資料形成規則,例如偵測 PreferEnvironmentPath(LinkFlags 的 0x00002000 bit),再搭配其他欄位降低誤報。
執行流程
研究以規格、最小實作與野外案例互相驗證,最後將觀察轉換為可重複使用的解析與偵測方法。
01 — 建立最小格式 Parser
以 Python 讀取 Header、LinkFlags 與 TargetIDList,先確認 offset、length 與 little-endian 處理正確。
02 — 復現 EmbedExeLnk
製作帶誘餌、隱藏參數與檔尾 payload 的測試樣本,在隔離環境觀察檔案落地與程序樹。
03 — 分析公開與野外案例
比對結構、command line、VirusTotal behavior 與 process creation,整理共通與差異。
偵測與使用者層防護
端點側可結合 LNK 結構規則、Script/PowerShell 記錄與 child-process 行為;使用者介面則應明確顯示檔案類型與 .lnk 副檔名,並保留捷徑箭頭,降低攻擊者只靠自訂 Icon 冒充文件或程式的成功率。
完整研究文章
更完整的欄位表、Python 程式碼、命令列與樣本觀察已整理於部落格文章〈 當連結成為駭客利器:分析 LNK 攻擊與防禦技巧〉。
我的貢獻
本研究由我獨立進行,涵蓋資料蒐集、實驗、工具與文章整理。
- 01格式與案例研究整理 LNK 結構、常見濫用方式與分析重點。
- 02攻擊測試實際建立樣本驗證不同執行與混淆情境。
- 03工具開發製作辨識基礎檔案結構與欄位的小型分析工具。
成果與反思
已完成 LNK 二進位結構整理、Python Parser、EmbedExeLnk 復現、五組公開/野外案例分析,以及結構與端點層的偵測建議。研究成果已整理為戰隊讀書會簡報與完整部落格文章〈 當連結成為駭客利器:分析 LNK 攻擊與防禦技巧〉,讀者可由本頁掌握研究脈絡,再前往文章查看程式碼、欄位表與實驗畫面。