- •Отчёт по снир
- •Оглавление.
- •Глава 1. Введение. Понятие
- •Виды «Обратной разработки»
- •Что можно получить?
- •Глава 2. Фундаментальные знания для обратной инженерии.
- •2.1 Архитектура
- •Представление знака в числах.
- •Порядок байт (Endianness)
- •Виды памяти.
- •Предсказатели переходов.
- •Глава 3. Основная часть
- •3.1.1 Поиск в коде того, что нужно.
- •Идентификация исполняемых файлов
- •Часто используемые функции Windows api
- •Расширение триального периода
- •Tracer: Перехват всех функций в отдельном модуле
- •Текстовые строки
- •Сообщения об ошибках и отладочные сообщения
- •Константы
- •Системные вызовы (syscall-ы)
- •3.1.2 Пример: игра Windows xp «Сапёр».
- •3.4 Основные способы защиты программ
- •3.5 Методы противодействия.
- •Особенности анализа оверлейных программ
- •Особенности анализа графических программ Windows
- •Защита программ от анализа
- •Динамическое изменение кода программы
- •Искусственное усложнение структуры программы
- •Глава 4. Основные программы для обратной инженерии
- •4.1 Отладчик debug
- •Глава 5. Вывод.
- •Глава 8. Литература.
Представление знака в числах.
Методов представления чисел со знаком «плюс» или «минус» несколько, но в компьютерах обычно применяется метод «дополнительный код» или «two’s complement».
Разница в подходе к знаковым/без знаковым числам, собственно, нужна потому что, например, если представить 0xFFFFFFFE и 0x00000002 как без знаковое, то первое число (4294967294) больше второго (2). Если их оба представить как знаковые, то первое будет −2, которое, разумеется, меньше чем второе (2). Вот почему инструкции для условных переходов представлены в обоих версиях — и для знаковых сравнений (например, JG , JL ) и для без знаковых ( JA , JB ).
Для простоты, вот что нужно знать:
• Числа бывают знаковые и без знаковые.
Знаковые типы в Си/Си++:
– int64_t (-9,223,372,036,854,775,808..9,223,372,036,854,775,807) (- 9.2.. 9.2 квинтиллионов) или
0x8000000000000000..0x7FFFFFFFFFFFFFFF ),
– int (-2,147,483,648..2,147,483,647 (- 2.15.. 2.15Gb) или 0x80000000..0x7FFFFFFF ),
– char (-128..127 или 0x80..0x7F ),
– ssize_t .
Без знаковые:
– uint64_t (0..18,446,744,073,709,551,615 ( 18 квинтиллионов) или 0..0xFFFFFFFFFFFFFFFF ),
– unsigned int (0..4,294,967,295 ( 4.3Gb) или 0..0xFFFFFFFF ),
– unsigned char (0..255 или 0..0xFF ),
– size_t .
• У знаковых чисел знак определяется самым старшим битом: 1 означает «минус», 0 означает «плюс».
• Преобразование в большие типы данных обходится легко:
Конвертирование 32-битного значения в 64-битное. Нужно просто выставить в 0 все биты в старшей части. Но для знаковых типов это не подходит: знак числа должен быть скопирован в старшую часть числа-результата.
• Изменить знак легко:
просто инвертируйте все биты и прибавьте 1. Мы можем заметить, что число другого знака
находится на другой стороне на том же расстоянии от нуля. Прибавление единицы необходимо из-за присутствия нуля посредине.
• Инструкции сложения и вычитания работают одинаково хорошо и для знаковых и для без знаковых значений. Но для операций умножения и деления, в x86 имеются разные инструкции: IDIV / IMUL для знаковых и DIV / MUL для без знаковых.
• Еще инструкции работающие с знаковыми числами: CBW/CWD/CWDE/CDQ/CDQE, MOVSX, SAR.
Порядок байт (Endianness)
Endianness (порядок байт) это способ представления чисел в памяти.
Big-endian (от старшего к младшему).
Число 0x12345678 представляется в памяти так:
Адрес в памяти |
Значение байта |
+0 |
0х12 |
+1 |
0х34 |
+2 |
0х56 |
+3 |
0х78 |
Таблица 4. Представление в памяти.
CPU с таким порядком включают в себя Motorola 68k, IBM POWER.
Little-endian (от младшего к старшему).
Число 0x12345678 представляется в памяти так:
Адрес в памяти |
Значение байта |
+0 |
0х78 |
+1 |
0х56 |
+2 |
0х34 |
+3 |
0х12 |
Таблица 5.
CPU с таким порядком байт включают в себя Intel x86.
Bi-endian (переключаемый порядок).
CPU поддерживающие оба порядка, и его можно переключать, включают в себя ARM, PowerPC, SPARC, MIPS, IA64, и т.д.
Конвертирование.
Инструкция BSWAP может использоваться для конвертирования.
Сетевые пакеты TCP/IP используют соглашение big-endian, вот почему программа, работающая на little-endian архитектуре должна конвертировать значения.
Обычно, используются функции htonl() и htons() .
Порядок байт big-endian в среде TCP/IP также называется, «network byte order», а порядок байт на компьютере «host byte order». На архитектуре Intel x86, и других little-endian архитектурах, «host byte order» это little-endian, а вот на IBM POWER это может быть big-endian, так что на последней, htonl() и htons() не меняют порядок байт.
