Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

228 .......?.:?.:!?.fPl!f. Глава 3-..[Рограммнь1е защиты информации


я автоматические дизассемблеры (Sourcer, Watcom Disassembler и др.);

интерактивные дизассемблеры (IDA, DisDoc и др.);

просмотровые программы с встроенным дизассемблированием и возможностьц) изменения кода (Hiew и др.);

распаковщики исполнимого кода (CLiP386 и Generic Tracer); И, профаммы для обмана типичных алгоритмов защиты;

различного рода вспомогательные утилиты. Наиболее универсальными средствами, которые чаще всего используются для изучения кода профаммы без исходных текстов (для среды DOS) являются автоматически и интерактивные дизассемблеры (средства статического исследования) и отладчик реального и защищенного режима (средства динамического исследования). Первые пре- i образуют непонятный машинный код в удобочитаемый текст на языке Ассемблера. Вторые - информируют обо всех процессах, протекающих в недрах компьютера, после выполнения отдельного участка или даже каждой инструкции профаммы. Наша же задача, как разработчиков подсистемы обеспечения секретности кода, заключается в том, чтобы заставить все эти средства работать неправильно или парализовать их работу.

Отладчики

DEBUG - самый первый отладчик для IX)S, входивщий в комплект ее поставки. Содержит все уязвимости отладчиков реального режима - обнаружение своего присутствия по потере прерывания int 1, использование стека отлаживаемой профаммы и,т. д. Пользовательский интерфейс крайне убогий, все управление только через командную строку отладчика. В настоящее время не применяется ни для отладки, ни для взлома профамм.

Borland Turbo Debugger - один из самых удобных отладчиков с очень развитым пользовательским интерфейсом, но в то же время одна из самых некачественных сред для взлома. Обнаруживается по потере INT 1, использует стек отлаживаемой профаммы, аварийно завершается по INT О, не давая обработать ошибку деления и т. д. Даже при простейшем безусловном переходе в середину длинной команды не может ее корректно дизассемблировать при CS: IP, указывающих на эту команду!

AFD - один из первых хороших отладчиков, разработан в 1988 г. Позволяет трассирован» профамму по шагам и по подпрофаммам, сохранять/зафужать точки останова, поддерживает макросы. Вполне пригоден для взлома профамм, хотя для него и не предназначен.

InSight - один из самых удобных отладчиков реального режима DOS. Поддер*" процессоров до 486 включительно, возможность просматривать 32-разрядные регистрь"-очень удобный (намного удобнее, чем в TD!) пользовательский интерфейс, сочетают хорошо продуманное фиксированное расположение окон с удобной системой "горячи" клавиш и всплывающих меню. Не ловится противоотладочными приемами, основаннь ми на "проглатывании" 1NT 1. Однако у этого отладчика есть и серьезные нeдocтaтK

ие, i" использование стека отлаживаемой профаммы, зависание по команде INT

невозможность подфузки оверлейного кода в отлаживаемой программе. " jHeffistofel - резидентный отладчик для DOS. Удобная система "горячих" клави) всплытие при запуске профамм СОМ или ЕХЕ. Не ловится на потере INT 1. В качест прерывания точки останова по умолчанию использует INT 45h, что делает бесполезныл jj-e принудительно добавляемые команды 1NT 3. Однако содержит какую-то тонку ошибку, из-за которой неработоспособен на Pentium и выше.

Cyberware Code Digger - встроенный отладчик распаковщика CLIP386. Трассиру программу с помощью ядра этого распаковщика, способного работать в реальном реж ме защищенном режиме и режиме эмуляции процессора. Удобный пользовательск! интерфейс включает некоторые специфичные полезные возможности, например, пр смотр карты памяти. Уязвим для некоторых специфичных противоотладочных трюко основанных на архитектуре отладочной подсистемы процессора 386.

