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

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

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

Автор: Игорь Гульев

Издательство:

Жанр: Компьютеры: прочее

Серия:

isbn: 5-89818-087-7

isbn:

СКАЧАТЬ 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 RVA+prev Virtual Size)/OBJ Alignment+1)

      *OBJ Alignment

      Virtual Size=((size of virus+buffer any space)/OBJ Alignment+1)

      *OBJ Alignment

      Physical Size=(size of virus/File Alignment+1)*File Alignment

      Physical Offset=prev Physical Offset+prev Physical Size

      Object Flags=db 40h,0,0,C0h

      Entrypoint RVA=RVA

      Теперь необходимо увеличить на единицу поле «количество объектов» и записать код вируса по вычисленному «физическому смещению» в размере СКАЧАТЬ