وبلاگ بلیان

مهندسی معکوس برای مبتدیان (درک زبان اسمبلی)

Reverse Engineering для начинающих (Понимание языка ассемблера)

جلد کتاب مهندسی معکوس برای مبتدیان (درک زبان اسمبلی)

معرفی کتاب «مهندسی معکوس برای مبتدیان (درک زبان اسمبلی)» (با عنوان لاتین Reverse Engineering для начинающих (Понимание языка ассемблера)) نوشتهٔ Юричев Денис، منتشرشده توسط نشر 2020 در سال 2020. این کتاب در فرمت pdf، زبان ru ارائه شده است.

Образцы кода Метод Некоторые базовые понятия Краткое введение в CPU Представление чисел Пустая функция x86 ARM MIPS Пустые функции на практике Возврат значения x86 ARM MIPS На практике Hello, world! x86 x86-64 ARM MIPS Вывод Упражнения Пролог и эпилог функций Рекурсия Еще кое-что о пустой ф-ции Еще кое-что о возвращаемых значениях Стек Почему стек растет в обратную сторону? Для чего используется стек? Разметка типичного стека Мусор в стеке Упражнения Почти пустая ф-ция printf() с несколькими аргументами x86 ARM MIPS Вывод Кстати scanf() Простой пример Классическая ошибка Глобальные переменные Проверка результата scanf() Упражнение Стоит отметить: глобальные и локальные переменные Доступ к переданным аргументам x86 x64 ARM MIPS Ещё о возвращаемых результатах Попытка использовать результат функции возвращающей void Что если не использовать результат функции? Возврат структуры Указатели Возврат значений Обменять входные значения друг с другом Оператор GOTO Мертвый код Упражнение Условные переходы Простой пример Вычисление абсолютной величины Тернарный условный оператор Поиск минимального и максимального значения Вывод Упражнение Взлом ПО Пранк: невозможность выйти из Windows 7 switch()/case/default Если вариантов мало И если много Когда много case в одном блоке Fall-through Упражнения Циклы Простой пример Функция копирования блоков памяти Проверка условия Вывод Упражнения Еще кое-что о строках strlen() Замена одних арифметических инструкций на другие Умножение Деление Упражнение Работа с FPU IEEE 754 x86 ARM, MIPS, x86/x64 SIMD Си/Си++ Простой пример Передача чисел с плавающей запятой в аргументах Пример со сравнением Некоторые константы Копирование Стек, калькуляторы и обратная польская запись 80 бит? x64 Упражнения Массивы Простой пример Переполнение буфера Защита от переполнения буфера Еще немного о массивах Массив указателей на строки Многомерные массивы Набор строк как двухмерный массив Вывод Упражнения Пример: ошибка в Angband Работа с отдельными битами Проверка какого-либо бита Установка и сброс отдельного бита Сдвиги Установка и сброс отдельного бита: пример с FPU Подсчет выставленных бит Вывод Упражнения Линейный конгруэнтный генератор x86 x64 32-bit ARM MIPS Версия этого примера для многопоточной среды Структуры MSVC: Пример SYSTEMTIME Выделяем место для структуры через malloc() UNIX: struct tm Упаковка полей в структуре Вложенные структуры Работа с битовыми полями в структуре Упражнения Классическая ошибка с struct Объединения (union) Пример генератора случайных чисел Вычисление машинного эпсилона Замена инструкции FSCALE Быстрое вычисление квадратного корня Указатели на функции MSVC GCC Опасность указателей на ф-ции 64-битные значения в 32-битной среде Возврат 64-битного значения Передача аргументов, сложение, вычитание Умножение, деление Сдвиг вправо Конвертирование 32-битного значения в 64-битное Случай со структурой LARGE_INTEGER SIMD Векторизация Реализация strlen() при помощи SIMD 64 бита x86-64 ARM Числа с плавающей запятой Критика 64-битной архитектуры Работа с числами с плавающей запятой (SIMD) Простой пример Передача чисел с плавающей запятой в аргументах Пример со сравнением Вычисление машинного эпсилона: x64 и SIMD И снова пример генератора случайных чисел Итог Кое-что специфичное для ARM Знак номера (#) перед числом Режимы адресации Загрузка констант в регистр Релоки в ARM64 Кое-что специфичное для MIPS Загрузка 32-битной константы в регистр Книги и прочие материалы о MIPS Важные фундаментальные вещи Целочисленные типы данных Бит Ниббл AKA nibble AKA nybble Байт Wide char Знаковые целочисленные и беззнаковые Слово (word) Регистр адреса Числа Представление знака в числах Использование IMUL вместо MUL Еще кое-что о дополнительном коде -1 Целочисленное переполнение (integer overflow) AND Проверка того, находится ли значение на границе 2n Кирилличная кодировка KOI-8R И и ИЛИ как вычитание и сложение Текстовые строки в ПЗУ ZX Spectrum XOR (исключающее ИЛИ) Логическая разница (logical difference) Бытовая речь Шифрование RAID4 Алгоритм обмена значений при помощи исключающего ИЛИ Список связанный при помощи XOR Трюк с переключением значений Хэширование Зобриста / табуляционное хэширование Кстати AND/OR/XOR как MOV Подсчет бит Endianness (порядок байт) Big-endian (от старшего к младшему) Little-endian (от младшего к старшему) Пример Bi-endian (переключаемый порядок) Конвертирование Память CPU Предсказатели переходов Зависимости между данными Хеш-функции Как работает односторонняя функция? Более сложные примеры Двойное отрицание Использование const (const correctness) Пересекающиеся const-строки Пример strstr() Конвертирование температуры Целочисленные значения Числа с плавающей запятой Числа Фибоначчи Пример #1 Пример #2 Итог Пример вычисления CRC32 Пример вычисления адреса сети calc_network_address() form_IP() print_as_IP() form_netmask() и set_bit() Итог Циклы: несколько итераторов Три итератора Два итератора Случай Intel C++ 2011 Duff's device Нужно ли использовать развернутые циклы? Деление используя умножение x86 Как это работает ARM MIPS Упражнение Конверсия строки в число (atoi()) Простой пример Немного расширенный пример Упражнение Inline-функции Функции работы со строками и памятью C99 restrict Функция abs() без переходов Оптимизирующий GCC 4.9.1 x64 Оптимизирующий GCC 4.9 ARM64 Функции с переменным количеством аргументов Вычисление среднего арифметического Случай с функцией vprintf() Случай с Pin Эксплуатация строки формата Обрезка строк x64: Оптимизирующий MSVC 2013 x64: Неоптимизирующий GCC 4.9.1 x64: Оптимизирующий GCC 4.9.1 ARM64: Неоптимизирующий GCC (Linaro) 4.9 ARM64: Оптимизирующий GCC (Linaro) 4.9 ARM: Оптимизирующий Keil 6/2013 (Режим ARM) ARM: Оптимизирующий Keil 6/2013 (Режим Thumb) MIPS Функция toupper() x64 ARM Используя битовые операции Итог Обфускация Текстовые строки Исполняемый код Виртуальная машина / псевдо-код Еще кое-что Упражнение Си++ Классы ostream References STL Память Отрицательные индексы массивов Адресация строки с конца Адресация некоторого блока с конца Массивы начинающиеся с 1 Больше об указателях Работа с адресами вместо указателей Передача значений как указателей; тэггированные объединения Издевательство над указателями в ядре Windows Нулевые указатели Массив как аргумент функции Указатель на функцию Указатель на функцию: защита от копирования Указатель на ф-цию: частая ошибка (или опечатка) Указатель как идентификатор объекта Оптимизации циклов Странная оптимизация циклов Еще одна оптимизация циклов Еще о структурах Иногда вместо массива можно использовать структуру в Си Безразмерный массив в структуре Си Версия структуры в Си Файл с рекордами в игре "Block out" и примитивная сериализация memmove() и memcpy() Анти-отладочный прием setjmp/longjmp Другие нездоровые хаки связанные со стеком Доступ к аргументам и локальным переменным вызывающей ф-ции Возврат строки OpenMP MSVC GCC Еще одна heisenbug-а Случай с забытым return Домашнее задание: больше об указателях на ф-ции и объединениях (union) Windows 16-bit Пример#1 Пример #2 Пример #3 Пример #4 Пример #5 Пример #6 Java Java Введение Возврат значения Простая вычисляющая функция Модель памяти в JVM Простой вызов функций Вызов beep() Линейный конгруэнтный ГПСЧ Условные переходы Передача аргументов Битовые поля Циклы switch() Массивы Строки Исключения Классы Простейшая модификация Итоги Поиск в коде того что нужно Идентификация исполняемых файлов Microsoft Visual C++ GCC Intel Fortran Watcom, OpenWatcom Borland Другие известные DLL Связь с внешним миром (на уровне функции) Связь с внешним миром (win32) Часто используемые функции Windows API Расширение триального периода Удаление nag-окна tracer: Перехват всех функций в отдельном модуле Строки Текстовые строки Поиск строк в бинарном файле Сообщения об ошибках и отладочные сообщения Подозрительные магические строки Вызовы assert() Константы Магические числа Специфические константы Поиск констант Поиск нужных инструкций Подозрительные паттерны кода Инструкции XOR Вручную написанный код на ассемблере Использование magic numbers для трассировки Циклы Некоторые паттерны в бинарных файлах Сравнение "снимков" памяти Определение ISA Неверно дизассемблированный код Корректно дизассемблированный код Прочее Общая идея Порядок функций в бинарном коде Крохотные функции Си++ Намеренный сбой Специфичное для ОС Способы передачи аргументов при вызове функций cdecl stdcall fastcall thiscall x86-64 Возвращение переменных типа float, double Модификация аргументов Указатель на аргумент функции Thread Local Storage Вернемся к линейному конгруэнтному генератору Системные вызовы (syscall-ы) Linux Windows Linux Адресно-независимый код Трюк с LD_PRELOAD в Linux Windows NT CRT (win32) Win32 PE Windows SEH Windows NT: Критические секции Инструменты Дизассемблеры IDA Отладчики OllyDbg GDB tracer Трассировка системных вызовов Декомпиляторы Прочие инструменты Калькуляторы Чего-то здесь недостает? Примеры из практики Шутка с Маджонгом (Windows 7) Шутка с task manager (Windows Vista) Использование LEA для загрузки значений Шутка с игрой Color Lines Сапёр (Windows XP) Автоматический поиск массива Упражнения Хакаем часы в Windows Донглы Пример #1: MacOS Classic и PowerPC Пример #2: SCO OpenServer Пример #3: MS-DOS Случай с зашифрованной БД #1 Base64 и энтропия Данные сжаты? Данные зашифрованы? CryptoPP Режим обратной связи по шифротексту Инициализирующий вектор Структура буфера Шум в конце Вывод Post Scriptum: перебор всех IV Разгон майнера биткоинов Cointerra Взлом простого шифровальщика исполняемого кода Еще идеи для рассмотрения SAP Касательно сжимания сетевого траффика в клиенте SAP Функции проверки пароля в SAP 6.0 Oracle RDBMS Таблица V$VERSION в Oracle RDBMS Таблица X$KSMLRU в Oracle RDBMS Таблица V$TIMER в Oracle RDBMS Вручную написанный на ассемблере код Тестовый файл EICAR Демо 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 Множество Мандельброта Как я переписывал 100 килобайт x86-кода на чистый Си "Прикуп" в игре "Марьяж" Упражнение Другие примеры Примеры разбора закрытых (проприетарных) форматов файлов Примитивное XOR-шифрование Простейшее XOR-шифрование Norton Guide: простейшее однобайтное XOR-шифрование Простейшее четырехбайтное XOR-шифрование Простое шифрование используя XOR-маску Простое шифрование используя XOR-маску, второй случай Домашнее задание Информационная энтропия Анализирование энтропии в Mathematica Вывод Инструменты Кое-что о примитивном шифровании как XOR Еще об энтропии исполняемого кода ГПСЧ Еще примеры Энтропия различных файлов Понижение уровня энтропии Файл сохранения состояния в игре Millenium Файл с индексами в программе fortune Хакинг Файлы Oracle RDBMS: .SYM-файлы Oracle RDBMS: .MSB-файлы Вывод Упражнения Дальнейшее чтение Прочее Модификация исполняемых файлов x86-код Статистика количества аргументов функций Compiler intrinsic Аномалии компиляторов Oracle RDBMS 11.2 and Intel C++ 10.1 MSVC 6.0 ftol2() в MSVC 2012 Итог Itanium Модель памяти в 8086 Перестановка basic block-ов Profile-guided optimization Мой опыт с Hex-Rays 2.2.0 Ошибки Странности Безмолвие Запятая Типы данных Длинные и запутанные выражения Правила де Моргана и декомпиляция Мой план Итог Что стоит почитать Книги и прочие материалы Reverse Engineering Windows Си/Си++ x86 / x86-64 ARM Язык ассемблера Java UNIX Программирование Криптография Что-то попроще Сообщества Послесловие Вопросы? Приложение x86 Терминология Регистры общего пользования Регистры FPU Регистры SIMD Отладочные регистры Инструкции npad ARM Терминология Версии 32-битный ARM (AArch32) 64-битный ARM (AArch64) Инструкции MIPS Регистры Инструкции Некоторые библиотечные функции GCC Некоторые библиотечные функции MSVC Cheatsheets IDA OllyDbg MSVC GCC GDB Список принятых сокращений Глоссарий Предметный указатель
دانلود کتاب مهندسی معکوس برای مبتدیان (درک زبان اسمبلی)