DeGlucker - один из лучших отладчиков защищенного режима. Разработан хакерал и для хакеров, что уже серьезный довод в его пользу. В последних версиях (0. 04, 0. О добавлены специфичные возможности, присущие SoftlCE, и сделано противодействие мн гим противоотладочным приемам - в частности, эмуляция выполняемых профаммой оп раций над отладочными регистрами, что делает бесполезным их "загаживание". Удобнь пользовательский интерфейс.

SoftlCE - один из самых мощных отладчиков защищенного режима. Поддерживает в( разновидности точек останова (многие отладчики ставят их только на выполнение кома; 1ы). Однако на самом деле уязвим для многих противоотладочных приемов, в том чис; основанных на потере INT 1. Некорректно задает начальные значения регистров. Зафузчр LDR всегда выставляет значение SP на 2 меньше, чем нужно. Существенный недостаток отладчик не может работать при зафуженном менеджере памяти (EMM386, QEMM и лк бые другие).

TR - "SoftlCE по-китайски". Разработан Лиу Тао Тао на основе идей SoftlCE, но им» ет качественно иное ядро. Противоотладочными трюками, основанными на потере IN I не ловится. Начальные значения регистров задает корректно. Нормально уживаетс с менеджерами памяти. Однако содержит и несколько специфичных багов, например, н может трассировать команду INT 20h.

Дизассемблеры

IDA - на сегодняшний день считается лучшим дизассемблером. Позволяет вмешр *згься в первичное дизассемблирование, переименовывать любые адреса, принудительн ассемблировать некоторые участки как код или данные, расставлять перекрестны ibuiKH и пр. Поддерживает большое количество аппаратных платформ, растущее от вер к версии. Содержит встроенный интерпретатор скриптов, написанных на С Добном языке, что позволяет расширять его возможности (так, существуют скрипт! расшифрования и даже распаковки "завернутых" файлов). Полный профаммный ко,



и всю информацию о ходе исследования сохраняет в специализированной базе форма IDB, сам файл программы не нужен после ее создания.

Dis*Doc - первый интерактивный дизассемблер для DOS. Поддерживает процессор!,, от 8086 до 80386 и 32-разрядный код. Позволяет переименовывать адреса, вносить изме. нения в дизассемблированный листинг, вносить изменения в программу без перекомпи-ляции и т. д. Все изменения дизассемблированного листинга хранит в файле с именем исходного выполнимого файла и расширением LBL. Выполнимый файл необходим дл,

дальнейшей работы.

Sourcer - лучший автоматический дизассемблер. Поддерживает многие компиляторы с языка Ассемблера. Содержит много предварительных настроек. Отлично находит перекрестные ссылки. Очень полезное свойство - выдает в конце листинга сводку исполь-зованных программой прерываний и портов ввода/вывода.

Программы просмотра

Хакерские программы просмотра предоставляют многие возможности интерактивных дизассемблеров, но при этом для них не характерна длительная обработка исполнимой программы (дизассемблируется маленький фрагмент кода, зафуженный в буфер

оперативной памяти).

HIEW - наиболее известная хакерская просмотровая профамма. На момент написания этого обзора последняя известная версия - 6.55.

Основные возможности профаммы HIEW:

просмотр двоичных файлов в текстовом, шестнадцатичном и дизacceмблepнo (встроенный дизассемблер/ассемблер до Pentium ГУвключительно) режимах;

редактирование двоичных файлов в шестнадцатеричном и дизассемблерном режил1ах;

поиск в двоичном файле последовательности байт как с различением регистра бук1 так и без такового;

поиск ассемблерных команд по шаблону; В поиск и замена последовательностей байт;

выделение блоков и манипуляции с ними - копирование в файл или из файла, запо, нение и т. д.;

и редактирование битов в байте, слове или двойном слове по текущему смещению в файле в встроенная подсистема шифрования кода командой XOR по постоянному клю длиной до 20 байт;

ш встроенная универсальная криптоподсистема с определением криптоалгоритма nor зователем на уровне ассемблерных команд;

динамическое изменение базового адреса при просмотре (по умолчанию 0);

в просмотр и редактирование заголовков исполнимых файлов различных типов и т. Д

Хакерские вьюверы обычно применяются для изменения кода ломаемой профаммы „осле ее исследования под отладчиком или исследования дизассемблированной про-аММЫ- Они годны и для полного исследования профамм, особенно простых программ jjjiH их небольших фрагментов.

QView - еще одна хакерская профамма просмотра. Во многом повторяет возможно-H1EW. Также удобный пользовательский интерфейс. Дизассемблер 486-й, более поздних версий автору не попадалось.

B1EW - многоплатформенная хакерская профамма просмотра. Понимает значительно больше форматов выполнимых файлов, чем H1EW, особенно под UNIX (от a.out до зсех или почти всех разновидностей ELF). Недостаток: для человека, привыкшего к HIEW или QView, раскладка клавиш непривычна и неудобна.

Автоматические распаковщики

Профаммы автоматической распаковки предназначены для "сдирания" с исполнимого файла запаковщика, пристыковочной защиты и т. д. Они перехватывают INT 1 или прерьгеа-ние таймера и отслеживают наступление того или иного события (первый вызов прерывания, CS: IP принимают заданное значение, найдена заданная последовательность байт по адресу CS: ГР и т. д.). Такие профаммы предназначены для "раздевания" профамм с пристыковочным модулем. Кроме того, существуют более простые распаковщики, которые отслеживают последовательности байт для конкретных защит/запаковщиков и умеют распаковывать только их. Наконец, возможно отслеживать смену регистра CS, и после заданного количества таких смен считается, что мы имеем в памяти распакованный исполнимый файл.

Распаковщик снимает с образа этого файла дамп (точнее, два дампа - из-за особенностей структуры ЕХЕ файла) и по этим дампам генерирует код распакованной профаммы.

Самые совершенные на сегодня распаковщики - это, безусловно, CUP386 3.5 и Generic Tracer 1.9, позволяющие распаковать практически любой запакованный файл (кроме специально защищенного от них). Кроме того, есть несколько хороших распаковщиков, рассчитанных на борьбу с конкретными профаммами - UNP 4.11, TRON 1.20 и 1.30, UNUCEXE 1.4, X-TRACT 1.51 и т. д.

Вспомогательные хакерские утилиты

Кроме вышеперечисленных средств, хакеры используют для взлома профамм разного рода вспомогательные утилиты. Некоторые их разновидности:

* профаммы протоколирования прерываний/операций с файлами/...;

* профаммы создания/использования/обработки CRK файлов и файлов других подобных форматов;

профаммы просмотра/редактирования оперативной памяти;

* профаммы просмотра/редактирования системных структур данных в оперативной памяти;

* профаммы автоматического определения по исполнимому файлу использованных при его создании компилятора/запаковщика/пристыковочной защиты.



Ассемблер в задачах защиты информац

3.1.3. Борьба с автоматическими

и интерактивными дизассемблерами

Автоматические дизассемблеры анализируют код исполнимого файла и формиру) соответствующий ему исходный текст или листинг. Статический анализ кода может свести на нет все усилия по созданию противотрассировочной подсистемы. Просмотрев дизассемблированный текст профаммы, можно найти и обойти все механизмы защиты от отладки. Поэтому необходима реализация подсистемы защиты профаммы от дизас-семблирования.

Защититься от статического исследования профаммы можно либо модификацией кода самой профаммой, зашифрованием кода (с пристыковкой расшифровывающего модуля), запаковкой кода, либо различными ассемблерными трюками, направленными на искажение выходного кода дизассемблера:

Ш скрытыми командами передачи управления (переходы по динамически изменяемым адресам, JMP через RET, RET и CALL через JMP), усложняющими построения дизассемблером фафа передачи управления;

Ш перекрывающимся кодом;

нестандартным форматом зафужаемого модуля, например, определением стека в сегменте кода и т. п.

Возможны также различные комбинации этих способов. Для начала два примера перекрывающегося кода.

HiddenJxp:

mov ах,02EBh

jrtp $-2

Next:

;===== Пример 3.2. ====================

mov ax, OFEOSh

jrtp $-2

02EBh - КОП jmp $+2 Продолжение

add ah,03Bh

Переход на 05h FEh EBh, т.е. на

команду add ax, OEBFEh, за которой

последуют eld и add ah, 3Bh AX = 2503h

Реальное значение AX будет неизвестно до тех пор, пока не будет помещено в р« гистр. И этот факт можно в дальнейшем использовать.

Принципы работы пристыковочных защит, основанных на зашифровании кода, был" рассмотрены в главе I. Здесь же сосредоточимся на приемах, искажающих на выХД дизассемблированный код.

Простейшим способом запутывания кода является его запутывание с помощью безУ-ловных переходов. После команды перехода на скрываемую команду ставится несколь

]mp mov int DB

Bidden:

; КОП дальнего перехода bx, OFFSET BeingDebugged

Начиная со смещения, помеченного как Hidden, дизассемблер выдаст либо неправильную последовательность команд, либо серию директив DB. Способ очень легко реализуется, однако и понять, в чем тут дело, относительно просто.

Более эффективна и более компактна вариация этого способа, при которой для скрытия защищаемой команды применяется условный переход по заведомо истинному условию. Однако истинность этого условия не должна быть "понятной" для компилятора, а тем более дизассемблера. Преимуществом этого способа является и то, что он не требует внесения дополнительных, никогда не выполняемых команд в текст профаммы. Этот способ может быть и неплохим противоотладочным приемом - одновременно сбивать с толку и дизассемблер и отладчик.

°==== Пример 3.4. === raov cmp , je DB

onnalRun:

ax, BeingDebugged ax, 0 NormalRun OEAh

call SecretRoutine

мысленно выглядящих команд и код операции и/или префикс команды, имеющер большой размер в байтах. Длина в каждом конкретном случае подбирается с таким рас четом, чтобы конец этой фиктивной команды попал в середину одной из настоящих. Этс [фиводит к тому, что дизассемблер, начиная с этой команды, выдает неверную последо вательность команд, а нередко и вообще не может ничего декодировать и только пишет последовательность директив объявления данных (DB, DW, ...). Кроме того, хорошие отладчики (InSight, DeGlucker, Meffistofel, TR и пр.) показывают в окне кода такую же неверную последовательность команд до тех пор, пока команда перехода не будет выполнена, а некачественные (Microsoft Debug, Microsoft CodeView, Turbo Debugger и т. п.] не отображают правильной команды даже после выполнения команды JMP (в момент когда CS: IP хранят адрес команды).

Итак, пример обмана дизассемблера за счет скрытия ассемблерной команды в более длинной (а на самом деле ее КОП обходится). При этом для обхода засоряющих байтов используется команда безусловного перехода. ;====== Пример 3.3. ===================================

Hidden ах, 3000 21h OEAh



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88