Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Поиск и считывание файлов

Вопрос:
Возникли некоторые теоретические вопросы по главе 13 "Поиск и считывание файлов". 1. В самом начале главы 13.1.1. автор пишет:
"Как вы уже знаете, файлы типа СОМ загружаются в первый свободный сегмент, и их код располагается по смещению 100h. Следовательно, нам нужно будет сохранить в теле нашего вируса первые три байта "файла-жертвы", записать вирус в "хвост" файла и, вместо сохранённых трёх байт, установить команду jmp на начало кода нашего вируса (т.е. передать ему управление)". Вот, ума не приложу, почему "следовательно"?, откуда такой вывод? Нет же никакой взаимосвязи между "следовательно" и "кодом, располагающимся по смещению 100h". И почему нужно обязательно сохранять именно три байта, с чем именно это связано? Может, есть, конечно, такое правило, что нужно сохранять только 3 байта и ни байтом больше, но до 13 главы я о нём ничего у автора не читал.
2. В главе 13.1.2. автор, объясняя PSP и DTA, пишет:
"По адресу 80h находится по умолчанию DTA. ... проблема в том, что по этому адресу (80h) располагается изначально командная строка. ... Дело в том, что когда мы попробуем искать первый файл, то затрём командную строку (L_C:/S/U). Получается что "программа-жертва", к которой мы "подцепились", не сможет прочитать те параметры, которые ей передал пользователь. В данном случае - это (L_/S/U ". Не понимаю, как мы затрём DTA "программы-жертвы", у ней же свой PSP, а у нашего вируса другой. Мы же хотим прицепиться в "хвост" "программы-жертвы", т.е. после её PSP и областей кода и данных. Как я представляю себе, сначала идёт PSP "программы-жертвы" (100h), затем сама собственно "программа-жертва" (код и данные), пусть их размер будет, например, 90h. Тогда общий размер "программы-жертвы" будет равен 100h (PSP)+90h (код и данные)=190h. Значит, если мы цепляемся в "хвост" "программы-жертвы", то наш вирус начнётся со 191h. Причём со 191h начнётся наш PSP, отличный от PSP "программы-жертвы". Таким образом, с 191h до 290h будет находится PSP нашего вируса, а уже после 290h начнутся код и данные нашего вируса. Так как же при таком раскладе, если он, конечно, правильный, мы затрём DTA?!

Ответ:
1. 3 байта - это размер памяти занимемой командой jmp, котурую вирус запишет по смещению 100h(в файле это первые 3 первых байта).

2. У программы может быть только один PSP. Внедренный в программу вирус не имеет своего PSP.


0000h - 00FFh : PSP программы жертвы
0100h - 0102h : jmp <начало кода вируса>
0103h - xxxxh : тело программы жертвы (xxxx = размер файла com - 1)
xxxxh - yyyyh : тело вируса (код + данные + 3 сохраненных байта зараженной программы)
Запуск зараженной программы происходит в такой последовательности:
- dos формирует PSP и загужает com файл по смещению 100h
- dos передает управление коду по смещению 100h 
- выполняеться команда jmp, которая запускает код вируса
- вирус выполняет свои функции (поиск, заражение и т.д.)
- вирус восстанавливает 3 первых байта программы
- вирус командой jmp возвращает управление программе жертве
- программа выполняет свои функции
- программа одним из способов прекращает свою работу

   Вперёд
   Содержание