Создаем рекурсивные ярлыки в Windows

:

Все мы знаем, что такое ярлык. А что будет, если сделать ссылку ярлыка самого на себя?
Создание ярлыка на ярлык приводит к его копированию. И что будет, если принудительно создать побайтно такой ярлык?

Но, расскажу я не об этом, а о том, как можно создать папку, от вида которой все программы вылетают с ошибками.
Да, только от вида: на папку даже кликнуть не успеете.

Зайти в такую папку обычными файловыми менеджерами будет невозможно.

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

Предыстория


Когда я учился в университете, было полно времени, и я изучал Windows всеми возможными способами.
Перерыл все папки системы, весь реестр, искал глюки и находил их.
Это было давно, но я вспомнил про один интересный «глюк», о котором расскажу в этом посте.

Однажды я заметил, что, если перетащить любую папку в Пуск=>Все программы, то там создается не ярлык, а папка.
Ее можно перетащить на рабочий стол, и она будет выглядеть, как папка, но вести себя, как ярлык.
Это меня озадачило, и я начал копать глубже.
Обнаружил, что такие папки сами создаются в «Сетевом окружении» и ведут себя так же.

Понял, что увидеть «настоящие» внутренности папки с помощью проводника невозможно.
Запустив консоль, я смог добраться к файлам внутри.

Там были два файла: desktop.ini и target.lnk

Если переименовать или удалить один из файлов, то проводник начнет показывать настоящие внутренности.

В файле desktop.ini обнаружил следующий текст:

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2

А ярлык ссылался на ту папку, которую я создал в начале.

Меня это заинтересовало, поскольку понял, что внутри такой папки могут быть еще файлы, и их никто не увидит.
В университете все компьютеры были с ограниченным доступом, и мою папку с личными файлами мог удалить любой студент, а компьютера у меня тогда не было.
И флешек тогда не было. Дискеты не надежны, так что хранить свои файлы на университетских компьютерах было небезопасно.

И я понял, что мои файлы в такой папке никто не увидит, а получить доступ к своей папке я могу по прямому адресу внутри папки-ярлыка.
Но это не давало защиты персональным файлам: папку все равно могли удалить вместе с моими данными.

Я возился дальше с интересной папкой, пробовал заменять файл target.lnk на свой, и смотреть, что получится.
Можно менять иконку ярлыка, и иконка папки в этом случае тоже меняется.

И тут я создал ярлык на тот же файл desktop.ini, переименовал его на target.lnk

Такому эффекту я сразу не поверил, и не понял, в чем дело: после переименования проводник сразу же выдал ошибку и перезапустился.
Я полез обратно в созданную папку, и как только увидел ее, то проводник опять вылетел.

Я начал исследовать странный эффект и понял, что проводник пытался получить свойства папки-ярлыка, и они перенаправлялись на саму папку еще раз. В итоге получается зацикливание.
Пробовал заходить в папку разными программами: даже Total Commander вылетал при попытке зайти в нее, пускай даже с задержкой. Зайти в нее удавалось только с помощью консоли.

И я понял, что эта папка будет хорошо хранить мои данные, и никто из студентов не сможет даже щелкнуть мышкой на нее, чтобы удалить.

Последовательность действий


Дальше я расскажу, как сделать такую папку, отвязать привязку к пути, и как создать на флешке такую «защищенную» папку, которая бы «работала», как положено, на всех компьютерах.
Для того, чтобы папка-убийца ярлык работала, как положено, должно быть следующее:

  • у папки должен быть атрибут System
  • в папке должен быть файл desktop.ini с правильным контентом
  • в папке должен быть ярлык target.lnk, который ссылается на файл desktop.ini в этой же папке

При создании такой папки, используя проводник, есть подводные камни

  • атрибут System для папки должен быть задан до создания внутренних файлов
  • надо сначала записать данные в desktop.ini и только после этого ставить его в папку
  • перед тем как положить ярлык target.lnk в папку, в нее надо перезайти

Создаем «защищенную» папку, которая работает на всех файловых системах Windows

  1. создать пустую папку, желательно не на рабочем столе
  2. создать подпапку, положить туда ваши данные и запомнить путь
  3. задать первоначальной папке атрибут System
  4. создать текстовый файл desktop.txt и записать в него данные, как написано выше
  5. переименовать desktop.txt в desktop.ini
  6. создать ярлык на desktop.ini под названием target.lnk, и проводник перезапустится

