Дао универсальной распаковки Крис Касперски Хакер, номер #089, стр. 089-114-1 Разработка универсального распковщика: алгоритм Самый банальный взлом какой-нибудь программы происходит по принципу: скачал распаковщик, распаковал, взломал. Однако разработчики не совсем дебилы и вполне в состоянии предсказать подобный ход событий. Именно поэтому они стараются использовать такие защиты и упаковщики, под которые еще не написан соответсвующий крякерский софт. Спасают хакеров универсальные утилиы. Обобщив свой опыт борьбы с упаковщиками, Крис предлагает алгоритм универсального распаковщика, пробивающего 99% защит. [в поисках OEP] Создание универсального распаковщика начинается с алгоритма определения OEP (Original Entry Point — Исходная Точка Входа), отслеживающего момент завершения распаковки с последующей передачей управления "программе-носителю". Это самая сложная часть универсальных распаковщиков, поскольку определить исходную точку входа в общем случае невозможно. Вот и приходится прибегать к различным ухищрениям. Чаще всего для этого используется пошаговая трассировка, которой упаковщик/протектор чаще всего легко противостоит. Проблему не решают и трассеры нулевого кольца. Справиться с ними с прикладного уровня (а большинство упаковщиков/протекторов работают именно на нем) практически невозможно, однако разработка подобного трассера зачастую оказывается непосильной задачей для начинающих. И хотя в распоряжении автора имеются исходные тексты великолепного трассера, разработанного группой Володи с WASM'а, я решил пойти другим путем, ограничившись только аппаратными точками останова, для установки которых прибегать к написанию драйвера совершенно не обязательно. В "Записках мыщъха", электронную копию которых можно свободно утянуть с ftp://nezumi.org.ru, показано, как это сделать с прикладного уровня, даже без прав администратора! На первом этапе в качестве основного экспериментального средства мы будем использовать "Блокнот", пожатый различными упаковщиками, и знаменитый отладчик SoftICE. [дамп живой программы] Самый простой (и самый популярный) способ борьбы с упаковщиками — снятие дампа заведомо после завершения распаковки. Дождавшись появления главного окна программы, хакер сбрасывает ее дамп, преобразуя его в исполняемый файл. Иногда он работает, иногда - нет. Попробуем разобраться почему. Возьмем классическое приложение "Блокнот" из поставки NT и попробуем снять дамп с помощью одного из двух лучших дамперов: Proc Dump или Lord PE Deluxe. Процесс проходит успешно, и образовавшийся файл как бы даже запускается, но… оказывается не вполне работоспособен: исчез заголовок окна и все текстовые сообщения в диалогах! Если мы не сумели сдампить Блокнот, то с настоящими защитами нам и вовсе не справиться. Давай попробуем разобраться почему! Расследование показывает, что исчезнувшие текстовые строки хранятся в секции ресурсов и поэтому обрабатываются функцией LoadString. Загружаем оригинальный notepad.exe в IDA Pro и находим цикл, считывающий строки посредством функции LoadStringW (суффикс 'W' означает, что мы имеем дело с уникодовыми строками). |