Игорь Гульев

Создаем вирус и антивирус


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

не найден, вирус возвращает управление программе-носителю.

      Адреса и номера функций

      Для June Test Release KERNEL32 находится по адресу 0BFF93B95h, для August Release – по адресу 0BFF93C1Dh. Можно найти другие значения функции, используя 32-битный отладчик. В таблице 3.1 приведены адреса функций, которые нужны для работы вируса.

Таблица 3.1. Адреса некоторых функций KERNEL

      Соглашения о вызовах

      Windows 95 написан на языках C++ (в основном) и Assembler. И, хотя соглашения о вызовах просты для применения, Microsoft их не использует. Все API под Win95 используют Pascal Calling Convention. Пример – API, описанный в файлах справки Visual C++:

      FARPROC GetProcAddress(

      HMODULE hModule, // описатель DLL−модуля

      LPCSTR lpszProc // имя функции

      );

      На первый взгляд кажется, что достаточно лишь сохранить в стеке описатель DLL-модуля (он стоит перед указателем на имя функции) и вызвать API. Но это не так. Параметры, согласно Pascal Calling Convention, должны быть сохранены в стеке в обратном порядке:

      push offset lpszProc

      push dword ptr [hModule]

      call GetProcAddress

      Используя 32-битный отладчик, можно оттрассировать вызов и найти вызов KERNEL32 для каждого конкретного случая. Это позволит получить номер функции и обойтись без необходимой для вызова таблицы импортируемых имен.

      Заражение файлов формата PE-executable

      Определение положения начала PE-заголовка происходит аналогично поиску начала NE-заголовка. Если смещение таблицы настройки адресов (поле 18h) в заголовке EXE-файла 40h или больше, то по смещению 3Ch находится смещение PE-executable заголовка. Сигнатура PE-executable («PE») находится, как и у NE-executable EXE-файла, в начале нового заголовка.

      Внутри PE-заголовка находится таблица объектов. Ее формат наиболее важен по сравнению с прочими. Для добавления вирусного кода в носитель и перехвата вирусом управления необходимо добавить элемент в таблицу объектов.

      Основные действия заражения PE-executable файла:

      1. Найти смещение заголовка PE-executable в файле.

      2. Считать достаточное количество информации из заголовка для вычисления его полного размера.

      3. Считать весь PE-заголовок и таблицу объектов.

      4. Добавить новый объект в таблицу объектов.

      5. Установить точку входа RVA на новый объект.

      6. Дописать вирус к файлу по вычисленному физическому смещению.

      7. Записать измененный PE-заголовок в файл.

      Для определения расположения таблицы объектов следует воспользоваться значением переменной «HeaderSize» (не путать с «NT headersize»), которая содержит совместный размер заголовков DOS, PE и таблицы объектов.

      Для чтения таблицы объектов необходимо считать HeaderSize байт от начала файла.

      Таблица объектов расположена непосредственно за NT-заголовком. Значение «NTheadersize» показывает количество байт, следующих за полем «flags». Итак, для определения смещения таблицы объектов нужно получить NTheaderSize и добавить размер поля флагов (24).

      Добавление объекта: получив количество объектов, умножить его на 40 (размер элемента таблицы объектов). Таким образом определяется смещение, по которому будет расположен вирус.

      Данные для элемента таблицы объектов должны быть вычислены с использованием информации в предыдущем элементе (элементе носителя).

      RVA=((prev