Оглавление Введение 1
Для кого эта книга 2
Благодарности 3
Глава 1. Введение в дизассемблирование 5
1.1. Представление информации в памяти компьютера 5
1.1.1. Заглянем в память 5
1.1.2. Системы счисления 7
Десятичная система счисления 7
Двоичная система счисления 8
Шестнадцатеричная система счисления 10
1.1.3. Представление чисел в компьютере 11
Беззнаковые целые числа 11
Числа со знаком 13
Вещественные числа 15
Двоично-десятичные числа 17
1.2. Обзор команд и регистров микропроцессора Intel Pentium 18
1.2.1. Регистры микропроцессора Pentium 18
Регистры общего назначения 18
Регистр флагов 19
Сегментные регистры 20
Управляющие регистры 20
Системные адресные регистры 22
Регистры отладки 22
1.2.2. Основной набор команд 23
1.2.3. Команды математического сопроцессора 38
Функционирование и структура 38
Команды сопроцессора 41
1.2.4. Расширение MMX 48
Архитектура MMX 48
Инструкции MMX 49
Новые инструкции MMX 52
1.3. Особенности программирования в операционной системе Windows 54
1.3.1. Общие положения 54
1.3.2. Консольные приложения 56
1.3.3. Оконные приложения 66
1.3.4. Приложения на основе диалоговых окон 72
1.4. Формат команд микропроцессора Intel 78
1.4.1. Общие соображения 78
1.4.2. Код команды 81
1.4.3. Байт MOD R/M 85
1.4.4. Байт SIB 89
1.4.5. Маленький пример ручного дизассемблирования 91
1.4.6. О некоторых проблемах дизассемблирования 92
1.4.7. О командах арифметического сопроцессора 95
1.5. Описание структуры исполняемого модуля (PE-модуль) 97
1.5.1. Общий подход 97
1.5.2. Заголовок PE 103
1.5.3. Секции 107
1.5.4. Таблица импорта 111
1.5.5. Таблица экспорта 114
1.5.6. Ресурсы 116
Первый уровень 117
Второй уровень 118
Третий уровень 119
Четвертый уровень 119
1.5.7. Об отладочной информации 119
Таблица символов 119
Отладочная информация 120
1.6. Об отладке и дизассемблировании программ, написанных на языке ассемблера 121
1.6.1. Примеры дизассемблирования 121
Пример поиска импортируемой функции 121
Некоторые сложности в распознавании исполняемого кода 125
"Тайные переходы" и тайны переходов 130
Использование отладочной информации 133
1.6.2. О динамическом изменении исполняемого кода 134
Исполнение кода в стеке 134
Используем функцию WriteProcessMemory 140
Используем функцию VirtualProtectEx 143
Глава 2. Инструментарий исследователя машинного кода 147
2.1. Краткий обзор инструментов 147
2.1.1. Дизассемблеры 147
Программа dumpbin.exe 147
Знаменитый дизассемблер IDA Pro 150
Дизассемблер W32Dasm 150
Специализированные дизассемблеры 151
2.1.2. Отладчики 152
Turbo Debugger 152
Debugging Tools for Windows 153
Отладчик OllyDbg 154
Мощный отладчик SoftICE 154
2.1.3. HEX-редакторы 155
WinHex 155
Hacker Viewer 155
Biew.exe 158
2.1.4. Другие утилиты 159
Исследователи ресурсов 159
Мониторы 160
2.2. Дизассемблер и отладчик W32Dasm 161
2.2.1. Начало работы 161
Интерфейс и настройки программы 161
2.2.2. Работа с дизассемблируемым кодом 163
Перемещение по дизассемблированному тексту 163
Отображение данных 164
Вывод импортированных и экспортированных функций 165
Отображение ресурсов 165
Операции с текстом 166
2.2.3. Отладка программ 166
Загрузка программ для отладки 166
Работа с динамическими библиотеками 168
Точки останова 168
Модификация кода, данных и регистров 168
Дополнительные возможности для работы с API 170
Поиск нужного места в программе 170
2.3. Отладчик OllyDbg 171
2.3.1. Начало работы с отладчиком 171
Окна отладчика 171
Отладочное выполнение 173
2.3.2. Точки останова 175
Обычные точки останова 175
Условные точки останова 175
Условные точки останова с записью в журнал 176
Точка останова на сообщения Windows 176
Точка останова на функции импорта 178
Точка останова на область памяти 178
Точка останова в окне Memory 178
Аппаратные точки останова 178
2.3.3. Другие возможности 179
Окно наблюдения 179
Поиск информации 179
Исправление исполняемого модуля 180
2.4. Несколько примеров редактирования исполняемых модулей 180
2.4.1. Пример 1. Удаление нежелательного сообщения 181
Поиск в OllyDbg 181
Поиск в W32Dasm 183
Поиск в IDA Pro 184
2.4.2. Пример 2. Снятие ограничений на использование программы 184
Процедура задержки 186
Снятие ограничения на количество запусков программы 187
2.4.3. Пример 3. Разбираемся с "Evaluation copy" 189
Общие соображения 189
Поиски в отладчике 190
2.4.4. Пример 4. Снятие защиты 191
Стадия 1. Попытка зарегистрироваться 191
Стадия 2. Избавляемся от надоедливого окна 193
Стадия 3. Доводим регистрацию до логического конца 195
Стадия 4. Неожиданная развязка 196
Глава 3. Основные парадигмы анализа исполняемого кода 199
3.1. Идентификация данных 200
3.1.1. Глобальные переменные 201
Влияния оптимизации 201
Указатели на глобальные переменные 205
Глобальные переменные и константы 207
Размер, расположение и тип переменных 209
Сложные типы данных 215
3.1.2. Локальные переменные 229
Переменные, определенные в стеке 229
Временные переменные 236
Регистровые переменные 242
3.2. Идентификация программных структур 244
3.2.1. Процедуры и функции 244
Передача параметров 244
Структуры стека 250
Идентификация процедур и функций (обобщение) 258
Переполнение буфера 265
3.2.2. Условные конструкции и операторы выбора 274
Простые конструкции 275
Вложенные конструкции и логические связки 282
Условные конструкции без переходов 286
Операторы выбора 287
3.2.3. Циклы 290
Простые циклы 291
Об оптимизации циклов 295
Вложенные циклы и циклы со сложными условиями выхода 300
3.2.4. Объекты 304
Идентификация объекта 305
Виртуальные функции 311
Конструктор и деструктор 320
3.2.5. Еще об исследовании исполняемого кода 325
О математических вычислениях 325
Другие конструкции 327
Глава 4. Отладчик SoftICE 335
4.1. Основы работы с SoftICE 336
4.1.1. Запуск и интерфейс 336
Главное окно SoftICE 336
Режимы работы отладчика 339
4.1.2. Загрузчик (Loader) 339
Загрузка исполняемого модуля 339
Параметры загрузки 340
4.1.3. Некоторые приемы работы с SoftICE 342
Начало работы. Процессы 342
Точки останова 343
Поиск процедуры окна 347
Если приложение содержит отладочную информацию 347
4.2. Краткий справочник по SoftICE 348
4.2.1. Горячие клавиши 348
Управление экраном 348
Перемещение внутри главного окна 349
Перемещение содержимого окон 349
Управление командным окном 350
Функциональные клавиши 350
4.2.2. Команды SoftICE 351
Макрокоманды отладчика SoftICE 351
Команды управления окнами SoftICE 353
Получение и изменения информации в окнах 355
Команды управления точками останова 359
Команды трассировки 363
Основные информационные команды 364
Другие команды 369
Операторы 370
Встроенные функции SoftICE 371
Глава 5. Дизассемблер IDA Pro 375
5.1. Введение в IDA Pro 376
5.1.1. Начало работы 376
Общие сведения о виртуальной памяти 376
Интерфейс программы 377
Ключи запуска программы 390
5.1.2. Простые примеры исследования кода 391
О возможностях IDA Pro 391
Отладка в среде IDA Pro 399
5.2. Встроенный язык IDA Pro 401
5.2.1. О встроенном языке IDA Pro 402
Общие сведения 402
Структура программы и синтаксис языка IDC 403
5.2.2. Встроенные функции и примеры программирования на языке IDC 407
Доступ к виртуальной памяти 407
Структура строки листинга 411
Работа с функциями 419
Элементы интерфейса с пользователем 421
Другие возможности программного анализа листинга в IDA Pro 422
ПРИЛОЖЕНИЯ 425
Приложение 1 427
Приложение 2. Описание компакт-диска 440
Литература 441
Предметный указатель 442
VIII Оглавление VII Оглавление