Здравствуйте уважаемые форумчане и форумчанки (если таковые тут имеются).
На данном форуме я человек новый, только осваиваюсь и тд, поэтому, пока выдалось некоторое количество свободного времени - решил написать небольшую статью. Я конечно не поэт и красиво излагать мысль не умею, но все же
Итак о чем статья: как понятно из названия - о ярлыках. С помощью ярлыков можно добраться к часто используемым объектам(файлам) и без особого труда к примеру обеспечить своему софту не особо бросающуюся в глаза автозагрузку. (ну или в каких либо других целях инфекта).
Кучи таких ярлыков можно обнаружить на рабочем столе, в панели быстрого запуска, главном меню и тд. Доступ к этим папкам свободный под всеми Виндами с IL=Medium (Виста,7). И шанс что их рано или поздно запустят - довольно велик, поэтому грех этим не воспользоваться
Тут возможно 2 варианта:
1. "Заражение" самого ярлыка путем дописывания пути к своему файлу без изменения иконки - довольно удобная автозагрузка
2. Заражение самих файлов, на которые указывает ярлык
Вариант 1 - довольно прост в реализации. Достаточно всего лишь записаться вперед объекта на который указывает ярлык и после своего запуска запустить сам объект, чтоб не вызывать подозрений
Плюсы: простота реализации, не бросается в глаза (как к примеру тот же реестр и тд)
Минусы: софту придется обрабатывать параметры командной строки, но не все крипторы такое поддерживают.
Вариант 2 - здесь можно извлечь путь к файлу и заразить его шеллкодом (без увеличения размера файла), который запустит малварь. Тут тоже есть своя техника, которой уже несколько лет, но она до сих пор не теряет своей актуальности (об этом в следующей статье).
Плюсы: не нужна никакая командная строка, еще больше не бросается в глаза
Минусы: новичкам не очень просто реализовать, можно здорово подпортить файл-носитель (если он чекает CRC и тд)
Рассмотрим 1 вариант:
Итак задача состоит в следующем (на данном этапе будем считать что ярлык мы нашли):
- создать экземпляр класса
- получить указатель
- загрузить ярлык
- получить путь к объекту ярлыка
- проверить на "зараженность"
- сформировать и вписать новые данные
- установить старую иконку
*- для убедительности можно еще сохранить/вернуть время файла ярлыка
На данном этапе нас интересуют интерфейсы IShellLink и IPersistFile и их методы. Кому интересно подробнее узнать об этих интерфейсах - за меня, думаю, лучше и понятнее расскажет MSDN.
Собственно код (с комментариями) (здесь и далее синтаксис МАСМ):
На данном этапе в lpBuffer содержится путь к объекту на который указывает ярлык. Теперь необходимо проверить ярлык на зараженность нашим файлом. Первое что приходит в голову - поиск подстроки в строке. Т.е. мы смотрим - существует ли уже наш файл в данном поле ярлыка. Реализуется данное множеством способов, поэтому зацикливаться нет смысла.
Вписываем новый путь к объекту:
Теперь необходимо в качестве аргумента вписать оригинальный путь к объекту. Можно также добавить какой-либо ключ, чтоб софт знал что делать именно с этм параметром (к примеру: -exec %original_file%)
Далее необходимо ПРИНУДИТЕЛЬНО вернуть оригинальную иконку ярлыку,
сохранить изменения и освободить СОМ.
В результате после таких нехитрых манипуляций получился ярлык, запускающий 2 файла и имеющий первоначальную иконку.
Для глобализации "заражения" можно использовать рекурсивный поиск файлов (FindFirstFile/FindNextFile) в указанных каталогах.
Вот собственно и все. Вариант 2 возможно будет рассмотрен в следующих статьях. Конечно, я не открыл Америку и данная статья не претендует на Оскар, Нобелевскую премию и мировое признание, но все же хочется надеяться, что кому-то это показалось интересным и возможно даже в чем-то помогло.
Благодарю за внимание.
(cl) Rev0Lt for DamageLab (2k11)
На данном форуме я человек новый, только осваиваюсь и тд, поэтому, пока выдалось некоторое количество свободного времени - решил написать небольшую статью. Я конечно не поэт и красиво излагать мысль не умею, но все же
Итак о чем статья: как понятно из названия - о ярлыках. С помощью ярлыков можно добраться к часто используемым объектам(файлам) и без особого труда к примеру обеспечить своему софту не особо бросающуюся в глаза автозагрузку. (ну или в каких либо других целях инфекта).
Кучи таких ярлыков можно обнаружить на рабочем столе, в панели быстрого запуска, главном меню и тд. Доступ к этим папкам свободный под всеми Виндами с IL=Medium (Виста,7). И шанс что их рано или поздно запустят - довольно велик, поэтому грех этим не воспользоваться
Тут возможно 2 варианта:
1. "Заражение" самого ярлыка путем дописывания пути к своему файлу без изменения иконки - довольно удобная автозагрузка
2. Заражение самих файлов, на которые указывает ярлык
Вариант 1 - довольно прост в реализации. Достаточно всего лишь записаться вперед объекта на который указывает ярлык и после своего запуска запустить сам объект, чтоб не вызывать подозрений
Плюсы: простота реализации, не бросается в глаза (как к примеру тот же реестр и тд)
Минусы: софту придется обрабатывать параметры командной строки, но не все крипторы такое поддерживают.
Вариант 2 - здесь можно извлечь путь к файлу и заразить его шеллкодом (без увеличения размера файла), который запустит малварь. Тут тоже есть своя техника, которой уже несколько лет, но она до сих пор не теряет своей актуальности (об этом в следующей статье).
Плюсы: не нужна никакая командная строка, еще больше не бросается в глаза
Минусы: новичкам не очень просто реализовать, можно здорово подпортить файл-носитель (если он чекает CRC и тд)
Рассмотрим 1 вариант:
Итак задача состоит в следующем (на данном этапе будем считать что ярлык мы нашли):
- создать экземпляр класса
- получить указатель
- загрузить ярлык
- получить путь к объекту ярлыка
- проверить на "зараженность"
- сформировать и вписать новые данные
- установить старую иконку
*- для убедительности можно еще сохранить/вернуть время файла ярлыка
На данном этапе нас интересуют интерфейсы IShellLink и IPersistFile и их методы. Кому интересно подробнее узнать об этих интерфейсах - за меня, думаю, лучше и понятнее расскажет MSDN.
Собственно код (с комментариями) (здесь и далее синтаксис МАСМ):
Код:
; сдесь необходимо инициализировать СОМ
...
; создание экземпляра класса ShellLink
invoke CoCreateInstance, addr CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, addr IID_IShellLink, addr pSL
...
; получение указателя на IPersistFile
coinvoke pSL, IShellLink, QueryInterface, addr IID_IPersistFile, addr pPF
...
; загрузка ярлыка
coinvoke pPF, IPersistFile, Load, lpBuffer, STGM_READWRITE
...
; получение IShellLink для ярлыка
coinvoke pPF, IShellLink, QueryInterface, addr IID_IShellLink, addr ppSL
...
; получение пути к файлу ярлыка
coinvoke ppSL, IShellLink, GetPath, lpOriginalFile, 512, addr WFD, 0
...
Вписываем новый путь к объекту:
Код:
coinvoke ppSL, IShellLink, SetPath, szMalwareFile
Код:
coinvoke ppSL, IShellLink, SetArguments, lpOriginalFile
Код:
coinvoke ppSL, IShellLink, SetIconLocation, lpOriginalFile, 0
В результате после таких нехитрых манипуляций получился ярлык, запускающий 2 файла и имеющий первоначальную иконку.
Для глобализации "заражения" можно использовать рекурсивный поиск файлов (FindFirstFile/FindNextFile) в указанных каталогах.
Вот собственно и все. Вариант 2 возможно будет рассмотрен в следующих статьях. Конечно, я не открыл Америку и данная статья не претендует на Оскар, Нобелевскую премию и мировое признание, но все же хочется надеяться, что кому-то это показалось интересным и возможно даже в чем-то помогло.
Благодарю за внимание.
(cl) Rev0Lt for DamageLab (2k11)