Указатель

Данный документ призван сделать курс Рикардо мощным справочным пособием как для начинающего, так и для тех, кто уже владеет искусством крэкинга. Для облегчения поиска я постарался сделать его как можно более подробным, а также присоединил материал, опубликованный в списке конкурсов CracksLatinoS и относящийся к некоторым темам курса. Я посчитал его важным, несмотря на то, что он не входит в состав туториалов Рикардо. См., например:

Глава 44 Распаковка ACProtect 1.09g.f со всеми функциями защиты (3-я часть) Восстановление украденных байтов и OEP Борьба с антидампом Как сделать вставку, если секция, которую нужно создать, занята (дополнение к главе 44) Сноска 1

[Лазурно-синим выделена ссылка на статью.] Желтым выделена ссылка на комментарий, находящийся в этом же документе. Я оформил дополнительные материалы в виде комментариев, чтобы не присоединять файлы.

  1. Глава 1

    • Части главного окна OllyDbg

    • Дизассемблер (листинг)

    • Область регистров

    • Дамп

    • Стек

    • Остальные окна OllyDbg

    • Окно Log

    • Окно Executables

    • Окно Memory

    • Окно Threads

    • Окно Windows

    • Окно Handles

    • Окно CPU

    • Окно Patches

    • Окно Call Stack

    • Окно BreakPoints

    • Окно References

    • Окно Run Trace

    • Установка OllyDbg в качестве JIT (Just-In-Time Debugger)

    • Подключение плагинов в OllyDbg

    • Горячие клавиши

    • F2

    • F7

    • F8

    • F9

    • F12

  2. Глава 2

    • Системы счисления

    • Двоичная

    • Десятичная

    • Шестнадцатеричная

    • Положительные и отрицательные числа в шестнадцатеричной системе счисления

    • **ASCII-символы

    • Что такое стек (куча)?

  3. Глава 3

    • Что такое регистры и для чего они нужны?

    • Дробление регистров (EAX → АХ | AL)**

    • Как изменять значения регистров?

    • Что такое флаги?**

    • Флаг O (Overflow, переполнение)

    • Флаг A (Auxiliar, дополнительный флаг переноса)

    • Флаг P (Parity, четность)

    • Флаг Z (Zero, нуль)

    • Флаг S (Sign, знак)

    • Флаг C (Carry, перенос)

    • Флаги T, D и I

  4. Глава 4

    • Ассемблерные инструкции

    • NOP

    • PUSH

    • POP

    • PUSHAD

    • POPAD

    • PUSHA

    • POPA

    • MOV

    • MOVSX

    • MOVZX

    • LEA

    • XCHG

  5. Глава 5

    • Математические инструкции

    • INC

    • DEC

    • ADD

    • ADC

    • SUB

    • SBB

    • MUL

    • IMUL

    • DIV

    • XADD

    • NEG

    • Логические инструкции

    • AND

    • OR

    • XOR

    • NOT

  6. Глава 6

    • Инструкции сравнения и условных переходов

    • CMP

    • TEST

    • Инструкции переходов

    • JMP

    • JE ИЛИ JZ

    • JNE ИЛИ JNZ

    • JS

    • JNS

    • JP ИЛИ JPE

    • JNP ИЛИ JNPE

    • JO

    • JNO

    • JB

    • JNB

    • JBE

    • JNBE

    • JL

    • JA JG JAE JGE

  7. Глава 7

    • Инструкции ассемблера:

    • CALL

    • RET

  8. Глава 8

    • Инструкции циклов *

    • LOOP

    • LOOPZ LOOPE

    • LOOPNZ LOOPNE

    • Строковые (цепочечные) инструкции

    • MOVS

    • REP

    • REPE REPZ

    • LODS

    • STOS

    • CMPS

    • Способы адресации

    • Прямая адресация

    • Косвенная адресация

    • * В этой главе рассматривается функционирование циклов.

  9. Глава 9

    • Базовые понятия

    • Entry Point (точка входа)

    • DLL (динамическая библиотека)

    • API-функция

    • Как узнать список API-функций, использующихся в программе? (Search for -> Name (label) in current module (Ctrl+N))**

    • Как используются API-функции?

  10. Глава 10

    • Брейкпоинты

    • Обычные брейкпоинты (BP, BPX)

    • Брейкпоинты на доступ к памяти (BPM, Memory Breakpoint)

  11. Глава 11

    • Брейкпоинты

    • Аппаратные брейкпоинты (HBP)

    • Условные брейкпоинты (Conditional Breakpoint)

    • Условные брейкпоинты с логированием (Conditional Log Breakpoint)

  12. Глава 12

    • Как пользоваться сообщениями Windows’а?

    • Брейкпоинты на сообщениях (BMSG)

  13. Глава 13

    • Поиск серийных номеров

    • Жестко заданные (hardcoded) серийные номера

    • API-функция GetDlgItemTextA

  14. Глава 14

    • Решение крэкми, упомянутого в предыдущей главе

    • API-функция lstrcmpA

    • API-функция GetWindowTextA

    • Другой крэкми с hardcoded-серийником

    • API-функция memset

    • API-функция lstrlen

  15. Глава 15

    • Решение крэкми, упомянутого в предыдущей главе (Splish)

    • Поиск серийника в упакованном крэкми (Sambo)

    • Использование сообщений Windows’а

  16. Глава 16

    • Крякмисы с переменным серийным номером

    • Крэкми CrueHead’а

    • Крэкми Splish, 2-я часть с вводом имени пользователя (name/serial)

    • Инструкция CDQ

    • Инструкция IDIV ESI

  17. Глава 17

    • Решение крэкми, упомянутого в предыдущей главе (Mexcrk1)

    • Игра Canasta v5.0 (В данной программе кнопка OK для ввода серийника изначально неактивна.)

  18. Глава 18

    • Использование сообщений Windows’а для поиска серийника (WM_KEYUP)

    • Крэкми Stzwei’я (crackme_4stz)

  19. Глава 19

    • Обнаружение отладчика

    • API-функция IsDebuggerPresent

    • Патч крэкми против обнаружения

    • Расположение соответствующего байта

    • Изменение флага во избежание обнаружения

    • Сокрытие отладчика с помощью плагина (Hide Debugger 1.23f)

  20. Глава 20

    • Обнаружение OllyDbg по названию процесса

    • API-функция OpenProcess

    • API-функция EnumProcessModules

    • API-функция GetModuleBaseName

    • Использование API-функции GetProcAddress

  21. Глава 21

    • Другие антиотладочные приемы

    • API-функция CreateToolhelp32Snapshot

    • API-функция Process32First

    • API-функция Process32Next

    • API-функция TerminateProcess

    • API-функция FindWindow

    • API-функция EnumWindows

  22. Глава 22

    • Антиотладка

    • Исключения, не обрабатываемые в OllyDbg (Unhandled * Exceptions)

    • API-функция SetUnhandledExceptionFilter

    • API-функция ZwQueryInformationProcess

    • API-функция UnhandledExceptionFilter

    • Плагин HideOD

  23. Глава 23

    • Завершение изучения методов антиотладки

    • Расположение байтов:

    • NTGloblalFlag

    • ProcessHeap

    • API-функция OutputDebugString

  24. Глава 24

    • Решение крэкми, упомянутого в предыдущей главе (antisocial)

    • С плагинами и без плагинов

  25. Глава 25

    • Обработка исключений

    • Понятие исключения

    • Разновидности исключений

    • Нет доступа к памяти

    • Деление на ноль

    • Неверная инструкция; попытка запуска привилегированной инструкции

    • Как изменить настройки доступа секций в Olly?

    • Что происходит, когда генерируется исключение?

    • Что такое SEH?

    • Как устанавливается обработчик исключений?**

  26. Глава 26

    • Версия Olly "Parcheado 5" (пропатченный Olly для поиска OEP’ов)

    • Взлом приложений, написанных на Visual Basic’е (VB)

    • Значение составляющих имени API-функции VB

    • Примеры API-функций

    • Конвертация данных

    • Перемещение данных

    • Математические

    • Вспомогательные

    • Сравнения

  27. Глава 27

    • Как устроен екзешник, скомпилированный VB’ком?

    • Метод 4C

  28. Глава 28

    • На войне как на войне

    • Другой способ удаления наг-окон в VB**

    • Вставка кода в DLL’ку VB

  29. Глава 29

    • P-Code (псевдокод)

    • Распознавание, изучение и взлом (API-функция MethCallEngine)

    • Рассмотрение некоторых опкодов

  30. Глава 30

    • Завершение изучения программ на P-Code

    • Еще опкоды

    • Решение крэкми, упомянутого в предыдущей главе

  31. Глава 31

    • Вводные сведения о распаковке

    • Для чего нужна упаковка программ?

    • Что такое загрузчик и как он функционирует? (краткое объяснение)

    • Понятие OEP

    • Схема работы упакованной программы

  32. Глава 32

    • Классический способ распаковки

    • Методы нахождения OEP

    • Просмотр или поиск опкодов в листинге без запуска процедуры распаковки

    • Использование встроенного в Olly поисковика OEP’ов

    • Использование Olly Parcheado 5 (пропатченного Olly для поиска OEP’ов)

    • Метод PUSHAD

    • Для программ, написанных на VB (Native или P-Code)

    • Метод исключений

    • По API-функции, часто используемой распаковщиком

    • Метод первой API-функции, вызываемой программой

  33. Глава 33

    • Что такое IAT?

    • Использование LordPE снятия дампа

    • Что такое IT?

    • Как система наполняет IAT?

  34. Глава 34

    • Распаковка вручную UPXа и восстановление IATа

    • Использование PE Tools для снятия дампа

    • Как восстановить IAT?

  35. Глава 35

    • Распаковка ASPack 2.12

    • Использование OllyDump для получения дампа

    • Использование Import REConstructor’а для восстановления IATа

  36. Глава 36

    • Распаковка Crunch 5.0.0 (Bit-Arts)

    • Распаковка tElock 0.98b1**

    • Переадресовочные элементы IATа

  37. Глава 37

    • Способы восстановления переадресовочных элементов IATа

    • Метод восстановления вручную**

    • Использование функции условного трассирования Olly

    • Использование плагинов Import REConstructor’а

    • Использование трассировщиков, встроенных в Import REConstructor

    • Использование ключевых переходов JMP/CALL

  38. Глава 38

    • Распаковка Yoda’s Protector 1.3 (Yoda’s Crypter)

  39. Глава 39

    • Распаковка PELock 1.06.d (1-я часть)

    • Собственное логирование исключений

    • Начало темы об украденных байтах

    • Как узнать, были ли украдены байты?

    • Возвращение украденных байтов с помощью Binary copy / Binary paste

    • Украденный код

  40. Глава 40

    • Баг обработки исключений в OllyDbg

    • Плагин OllyScript 0.92

    • Скрипт сокрытия HBP для PELock, tElock и пр.

  41. Глава 41

    • Распаковка PELock 1.06.d (2-я часть)

    • Разновидности антидампа

    • Борьба с антидампом, создающим секции во время распаковки

    • Добавление в дамп секции, созданной во время распаковки

    • Ссылка на метод, предложенный marciano

  42. Глава 42

    • Распаковка ACProtect 1.09g.f со всеми опциями защиты (1-я часть)

    • Рассмотрение отладочных регистров в структуре CONTEXT

    • Поиск OEP с помощью скрипта, скрывающего аппаратные брейкпоинты

    • Восстановление украденных байтов

  43. Глава 43

    • Распаковка ACProtect 1.09g.f со всеми опциями защиты (2-я часть)

    • Восстановление IATа с помощью скрипта IAT.txt

  44. Глава 44

    • Распаковка ACProtect 1.09g.f со всеми опциями защиты (3-я часть)

    • Возврат украденных байтов и OEP

    • Борьба с антидампом

    • Как сделать вставку, если секция, которую нужно создать, занята (дополнение к главе 44) Сноска 1

  45. Глава 45

    • Распаковка ReCrypt 0.80. (Этот крэкми в Olly не запускается, поэтому Рикардо показал методы, обычно помогающие добиваться запуска в отладчике.)

    • Другой метод распаковки с использованием утилит Estricnina и Pokemon AntiAttach. (Дополнение, написанное Arapumk’ом о другом способе атаки этого упаковщика. Показан альтернативный метод, к которому мы не привыкли.)

  46. Глава 46

    • Программа с собственной защитой Patrick.exe (1-я часть)

    • Проверка запустившей крэкми программы (API-функция Process32Next)

    • Разрешение конфликта с HideOD

    • Проверка модулей Explorer.exe (API-функция Module32First)

    • Проверка пути до Explorer.exe (API-функция GetWindowsDirectory)

    • Обфускация для сокрытия кода в листинге

    • Получение пути крэкми (API-функция GetModuleFileName)

    • Проверка наличия другого процесса крэкми (API-функция CreateMutex)

    • Создание второго процесса крэкми (API-функция CreateProcess)

    • Разрешение конфликта с HideOD

  47. Глава 47

    • Программа с собственной защитой Patrick.exe (2-я часть)

    • Остальные защиты и способы их обхода

    • Запуск Patrick.exe в Olly без проблем

    • Метод логировки API-функций, используемых программой

  48. Глава 48

    • Распаковка PeSpin 1.3.04.f (1-я часть)

    • Возврат украденных байтов

  49. Глава 49

    • Распаковка PeSpin 1.3.04.f (2-я часть)

    • Восстановление IAT

    • Борьба с антидампом

  50. Глава 50

    • Распаковка ReCrypt 0.80

    • API-функция OutputDebugString

  51. Глава 51

    • Распаковка ASProtect 2.3.04.26.a (1-я часть, системные драйверы SYS)

    • Плагины OllyBone и Weasle

    • Функционирование OllyBone

    • Обсуждение проблемных моментов этой главы: Сноска 2, Сноска 3

  52. Глава 52

    • Распаковка ASProtect 2.3.04.26.a (2-я часть)

    • Ликвидация переадресации с помощью скрипта Hiei

  53. Глава 53

    • Распаковка TPPpack (альтернативный вариант) *

    • Поиск OEP и возврат украденного кода с помощью 1-го скрипта Ulaterck’а

    • Восстановление IAT с помощью 2-го скрипта Ulaterck’а

    • * Рикардо сначала приводит объяснение по туториалу Ulaterck’а, затем (о восстановлении IAT) — по туториалу Marciano (конкурс 97, уровень 4).

  54. Глава 54

    • Распаковка ExeCryptor 2.2.50.a с максимальным сжатием ресурсов/кодов/данных, без защиты (1-я часть)

    • Использование TLS callback (способы поиска с помощью различных утилит)

  55. Глава 55

    • Распаковка ExeCryptor 2.2.50.a с максимальным сжатием ресурсов/кодов/данных, без защиты (2-я часть)

    • Написание скрипта для восстановления IATа

    • Дамп

  56. Глава 56

    • Распаковка ExeCryptor 2.2.50.b

    • Работа с потоками

    • Написание скрипта для восстановления IATа

    • Дамп

  57. Глава 57

    • Распаковка ExeCryptor 2.2.50.c/d/e/f/g

    • Использование нароботок из предыдущих глав об ExeCryptor

    • Распаковка ExeCryptor 2.2.50.c с включенной опцией "Kill Registry/File monitors"

    • Распаковка ExeCryptor 2.2.50.d с включенной опцией "Debug messages"

    • Распаковка ExeCryptor 2.2.50.e с включенной опцией "Active watch"

    • Распаковка ExeCryptor 2.2.50.f с включенной опцией "Patch protection"

    • Распаковка ExeCryptor 2.2.50.g с включенной опцией "Anti-trace"

  58. Глава 58

    • Продолжаем ломать ExeCryptor

