Путеводитель по написанию вирусов: 2. Полезные структуры

Дата публикации 23 авг 2002

Путеводитель по написанию вирусов: 2. Полезные структуры — Архив WASM.RU

Теперь пришло время узнать подробнее об одной вещи, о которой мы много говорили, о PSP.

PSP (PROGRAM SEGMENT PREFIX)

Его структура выглядит следующим образом:

Давайте объясним шаг за шагом, потому что эта структура очень важна.

  • Смещение 0000h: INT 20h - это устаревший метод для прекращения работы программы, вместо которого используется функция 4Ch INT21h.
  • Смещение 0002h: Дальше идет указатель на следующий сегмент, расположенный после нашей программы. Мы используем его, чтобы узнать, сколько памяти DOS выделил нам (вычитая смещение, на которое он указывает от смещения 0000 нашего PSP). Hам возвращается память в параграфах, поэтому мы должны умножить его на 16, чтобы получить pазмеp в байтах.
  • Смещение 0005h: Это довольно любопытный путь вызова INT 21h. И, конечно, мы можем использовать его в своих целях. Функции находятся в CL вместо AH, и мы можем использовать только функции меньше 24h. Я объясню больше в главе TUNNELING.
  • Смещение 000Ah: Здесь мы сохраняем оригинальные векторы INT 22h. INT 22h получает контроль, когда программа завершает свою работу одним из следующих образов:
    • INT 20h
    • INT 27h
    • INT 21h (функции 00h, 31h, 4Ch)
  • Смещение 000Eh: Здесь мы сохраняем векторы другого int, INT 23h. Это прерывание обрабатывает комбинацию CTRL+C.
  • Смещение 0012h: Здесь сохранено другое прерывание - INT 24h. Оно обрабатывает критические ошибки. Примеры подобных ошибок? Hапример, когда в вашем дисководе нет дискеты или она защищена от записи.
  • Смещение 002Ch: Здесь начинается блок окружения.
  • Смещение 005Ch: В этом поле сохранен первый FCB (File Control Block) по умолчанию. Это путь для получения доступа к файлам обычно не используется программами (он существует для совместимости со старыми версиями DOS'а), но вирмейкеры обычно используют его для реализации невидимости. Смотрите структуру FCB за дополнительной информации.
  • Смещение 006Ch: Это второй FCB по умолчанию.
  • Смещение 0080h: У это поля есть две функции:
    • Сохранение командной части
    • Файловый буфер по умолчанию для сохранения DTA
  • Эти функции не могут жить вместе, поэтому когда стартует программа, первое, о чем мы должны подумать - это командная часть. Если она нам нужна, я рекомендую вам сохранить ее в надежное место (переменная в нашем коде). Первый байт командной части (80h) содержит ее длину, а дальше находятся реальные параметры. Структура DTA будет объяснена в той же главе.

FCB (FILE CONTROL BLOCK)

Есть два вида FCB: обычные и расширенные. Здесь приводится структура обычного FCB.

Если FCB расширенные, все вышеуказанные смещения сдвигаются на семь байтов, а первые 7 байтов выглядят следующим образом:

Определить, является ли FCB обычным или расширенным - это посмотреть, равен ли первый байт FFh. Если это так, то FCB расширенный, потому что в обычном FCB такого быть не может.

Есть вид невидимости, который меняет некоторые значения FCB, чтобы замаскировать заражение, но это будет рассмотрено в главе о невидимости.

MCB (MEMORY CONTROL BLOCK)

Она объясняется в главе о резидентных вирусах (следующая глава). А здесь приводится ее формат:

DTA (DISK TRANSFER AREA)

Эта структура очень важна в написании вирусов. Давайте посмотрим ее:

Оригинальный DTA сохраняется по смещению 80h в PSP. Мы можем сохранить его с помощью функции 1Ah INT 21h.

IVT (INTERRUPT VECTOR TABLE)

Это не "настоящая" структура. Гм... Дайте мне объяснить... IVT - это место, где хранятся все векторы прерываний (вау, гениально!). Все векторы находятся в номер_прерывания*4. Представьте, что нам нужны векторы INT 21h в DS:DX... Это просто:

Код (Text):
  1.  
  2.  xor ax,ax
  3.  mov ds,ax
  4.  lds dx,ds:[21h*4]
  5.  

Почему мы очищаем DS? Потому что IVT находится от 0000:0000 и выше. Эти манипуляции (без использования DOS) - это прямой путь для получения и помещения векторов прерываения. Хорошо, все это и больше изложено в главе о резидентных вирусах. Эй... Я забыл привести немного графики :smile3:.

Вы можете представить, что "рваная строка" означает, что есть 256 прерываний, а я хотел немного прооптимизировать этот документ (я не хочу, чтобы он занимал 5 метров!) ;).

SFT (SYSTEM FILE TABLE)

Эта структура действительно крута. Она может помочь вам сделать ваш код гораздо более мощным и оптимизированным. Это как FCB, но, как вы можете видеть, она еще мощнее. С этим таблицами мы можем сделать невидимость, изменить файловый указатель, режим работы с открытым файлом, атрибуты... Здесь у вас есть структура для DOS 4+ (я верю, что в мире не осталось людей, которые используют DOS 3 или что-нибудь в этом роде). Хорошо, если вы хотите, чтобы ваш код работал также и в DOS 3, обратитесь к RBIL. Hо SFT в DOS 3 очень похожа на эту. Все важные значения находятся в том же месте :smile3:.

Хм... Я забыл сказать, как получить доступ к SFT... Далее идет процедура, которая помещает SFT в ES:DI, принимая хэндл файла в BX.

Код (Text):
  1.  
  2.  GetSFT:
  3.         mov     ax,1220h
  4.         int     2Fh
  5.         jc      BadSFT
  6.  
  7.         xor     bx,bx
  8.         mov     ax,1216h
  9.         mov     bl,byte ptr es:[di]
  10.         int     2Fh
  11.  BadSFT:
  12.         ret
  13.  

Я настоятельно рекомендую вам сохранить значения AX/BX (BX особенно важен: мы помещаем сюда хэндл файла).

(*) Отмеченные поля используются SHARE.EXE

DIB (DOS INFO BLOCK)

С помощью DIB мы можем получить доступ к очень важным структурам, которые нельзя достигнуть другим образом. Местоположение этих структур не фиксировано. Мы должны использовать функцию 52h прерывания 21h. Это недокументированная функция DOS. Вызвав эту функцию, мы получим доступ к DIB в ES:BX.

DPB (DRIVE PARAMETER BLOCK)

Эта структура предоставляет нам очень полезную информацию для наших целей. Мы можем узнать, где она находится, используя второй указатель в DIB (смотри выше).

ТАБЛИЦА ПАРТИЦИЙ

Эта структура хорошо известна каждому, кто писал бут-инфекторы. Это первый блок жесткого винта. Он всегда первый, вне зависимости от того, находися ли мы на дискете или на жестком винте. Мы также можем называть его MBR (Master Boot Record), если это HDD, или Boot Sector, если FD.

Таблица партиций - это массив из четырех элементов, которые можно найти по смещению 01BEh в блоке. Далее идет формат каждого из этих элементов:

BPB (BIOS PARAMETER BLOCK)

В системах, основанных на DOS, загрузочная запись начинается с перехода, за которым следует структура BPB.

© Billy Belcebu, пер. Aquila


0 1.405
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532