Указатель
Данный документ призван сделать курс Рикардо мощным справочным пособием как для начинающего, так и для тех, кто уже владеет искусством крэкинга. Для облегчения поиска я постарался сделать его как можно более подробным, а также присоединил материал, опубликованный в списке конкурсов CracksLatinoS и относящийся к некоторым темам курса. Я посчитал его важным, несмотря на то, что он не входит в состав туториалов Рикардо. См., например:
[Лазурно-синим выделена ссылка на статью.] Желтым выделена ссылка на комментарий, находящийся в этом же документе. Я оформил дополнительные материалы в виде комментариев, чтобы не присоединять файлы.
Части главного окна OllyDbg
Остальные окна OllyDbg
Установка OllyDbg в качестве JIT (Just-In-Time Debugger)
Подключение плагинов в OllyDbg
Горячие клавиши
Системы счисления
**ASCII-символы
Что такое стек (куча)?
Что такое регистры и для чего они нужны?
Как изменять значения регистров?
Что такое флаги?**
Ассемблерные инструкции
Математические инструкции
Логические инструкции
Инструкции сравнения и условных переходов
Инструкции переходов
Инструкции ассемблера:
Инструкции циклов *
Строковые (цепочечные) инструкции
Способы адресации
* В этой главе рассматривается функционирование циклов.
Базовые понятия
Как узнать список API-функций, использующихся в программе? (Search for -> Name (label) in current module (Ctrl+N))**
Как используются API-функции?
Брейкпоинты
Брейкпоинты
Как пользоваться сообщениями Windows’а?
Поиск серийных номеров
Решение крэкми, упомянутого в предыдущей главе
Другой крэкми с hardcoded-серийником
Решение крэкми, упомянутого в предыдущей главе (Splish)
Поиск серийника в упакованном крэкми (Sambo)
Крякмисы с переменным серийным номером
Решение крэкми, упомянутого в предыдущей главе (Mexcrk1)
Игра Canasta v5.0 (В данной программе кнопка OK для ввода серийника изначально неактивна.)
Использование сообщений Windows’а для поиска серийника (WM_KEYUP)
Обнаружение отладчика
Обнаружение OllyDbg по названию процесса
Использование API-функции GetProcAddress
Другие антиотладочные приемы
Антиотладка
Плагин HideOD
Завершение изучения методов антиотладки
API-функция OutputDebugString
Решение крэкми, упомянутого в предыдущей главе (antisocial)
Обработка исключений
Разновидности исключений
Как изменить настройки доступа секций в Olly?
Что происходит, когда генерируется исключение?
Что такое SEH?
Как устанавливается обработчик исключений?**
Версия Olly "Parcheado 5" (пропатченный Olly для поиска OEP’ов)
Взлом приложений, написанных на Visual Basic’е (VB)
Значение составляющих имени API-функции VB
Примеры API-функций
Как устроен екзешник, скомпилированный VB’ком?
На войне как на войне
P-Code (псевдокод)
Завершение изучения программ на P-Code
Вводные сведения о распаковке
Классический способ распаковки
Методы нахождения OEP
Что такое IAT?
Использование LordPE снятия дампа
Что такое IT?
Как система наполняет IAT?
Распаковка вручную UPXа и восстановление IATа
Распаковка ASPack 2.12
Распаковка Crunch 5.0.0 (Bit-Arts)
Распаковка tElock 0.98b1**
Способы восстановления переадресовочных элементов IATа
Распаковка Yoda’s Protector 1.3 (Yoda’s Crypter)
Распаковка PELock 1.06.d (1-я часть)
Собственное логирование исключений
Начало темы об украденных байтах
Украденный код
Баг обработки исключений в OllyDbg
Плагин OllyScript 0.92
Скрипт сокрытия HBP для PELock, tElock и пр.
Распаковка PELock 1.06.d (2-я часть)
Разновидности антидампа
Распаковка ACProtect 1.09g.f со всеми опциями защиты (1-я часть)
Распаковка ACProtect 1.09g.f со всеми опциями защиты (2-я часть)
Распаковка ReCrypt 0.80. (Этот крэкми в Olly не запускается, поэтому Рикардо показал методы, обычно помогающие добиваться запуска в отладчике.)
Другой метод распаковки с использованием утилит Estricnina и Pokemon AntiAttach. (Дополнение, написанное Arapumk’ом о другом способе атаки этого упаковщика. Показан альтернативный метод, к которому мы не привыкли.)
Программа с собственной защитой Patrick.exe (1-я часть)
Программа с собственной защитой Patrick.exe (2-я часть)
Метод логировки API-функций, используемых программой
Распаковка PeSpin 1.3.04.f (1-я часть)
Распаковка PeSpin 1.3.04.f (2-я часть)
Распаковка ReCrypt 0.80
Распаковка ASProtect 2.3.04.26.a (2-я часть)
Распаковка TPPpack (альтернативный вариант) *
* Рикардо сначала приводит объяснение по туториалу Ulaterck’а, затем (о восстановлении IAT) — по туториалу Marciano (конкурс 97, уровень 4).
Распаковка ExeCryptor 2.2.50.a с максимальным сжатием ресурсов/кодов/данных, без защиты (1-я часть)
Распаковка ExeCryptor 2.2.50.a с максимальным сжатием ресурсов/кодов/данных, без защиты (2-я часть)
Распаковка ExeCryptor 2.2.50.b
Распаковка ExeCryptor 2.2.50.c/d/e/f/g
Продолжаем ломать ExeCryptor
Сноска 1
Меня спросили, как сделать вставку, если секция, которую нужно создать, уже занята. Так было и на моем компьютере: начало секции антидампа оказалось 150000, где система создает кучу со значениями, необходимыми для работы программы. Если произвести только стирание и копирование, антидамп выполняться не будет:
Здесь стирается секция 150000, а затем копируется секция дампа. Кроме того, следует позаботиться о значениях кучи, которые нужны программе для ее нормальной работы. После запуска и остановки в Entry Point дампа они уже там, то есть нужно сделать так, чтобы после копирования всей секции они были там без каких-либо изменений, и тогда программа будет выполняться. Думаю, что нет необходимости писать об этом отдельный туториал, следует лишь добавить API функцию перед стиранием секции, а затем производить размещение и копирование, не стирая при этом данные кучи, используемые системой, которые были при запуске экзешника и заполнении секции. [Мне мысль автора не совсем ясна, поэтому перевод этого абзаца может оказаться неточным. Замечания по переводу можно направить мне в мой блог bpmx.livejournal.com — комментарии открыты для всех.]
Рикардо Нарваха
Сноска 2
Ralba —Error 45, а от второго волосы дыбом встают. Такое впечатление, что процессор вот-вот из материнки выскочит, хе-хе. И это не считая того, что я не могу запустить данную версию ASProtect’а из Проводника простым двойным кликом! Так происходит только со мной или есть и другие? Я уж и копировал в различные места на жестком диске, чтобы изменить путь, но всё без толку…
Рикардо Нарваха Этот упаковщик весьма чувствителен из-за RDTSC. Если он не запускается вне отладчика, то в Olly будет работать еще меньше.
OtupAtpaxa Этот упаковщик — однозначно гадина в высшей степени, хотя, согласно Рикардо, это наименее защищенная версия. У меня на него почти весь вечер уходит — проще будет написать скрипт, чем заставить его дойти до OEP! Из 20-ти попыток дойти до OEP удается 1, и ничего с этим не поделаешь. Он просто перемалывает меня в своих жерновах! Кроме того, данный анпэкми, как верно заметил Ralba, не только не работает в Olly, но и не запускается двойным кликом в Windows’е. Я крайне разочарован. Надеюсь, кто-нибудь поможет с ним разобраться :-)
Рикардо Нарваха Если анпэкми не запускается вне отладчика, нужно скопировать его в другую папку, и там должен заработать. Пробовал новую версию Olly Advanced с включенным драйвером Anti-RDTSC fakerdtsc (метод 1)? Однажды я никак не мог запустить программу; перезагрузил, и проблема исчезла.
DAMIAN Otup, это потому что ты не пробовал приаттачиться. <…> Скрипт работает с OEP, я его еще не смотрел. dapaf
OtupAtpaxa Привет, Рикардо! Изменять папки я попробовал, однако результат всегда эвристический: 2 раза программа запускается, а 8 раз — нет… Большое спасибо за файлы, отправленные тобой этим вечером, но я их еще не смотрел. Надеюсь, завтрашний день будет более удачным.
dapaf, твоя идея, конечно, хороша, но у меня приаттачиться не получается… Полагаю, что если есть возможность присоединиться к запущенному (и остановленному) процессу, то можно будет дойти до какого-нибудь вызова антидампа. Это, конечно, лучше, чем ничего.
Рикардо Нарваха Я бы сказал, что проблема скорее в процедуре антидампа, которая переписывает API-функцию из DLL’ки в созданную упаковщиком область памяти и модифицирует уже выполненный CALL, чтобы он указывал на эту область и чтобы после его выполнения было сложно идентифицировать API-функцию, поскольку он больше на нее не указывает. По-моему, трудность заключается именно в этом.
Ralba Простите, маэстро, но что такое RDTSC?
Рикардо Нарваха Инструкция RDTSC позволяет определять число циклов, прошедших с момента включения компьютера и может использоваться подобно GetTickCount для определения промежутка времени между двумя вызовами команды, что и применено в исследуемом ASProtect’е, но не два, а несколько раз. Эта команда осложняет процесс взлома и перехват API-функций, поскольку во время ручной трассировки каждый раз при проходе через RDTSC происходит приостановка выполнения, а это влияет на результат и далее начинаются проблемы. В те времена, когда еще не было драйверов Anti-RDTSC, приходилось останавливаться на командах RDTSC (с помощью пошаговой трассировки, либо ища во всём коде инструкции RDTSC и устанавливая на каждую BP, либо запуская условную трассировку Trace into с остановками на RDTSC), а затем после выполнения инструкции изменять значения регистров EAX и EDX, обнуляя или сокращая период времени между двумя вызовами. Теперь же появились специальные драйверы, входящие в состав Olly Advanced под названием Anti13 RDTSC (fakerdtsc) — они изменяют в нулевом кольце свойства инструкции, чтобы блокировать ее работу в третьем. Данные драйверы изменяют один флаг, и это дает нам возможность работать с программой в Ring3. Таким образом, если в OllyDbg не задействовать драйвер Olly Advanced fakerdtsc, программа выполняться не будет. Могу предположить, что иногда она будет отказываться работать, если время вычислено очень точно. Так бывает, когда программисты предпринимают отчаянные антиотладочные меры.
OtupAtpaxa Привет, Рикардо! Действительно, с последней версией Olly Advanced программа работает немного лучше. Архив fakerdtsc.rar теперь уже не столь актуален, так как он содержит файл fakerdtsc.sys, создаваемый во время работы Olly. Напоследок, перед тем как поднять белый флаг, я хотел бы узнать: может ли скрипт выяснить, какая инструкция является анти-дампом, поскольку на моем компьютере это иногда 015E0000, а иногда — 015C0000… А также — может ли он изменить инструкции, производящие копирование API-функций. Я нашел место, где используется имя API-функции, но оно изменяется при каждом выполнении… Спасибо.
Сноска 3
Рикардо Нарваха Я добавил несколько файлов, которые можно скачать по прежней ссылке — это конфигурация Olly Advanced, необходимая для сокрытия отладки, поскольку заставить программу выполняться в Olly довольно трудно, а в туториале об этом сказано было недостаточно. Поэтому я перебрал комбинации настроек плагина и в конце концов заставил анпэкми работать. Я использовал Hide Debugger 1.24 [ссылка] со всеми установленными галками и Olly Advanced [ссылка], настроенный как показано на скриншотах [ссылка]. Если у вас и теперь программа не работает, то вам придется найти свою собственную конфигурацию плагина таким же образом, как это сделал я — просто удаляя и устанавливая галки, хе-хе.
[Перевод оглавления с испанского: Рома Стремилов, 01.2010, 05.2010]
Last updated