Сноска 1

Меня спросили, как сделать вставку, если секция, которую нужно создать, уже занята. Так было и на моем компьютере: начало секции антидампа оказалось 150000, где система создает кучу со значениями, необходимыми для работы программы. Если произвести только стирание и копирование, антидамп выполняться не будет:

0046B017 60 PUSHAD
0046B018 90 NOP
0046B019 68 00400000 PUSH 4000
0046B01E 68 00800200 PUSH 28000
0046B023 68 00001500 PUSH 150000
0046B028 FF15 A4094600 CALL NEAR DWORD PTR DS:[4609A4] ;kernel32.VirtualFree
0046B02E 90 NOP
0046B02F 6A 04 PUSH 4
0046B031 68 00200000 PUSH 2000
0046B036 68 00C00300 PUSH 3C000
0046B03B 68 00001500 PUSH 150000
0046B040 FF15 A8094600 CALL NEAR DWORD PTR DS:[4609A8] ;kernel32.VirtualAlloc
0046B046 90 NOP
0046B047 6A 04 PUSH 4
0046B049 68 00100000 PUSH 1000
0046B04E 68 00C00300 PUSH 3C000
0046B053 68 00001500 PUSH 150000
0046B058 FF15 A8094600 CALL NEAR DWORD PTR DS:[4609A8] ;kernel32.VirtualAlloc
0046B05E 61 POPAD
0046B05F 90 NOP

Здесь стирается секция 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]