Общий подход к чтению файлов LNK

Некоторые фреймворки и языки, кажется, имеют парсеры файлов lnk (C#, Java, Python, конечно, бесчисленное множество других), чтобы добраться до их целей, свойств и т. Д. Я хотел бы знать, каков общий подход к чтению файлов lnk, если я хочу разобрать lnk на другом языке, который не имеет указанной функции. Есть ли для этого Windows API?

6 ответов

Решение

Существует не официальный документ от Microsoft, описывающий формат файла lnk, но есть некоторые документы, которые имеют описание формата. Вот один из них: Формат файла ярлыка (.lnk)

Что касается API, вы можете использовать интерфейс IShellLink

Это старый пост, но здесь моя реализация C# для обработки lnk, которая обрабатывает всю спецификацию

https://github.com/EricZimmerman/Lnk

больше информации и инструмент командной строки здесь

http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html

Просто используйте анализатор файлов lnk в проекте JAFAT Archive of Forensics Analysis Tools.

См. Lnk-parse-1.0.pl на http://jafat.sourceforge.net/

Кажется, нет никакой зависимости. Синтаксис прост, и файл ссылок становится простым текстом в стандартном выводе и может использоваться в Linux.

@Giorgi: На самом деле, существует официальная спецификация файлов lnk, по крайней мере, так заявлено: http://msdn.microsoft.com/en-us/library/dd871305%28PROT.10%29.aspx Однако для некоторых По этой причине ссылка кажется неактивной, и после загрузки всего пакета документов (45Megs) (Application_Services_and_NET_Framework.zip) выясняется, что он не включает файл MS-SHLLINK.pdf.

Но действительно ли это удивительно?

Как только вы получили формат файла, не должно быть слишком сложно написать код для его чтения.

Использование компонентов, связанных с WSH, кажется наиболее удобным вариантом для чтения. .lnk файлы на большинстве языков в Windows XP. Вам просто нужен доступ к среде COM и создать экземпляр WScript.Shell Составная часть. (помните, что на win ссылки на Shell обычно относятся к explorer.exe)

Следующий фрагмент, например, работает на PHP: (PHP 5, используя COM-объект)

<?php
$wsh=new COM('WScript.Shell'); // the wsh object

// please note $wsh->CreateShortcut method actually
// DOES THE READING, if the file already exists. 
$lnk=$wsh->CreateShortcut('./Shortcut.lnk');
echo $lnk->TargetPath,"\n";

Этот другой, вместо этого, делает то же самое на VBScript:

set sh = WScript.CreateObject("WScript.Shell")
set lnk = sh.CreateShortcut("./Shortcut.lnk")
MsgBox lnk.TargetPath

Большинство примеров в этой области написаны на VB / VBS, но они хорошо подходят для всего диапазона языков, поддерживающих взаимодействие COM и WSH в той или иной форме.

Этот простой урок может пригодиться, поскольку он перечисляет и иллюстрирует некоторые из наиболее интересных свойств .lnk файл, кроме самого важного: TargetPath, Это:

  • WindowStyle,
  • Hotkey,
  • IconLocation,
  • Description,
  • WorkingDirectory

вот код C # с использованием Shell32 API из моего проекта "ClearRecentLinks" на https://github.com/jmaton/ClearRecentLinks

Чтобы использовать это, ваш проект C # должен ссылаться на c:\windows\system32\shell32.dll

                  string linksPath = "c:\some\folder";
            Type shell32Type = Type.GetTypeFromProgID("Shell.Application");
            Object shell = Activator.CreateInstance(shell32Type);
            Shell32.Folder s32Folder = (Shell32.Folder)shell32Type.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { linksPath });
            foreach (Shell32.FolderItem2 item in s32Folder.Items())
            {
                if (item.IsLink)
                {
                    var link = (Shell32.ShellLinkObject)item.GetLink;
                    if (link != null && !String.IsNullOrEmpty(link.Target.Path))
                    {
                        string linkTarget = link.Target.Path.ToLower();
                        // do something... 
                    }
                }
            }
Другие вопросы по тегам