Оглавление Введение 1
ЧАСТЬ I. ОБЗОР ХАКЕРСКИХ ПРОГРАММ 3
Глава 1. Инструментарий хакера 5
Отладчики 5
Дизассемблеры 10
Декомпиляторы 12
Шестнадцатеричные редакторы 13
Распаковщики 16
Дамперы 16
Редакторы ресурсов 17
Шпионы 18
Мониторы 19
Модификаторы 21
Копировщики защищенных дисков 21
Глава 2. Эмулирующие отладчики и эмуляторы 22
Вводная информация об эмуляторах 22
Исторический обзор 22
Области применения эмуляторов 24
Аппаратная виртуализация 29
Обзор популярных эмуляторов 30
DOSBox 30
Bochs и QEMU 31
VMware 33
Microsoft Virtual PC 35
Xen 37
Ближайшие конкуренты 38
Выбор подходящего эмулятора 39
Защищенность 39
Расширяемость 39
Доступность исходных текстов 39
Качество эмуляции 40
Встроенный отладчик 40
Сводная таблица характеристик эмуляторов 41
Глава 3. Хакерский инструментарий для UNIX и Linux 42
Отладчики 42
Дизассемблеры 46
Шпионы 47
Шестнадцатеричные редакторы 48
Дамперы 49
Скрытый потенциал ручных сборок 49
Философская подготовка 53
Пошаговая инструкция 53
Приступаем к сборке 56
Инсталляция 62
Заключение 62
Глава 4. Ассемблеры 63
Философия ассемблера 63
Объяснение ассемблера на примерах C 65
Ассемблерные вставки как тестовый стенд 66
Необходимый инструментарий 67
Сравнение ассемблерных трансляторов 67
Основополагающие критерии 68
MASM 71
TASM 73
FASM 73
NASM 75
YASM 76
Программирование на ассемблере для UNIX и Linux 77
Заключение 82
Ссылки на упомянутые продукты 83
ЧАСТЬ II. БАЗОВЫЕ ТЕХНИКИ ХАКЕРСТВА 85
Глава 5. Введение в защитные механизмы 87
Классификация защит по роду секретного ключа 89
Надежность защиты 91
Недостатки готовых "коробочных" решений 92
Распространенные ошибки реализации защитных механизмов 93
Защита от несанкционированного копирования и распространения серийных номеров 93
Защита испытательным сроком и ее слабые места 94
Реконструкция алгоритма 98
Общие рекомендации 101
Защита от модификации на диске и в памяти 102
Противодействие дизассемблеру 102
Антиотладочные приемы 103
Антимониторы 103
Противодействие дамперам 103
Мелкие промахи, ведущие к серьезным последствиям 104
Глава 6. Разминка 107
Создаем защиту и пытаемся ее взломать 107
Знакомство с дизассемблером 109
Пакетные дизассемблеры и интерактивные дизассемблеры 110
Использование пакетных дизассемблеров 111
От EXE до CRK 113
Практический пример взлома 125
Подавление NAG-screen 126
Принудительная регистрация 129
Чистый взлом или укрощение окна About 132
Заключение 135
Глава 7. Знакомство с отладкой 136
Введение в отладку 137
Дизассемблер и отладчик в одной упряжке 137
Точки останова на функции API 139
Точки останова на сообщения 141
Точки останова на данные 142
Раскрутка стека 143
Отладка DLL 145
Заключение 146
Глава 8. Особенности отладки в UNIX и Linux 147
Ptrace — фундамент для GDB 149
Библиотека Ptrace и ее команды 150
Поддержка многопоточности в GDB 151
Краткое руководство по GDB 152
Трассировка системных вызовов 156
Отладка двоичных файлов в GDB 157
Подготовка к отладке 157
Приступаем к трассировке 162
Погружение в технику и философию GDB 164
Заключение 173
Глава 9. Особенности термоядерной отладки с Linice 174
Системные требования 175
Компиляция и конфигурирование Linice 176
Загрузка системы и запуск отладчика 177
Основы работы с Linice 180
Заключение 184
Глава 10. Расширенное обсуждение вопросов отладки 185
Использование SoftICE в качестве логгера 185
Легкая разминка 186
Более сложные фильтры 189
Анимированная трассировка в SoftICE 192
Отладчик WinDbg как API- и RPC-шпион 193
Первое знакомство с WinDbg 194
Техника API-шпионажа 197
Техника RPC-шпионажа 203
Хакерские трюки с произвольными точками останова 204
Секреты пошаговой трассировки 204
Взлом через покрытие 213
Руководящая идея 213
Выбор инструментария 213
Алгоритмы определения покрытия 215
Выбор подхода 216
Пример взлома 218
Заключение 222
ЧАСТЬ III. ИДЕНТИФИКАЦИЯ КЛЮЧЕВЫХ СТРУКТУР ЯЗЫКОВ ВЫСОКОГО УРОВНЯ 223
Глава 11. Идентификация функций 225
Методы распознавания функций 225
Перекрестные ссылки 226
Автоматическая идентификация функций посредством IDA Pro 231
Пролог 232
Эпилог 232
"Голые" (naked) функции 234
Идентификация встраиваемых (inline) функций 234
Модели памяти и 16-разрядные компиляторы 237
Глава 12. Идентификация стартовых функций 238
Идентификация функции WinMain 238
Идентификация функции DllMain 239
Идентификация функции main консольных Windows-приложений 240
Глава 13. Идентификация виртуальных функций 242
Идентификация чистой виртуальной функции 247
Совместное использование виртуальной таблицы несколькими экземплярами объекта 249
Копии виртуальных таблиц 251
Связный список 251
Вызов через шлюз 252
Сложный пример, когда невиртуальные функции попадают в виртуальные таблицы 252
Cтатическое связывание 257
Идентификация производных функций 261
Идентификация виртуальных таблиц 263
Глава 14. Идентификация конструктора и деструктора 266
Объекты в автоматической памяти — ситуация, когда конструктор/деструктор идентифицировать невозможно 270
Идентификация конструктора/деструктора в глобальных объектах 271
Виртуальный деструктор 273
Виртуальный конструктор 273
Конструктор раз, конструктор два… 274
Пустой конструктор 274
Глава 15. Идентификация объектов, структур и массивов 275
Идентификация структур 275
Идентификация объектов 282
Объекты и экземпляры 286
Мой адрес — не дом и не улица 286
Глава 16. Идентификация this 288
Глава 17. Идентификация new и delete 289
Идентификация new 289
Идентификация delete 291
Подходы к реализации кучи 291
Глава 18. Идентификация библиотечных функций 292
Глава 19. Идентификация аргументов функций 297
Соглашения о передаче параметров 297
Цели и задачи 298
Определение количества и типа передачи аргументов 299
Адресация аргументов в стеке 304
Стандартное соглашение — stdcall 308
Соглашение cdecl 310
Соглашение Pascal 312
Соглашения о быстрых вызовах — fastcall 323
Соглашения о вызовах thiscall и соглашения о вызове по умолчанию 352
Аргументы по умолчанию 354
Техника исследования механизма передачи аргументов неизвестным компилятором 355
Глава 20. Идентификация значения, возвращаемого функцией 356
Возврат значения оператором return 357
Возврат вещественных значений 371
Возвращение значений встроенными ассемблерными функциями 375
Возврат значений через аргументы, переданные по ссылке 377
Возврат значений через динамическую память (кучу) 383
Возврат значений через глобальные переменные 386
Возврат значений через флаги процессора 391
Глава 21. Идентификация локальных стековых переменных 393
Адресация локальных переменных 394
Детали технической реализации 395
Идентификация механизма выделения памяти 395
Инициализация локальных переменных 396
Размещение массивов и структур 396
Выравнивание в стеке 397
Как IDA Pro идентифицирует локальные переменные 397
Исключение указателя на фрейм 404
Глава 22. Идентификация регистровых и временных переменных 408
Регистровые переменные 409
Временные переменные 413
Создание временных переменных при пересылках данных и вычислении выражений 414
Создание временных переменных для сохранения значения, возращенного функцией, и результатов вычисления выражений 416
Область видимости временных переменных 417
Глава 23. Идентификация глобальных переменных 418
Техника восстановления перекрестных ссылок 418
Отслеживание обращений к глобальным переменным контекстным поиском их смещения в сегменте кода [данных] 418
Отличия констант от указателей 419
Косвенная адресация глобальных переменных 420
Статические переменные 423
Глава 24. Идентификация констант и смещений 424
Определение типа непосредственного операнда 426
Сложные случаи адресации или математические операции с указателями 429
Порядок индексов и указателей 433
Использование LEA для сложения констант 433
"Визуальная" идентификация констант и указателей 434
Глава 25. Идентификация литералов и строк 435
Типы строк 437
C-строки 437
DOS-строки 438
Pascal-строки 438
Комбинированные типы 439
Определение типа строк 439
Turbo-инициализация строковых переменных 445
Глава 26. Идентификация конструкций IF — THEN — ELSE 449
Типы условий 451
Наглядное представление сложных условий в виде дерева 453
Исследование конкретных реализаций 456
Сравнение целочисленных значений 456
Сравнение вещественных чисел 457
Условные команды булевой установки 460
Прочие условные команды 461
Булевские сравнения 462
Идентификация условного оператора "(условие)?do_it:continue" 462
Особенности команд условного перехода в 16-разрядном режиме 466
Практические примеры 468
Оптимизация ветвлений 478
Глава 27. Идентификация конструкций SWITCH — CASE — BREAK 482
Идентификация операторов множественного выбора 482
Отличия switch от оператора case языка Pascal 490
Обрезка (балансировка) длинных деревьев 492
Сложные случаи балансировки или оптимизирующая балансировка 495
Ветвления в case-обработчиках 495
Глава 28. Идентификация циклов 496
Циклы с предусловием 497
Циклы с постусловием 497
Циклы со счетчиком 498
Циклы с условием в середине 500
Циклы с множественными условиями выхода 500
Циклы с несколькими счетчиками 501
Идентификация continue 501
Сложные условия 502
Вложенные циклы 502
Дизассемблерные листинги примеров 503
Глава 29. Идентификация математических операторов 527
Идентификация оператора + 527
Идентификация оператора – 530
Идентификация оператора / 532
Идентификация оператора % 536
Идентификация оператора * 538
Комплексные операторы 543
ЧАСТЬ IV. ПРОДВИНУТЫЕ МЕТОДЫ ДИЗАССЕМБЛИРОВАНИЯ 545
Глава 30. Дизассемблирование 32-разрядных PE-файлов 547
Особенности структуры PE-файлов в конкретных реализациях 547
Общие концепции и требования, предъявляемые к PE-файлам 548
Структура PE-файла 549
Техника внедрения и удаления кода из PE-файлов 552
Понятие X-кода и другие условные обозначения 552
Цели и задачи X-кода 553
Требования, предъявляемые к X-коду 555
Внедрение X-кода 555
Предотвращение повторного внедрения 556
Классификация механизмов внедрения 557
Категория A: внедрение в свободное пространство файла 558
Категория A: внедрение путем сжатия части файла 570
Категория A: создание нового NTFS-потока внутри файла 571
Категория B: раздвижка заголовка 573
Категория B: сброс части секции в оверлей 575
Категория B: создание собственного оверлея 578
Категория C: расширение последней секции файла 578
Категория C: создание собственной секции 581
Категория C: расширение серединных секций файла 582
Категория Z: внедрение через автозагружаемые dll 584
Глава 31. Дизассемблирование ELF-файлов под Linux и BSD 585
Необходимый инструментарий 585
Структура ELF-файлов 587
Внедрение чужеродного кода в ELF-файл 590
Заражение посредством поглощения файла 590
Заражение посредством расширения последней секции файла 592
Сжатие части оригинального файла 595
Заражение посредством расширения кодовой секции файла 600
Сдвиг кодовой секции вниз 603
Создание собственной секции 604
Внедрение между файлом и заголовком 605
Практический пример внедрения чужеродного кода в ELF-файл 606
Особенности дизассемблирования под Linux на примере tiny-crackme 612
Исследование головоломки tiny-crackme 613
Заключение 624
Глава 32. Архитектура x86-64 под скальпелем ассемблерщика 625
Введение 625
Необходимый инструментарий 626
Обзор архитектуры x86-64 629
Переход в 64-разрядный режим 631
Программа "Hello, world" для x86-64 633
Глава 33. Исследования ядра Linux 639
Вне ядра 639
Штурм ядра 640
Внутри ядра 642
Где гнездятся ошибки 646
Секреты кернел-хакинга 647
Меняем логотип Linux 647
Глава 34. Современные методы патчинга 652
Секреты онлайнового патчинга 652
Простейший on-line patcher 653
Гонки на опережение 655
Перехват API-функций как сигнальная система 656
Аппаратные точки останова 658
Малоизвестные способы взлома клиентских программ 660
Обзор способов взлома 660
Модификация без изменения байт 661
Хак ядра Windows NT/2000/XP 669
Структура ядра 669
Типы ядер 670
Методы модификации ядра 673
Модификация загрузочного логотипа 680
Есть ли жизнь после BSOD? 682
Преодоление BSOD с помощью SoftICE 683
Автоматическое восстановление 687
Насколько безопасна утилита Anti-BSOD? 691
Заключение 691
Глава 35. Дизассемблирование файлов других форматов 692
Дизассемблирование файлов PDF 692
Что Adobe Acrobat обещает нонконформистам 693
Модификация Adobe Acrobat 697
Взлом с помощью PrintScreen 697
Становитесь полиглотами 697
Структура файла PDF 698
Генерация ключа шифрования 702
Атака на U-пароль 704
Практический взлом паролей PDF 705
Интересные ресурсы 708
ЧАСТЬ V. ПРАКТИЧЕСКОЕ КОДОКОПАТЕЛЬСТВО 709
Глава 36. Антиотладочные приемы и игра в прятки под Windows и Linux 711
Старые антиотладочные приемы под Windows на новый лад 712
Самотрассирующаяся программа 713
Антиотладочные примеры, основанные на доступе к физической памяти 718
Как работает Win2K/XP SDT Restore 722
Stealth-технологии в мире Windows 722
Синяя пилюля и красная пилюля — Windows вязнет в Матрице 723
Синяя пилюля 723
Красная пилюля 728
Stealth-технологии в мире Linux 730
Модуль раз, модуль два 731
Исключение процесса из списка задач 734
Перехват системных вызовов 737
Перехват запросов к файловой системе 739
Когда модули недоступны 740
Прочие методы борьбы 742
Интересные ссылки по теме стелсирования 743
Захватываем ring 0 в Linux 743
Честные способы взлома 744
Дырка в голубом зубе или Linux Kernel Bluetooth Local Root Exploit 744
Эльфы падают в дамп 745
Проблемы многопоточности 746
Получаем root на многопроцессорных машинах 747
Глава 37. Переполнение буфера в системах с неисполняемым стеком 750
Конфигурирование DEP 753
Проблемы совместимости 755
Атака на DEP 756
В лагере UNIX 761
BufferShield или PaX на Windows 763
Интересные ресурсы 764
Глава 38. Борьба с паковщиками 765
Предварительный анализ 765
Распаковка и ее альтернативы 768
Алгоритм распаковки 768
В поисках OEP 769
Дамп живой программы 769
Поиск стартового кода по сигнатурам в памяти 771
Пара популярных, но неудачных способов: GetModuleHandleA и gs:0 772
Побочные эффекты упаковщиков или почему не работает VirtualProtect 776
Универсальный метод поиска OEP, основанный на балансе стека 779
Техника снятия дампа с защищенных приложений 784
Простые случаи снятия дампа 785
В поисках самого себя 789
Дамп извне 790
Механизмы динамической расшифровки 791
Дамп изнутри 792
Грязные трюки 794
Полезные ссылки 796
Упаковщики исполняемых файлов в LINUX/BSD и борьба с ними 796
Упаковщики и производительность 797
ELF-Crypt 798
UPX 805
Burneye 807
Shiva 809
Сравнение упаковщиков 811
Глава 39. Обфускация и ее преодоление 813
Как работает обфускатор 814
Как это ломается 819
Распутывание кода 820
Черный ящик 822
Застенки виртуальной машины 824
Будущее обфускации 824
Глава 40. Обнаружение, отладка и дизассемблирование зловредных программ 826
Время тоже оставляет отпечатки 826
Дерево процессов 828
Допрос потоков 830
Восстановление SST 836
Аудит и дизассемблирование эксплоитов 840
Как препарируют эксплоиты 841
Анализ эксплоита на практическом примере 842
Как запустить shell-код под отладчиком 854
Заключение 854
Интересные ссылки 855
Глава 41. Атака на эмуляторы 856
Атака через виртуальную сеть 857
Атака через folder.htt 858
Атака через backdoor-интерфейс 859
Новейшие эксплоиты для виртуальных машин 862
VMware: удаленное исполнение произвольного кода I 862
VMware: удаленное исполнение произвольного кода II 864
VMware: перезапись произвольного файла 865
Подрыв виртуальных машин изнутри 865
Описание компакт-диска 873
Предметный указатель 875
IV Оглавление V Оглавление