Ассемблирование в уме

"Ничто не превосходит по сложности человече­ский ум." Ф. Херберт. "Еретики Дины".

Мы уже проделали титаническую работу, дизассемблировав в уме крохотный файл в пару десятков байт. При этом трудозатраты выглядели весьма внушитель­но, Так реально ли использовать такой подход для анализа приложения хотя бы в пару килобайт? И сколько на это уйдет времени?

Другими словами, и нужно ли хоть кому-нибудь то, чем мы тут занимаемся? И если нужно, то при каких обстоятельствах? Нужно: во-первых тогда, когда иного выбора просто нет. С другой стороны, тренированный взгляд даже в километровом дампе (при беглом просмотре последнего) может заметить после­довательности, характерные для защитного механизма... или для вируса,

Кстати, это типичный случай — когда необходимо удостовериться в наличии вируса в полученном файле. Достаточно дизассемблировать всего несколько десятков команд, чтобы все стало ясно — вирус это или нет. Конечно, не обязательно бывает именно так, но очень и очень часто. При этом посмотреть 1 файл по "F3" гораздо быстрее, чем искать дизассемблер.

[ Но иногда на машине нет ни одного компилятора, а требуется написать хотя бы простенькую программу. Например, для удаления того же вируса (при условии, что обычные антивирусы его "не берут"). Если еще усложнить задачу, то можно представить, что в нашем распоряжении нет не только компилятора, но и даже шестнадцатиричного редактора.

Кажется, что в такой ситуации ничего сделать невозможно. И администраторы подобных систем уверены, что они на 100% защищены от злоумышленников. Однако это лишь распространенное заблуждение. В MS-DOS есть возможность создавать бинарные файлы с помощью клавиши Alt и вспомогательной цифровой клавиатуры. Когда-то это входило практически во все руководства по IBM XT/AT, а сейчас уже никем и нигде не упоминается.

Давайте воскресим этот древний "обряд" и создадим маленький бинарный файл, который ничего не делает, а только возвращает управление MS-DOS. Для

{этого дадим команду:

copy con test.com

 

Она вызовет примитивнейший текстовый редактор системы, но его возможностей для нас в данный момент будет предостаточно. Убедившись, что индикатор "Num Lock" горит, нажмем ALt и, не отпуская ее, на цифровой клавиатуре наберем 195. Отпустим Alt и нажмем Ctri-Z для закрытия файла и выхода из редактора.

Запустим полученный файл. Он ничего не делает, но и не зависает. Дизассем-блировав его, мы поймем, что он состоит из одной команды RETN (ОхСЗ === 195). Конечно, это довольно незатейливый пример, и реализацию можно улучшить, если ввести "магическую" последовательность, показанную ниже.

Ait-180 Alt-09 Alt-186 Alt-09 Ait-OI Ait-205 I Alt-195 Alt-32 Hello. Sailor!$ Ctri-Z

Как нетрудно догадаться, мы получим сот-файл, выводящий указанную фразу на экран. Действительно, он это и делает. Но обратите особое внимание на то, что мы его создали используя только штатные средства MS-DOS, которые есть на любой машине, где есть MS-DOS (или Windows).

Точно так же можно написать и любую троянскую программу, обойти уста­новленную защиту или, наконец, одуматься и сделать все же что-то полезное. Например, уничтожить вирус, восстановить разрушенный диск, или сделать что-то другое, в зависимости от ситуации.

Дизассемблируем только что полученный файл и обратим внимание на один ключевой момент:

seg000:0100 start proc near

seg000:0100 mov ah, 9

seg000:0102 mov dx, offset aHelloSailor ; "Hello, Sailor!$'

seg000:0105 int 21h ; DOS - primt stRING

seg000:0107 retn

seg000:0107 start endp

seg000:0108db 20h ;

seg000:0109 aHelloSailor db 'Hello,SailorlS' ; DATAXREF: start+2o

Зачем в этом месте стоит незначащий символ? Не лучше ли было избавиться от него? Увы, это никак не получится: