Анимация
JavaScript
|
Главная Библионтека 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 |