Теперь надо заходить в вашу подпапку только по адресу и, желательно, не в проводнике (из-за сохранения предыдущих путей).
Например, в консоли написать explorer.exe <адрес папки>, и история не будет сохранена, чтобы никто не вычислил путь.

Для автоматизации создания такой папки я написал скрипт:

Dim arg, WSHShell, fsobj, file, link

Set arg = WScript.Arguments
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set fsobj = WScript.CreateObject("Scripting.FileSystemObject")

If arg.Length = 0 Then
WSHShell.Popup "Перетащите папку на этот файл"
End If

If arg.Length > 0 Then

'Задаем атрибут папки Системный
fsobj.GetFolder(arg(0)).Attributes = 1

'Пишем файл desktop.ini
Set file = fsobj.OpenTextFile(arg(0) + "\desktop.ini", 2, True)
file.Write "[.ShellClassInfo]" + vbCrLf
file.Write "CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}" + vbCrLf
file.Write "Flags=2" + vbCrLf
file.Close

'Создаем ярлык target.lnk который ссылается на desktop.ini
Set link = WSHShell.CreateShortcut(arg(0) + "\target.lnk")
link.TargetPath = arg(0) + "\desktop.ini"
link.Save
WSHShell.Popup "Папка-убийца создана"
End If

Его надо сохранить в файл под названием mkFolderKiller.vbs, и папку перетаскивать на него.
Привязка пути к защищенной папке

Созданная папка будет строго зависеть от ее первоначального адреса.
Если ее переименовать, тогда можно будет в нее зайти.
И я нашел решение, хоть и не идеальное, но которое позволяет менять адрес папки.

Нам надо создать пустую папку в таком месте, в которое пользователь не сможет залезть.
Например, глубоко в файлах системы (если есть доступ).
Задаем ей атрибут System, и пишем туда файл desktop.ini, но не спешим делать ярлык.

Теперь, на другом диске, там, где должна быть папка с данными, делаем то же, например, на D:\.
Берем ярлык файла desktop.ini с диска С:\ и кладем в папку, что на диске D:\. Только после этого делаем ярлык в папке диска C:\.

В результате, папка, что на диске D:\, будет исполнять свою «функцию», которая нам нужна, даже если менять ее адрес.

Защита папки на флешке

Тут особо говорить нечего.
Думаю, многие догадались, что можно создать папку, в которой будут «защищенные» папки для всех букв алфавита.
А доступ к вашей защищенной папке можете получить только вы, зная полный адрес.

Выводы


Каждый может создать себе эту папку, ради забавы, ради тестов или ради примитивной защиты.
Является ли это надежной защитой?

Конечно же, нет. Есть много других способов надежнее этого.
Для опытного пользователя не составит труда разобраться, и попасть в такую «защищенную» папку.
Но это озадачит на некоторое время. А простые пользователи и вовсе не смогут попасть туда.
На каких версиях Windows эта папка будет «работать»?

Лично я проводил все эксперименты в университете, на Windows XP и 2000.
И, со временем, на Windows Vista, 7 и Windows 8.
Вне зависимости от разрядности системы, оно работает на всех версиях.
Приносит ли вред эта папка компьютеру?

Конечно же, нет. Все, что она делает, это зацикливает процесс, который хочет получить к ней доступ, и это приводит к его перезапуску.
Как удалить такую папку-убийцу?

Можно зайти с помощью консоли в папку и переименовать один из двух файлов или убрать флаг System у папки.
Или переименовать коренную папку, чтобы нейтрализовать зацикливание.
Если не терпится попробовать

Можете скачать файл по ссылке ShortcutKiller.rar,
распаковать его в папку C:\TEMP\1234, и перезайти в нее.
В архиве есть папка 1 с двумя файлами desktop.ini и target.lnk, привязанными только к этому пути.

Надеюсь, статья была вам интересна, и что у меня получилось хорошо все объяснить.
Я находил еще много разных глюков, про которые нигде не написано, может, расскажу в другой раз :)