如何读取LNK快捷方式文件本身的字节数据而非其指向的目标?
问题根因
你创建的根本不是标准Windows LNK快捷方式文件。New-Item -ItemType SymbolicLink生成的是NTFS文件系统级符号链接,只是人为将后缀命名为.lnk。系统解析路径时会自动跟随这类符号链接指向目标文件,所以读取操作直接拿到了目标alg.exe的PE内容,和你预期的Shell快捷方式(二进制LNK格式)完全无关。
标准LNK文件是Windows Shell定义的二进制格式文件,固定魔数开头为0x4C(十进制76,对应ASCII字符L),不属于NTFS重解析点类的符号链接。
正确实现方法
1. 创建原生LNK快捷方式
通过WScript.Shell COM对象生成标准格式的LNK文件,不要用NTFS符号链接伪装:
$WshShell = New-Object -ComObject WScript.Shell $lnkPath = Join-Path $env:USERPROFILE "Desktop\test.lnk" # 先删除之前创建的假lnk符号链接 if (Test-Path $lnkPath) { Remove-Item $lnkPath -Force } $Shortcut = $WshShell.CreateShortcut($lnkPath) $Shortcut.TargetPath = "C:\Windows\System32\alg.exe" $Shortcut.Save()
2. 读取LNK文件原始字节
优先使用.NET底层文件读取方法,彻底避免路径解析自动跟随重定向的问题,兼容所有PowerShell版本:
$lnkPath = Join-Path $env:USERPROFILE "Desktop\test.lnk" $file_data = [System.IO.File]::ReadAllBytes($lnkPath) $encoded = [System.Convert]::ToBase64String($file_data)
验证结果
执行后输出$encoded的开头内容,会得到预期的TAAAAAEUA,对应字节序列开头为76 0 0 0 1 20 2 0,完全匹配LNK文件的标准魔数。
补充:如果场景是需要读取后缀为.lnk的NTFS符号链接本身而非目标,直接使用上面的
[System.IO.File]::ReadAllBytes()方法即可绕过PowerShell cmdlet对符号链接的自动跟随逻辑。
内容的提问来源于stack exchange,提问作者Utkonos
相关产品推荐
相关产品推荐

