"Ничто не превосходит по сложности человеческий ум." Ф. Херберт. "Еретики Дины".
Мы уже проделали титаническую работу, дизассемблировав в уме крохотный файл в пару десятков байт. При этом трудозатраты выглядели весьма внушительно, Так реально ли использовать такой подход для анализа приложения хотя бы в пару килобайт? И сколько на это уйдет времени?
Другими словами, и нужно ли хоть кому-нибудь то, чем мы тут занимаемся? И если нужно, то при каких обстоятельствах? Нужно: во-первых тогда, когда иного выбора просто нет. С другой стороны, тренированный взгляд даже в километровом дампе (при беглом просмотре последнего) может заметить последовательности, характерные для защитного механизма... или для вируса,
Кстати, это типичный случай — когда необходимо удостовериться в наличии вируса в полученном файле. Достаточно дизассемблировать всего несколько десятков команд, чтобы все стало ясно — вирус это или нет. Конечно, не обязательно бывает именно так, но очень и очень часто. При этом посмотреть 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
Зачем в этом месте стоит незначащий символ? Не лучше ли было избавиться от него? Увы, это никак не получится: