Вы находитесь на странице: 1из 4

ОГЛАВЛЕНИЕ

3.12 C99 restrict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506


3.13 Функция abs() без переходов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
3.13.1 Оптимизирующий GCC 4.9.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
3.13.2 Оптимизирующий GCC 4.9 ARM64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
3.14 Функции с переменным количеством аргументов . . . . . . . . . . . . . . . . . . . . . . . . . . 510
3.14.1 Вычисление среднего арифметического . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
3.14.2 Случай с функцией vprintf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
3.14.3 Случай с Pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
3.14.4 Эксплуатация строки формата . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
3.15 Обрезка строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
3.15.1 x64: Оптимизирующий MSVC 2013 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
3.15.2 x64: Неоптимизирующий GCC 4.9.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
3.15.3 x64: Оптимизирующий GCC 4.9.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
3.15.4 ARM64: Неоптимизирующий GCC (Linaro) 4.9 . . . . . . . . . . . . . . . . . . . . . . . . . 521
3.15.5 ARM64: Оптимизирующий GCC (Linaro) 4.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
3.15.6 ARM: Оптимизирующий Keil 6/2013 (Режим ARM) . . . . . . . . . . . . . . . . . . . . . . 523
3.15.7 ARM: Оптимизирующий Keil 6/2013 (Режим Thumb) . . . . . . . . . . . . . . . . . . . . . 523
3.15.8 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
3.16 Функция toupper() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
3.16.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
3.16.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
3.16.3 Используя битовые операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
3.16.4 Итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
3.17 Обфускация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
3.17.1 Текстовые строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
3.17.2 Исполняемый код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
3.17.3 Виртуальная машина / псевдо-код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
3.17.4 Еще кое-что . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
3.17.5 Упражнение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
3.18 Си++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
3.18.1 Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
3.18.2 ostream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
3.18.3 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
3.18.4 STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
3.18.5 Память . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
3.19 Отрицательные индексы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
3.19.1 Адресация строки с конца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
3.19.2 Адресация некоторого блока с конца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
3.19.3 Массивы начинающиеся с 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
3.20 Больше об указателях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
3.20.1 Работа с адресами вместо указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
3.20.2 Передача значений как указателей; тэггированные объединения . . . . . . . . . . 591
3.20.3 Издевательство над указателями в ядре Windows . . . . . . . . . . . . . . . . . . . . . 591
3.20.4 Нулевые указатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
3.20.5 Массив как аргумент функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
3.20.6 Указатель на функцию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
3.20.7 Указатель как идентификатор объекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
3.21 Оптимизации циклов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
3.21.1 Странная оптимизация циклов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
3.21.2 Еще одна оптимизация циклов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
3.22 Еще о структурах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
3.22.1 Иногда вместо массива можно использовать структуру в Си . . . . . . . . . . . . . . 605
3.22.2 Безразмерный массив в структуре Си . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
3.22.3 Версия структуры в Си . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
3.22.4 Файл с рекордами в игре «Block out» и примитивная сериализация . . . . . . . . . 609
3.23 memmove() и memcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
3.23.1 Анти-отладочный прием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
3.24 setjmp/longjmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
3.25 Другие нездоровые хаки связанные со стеком . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
3.25.1 Доступ к аргументам и локальным переменным вызывающей ф-ции . . . . . . . . 617
3.25.2 Возврат строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
3.26 OpenMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
3.26.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
3.26.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625

viii
ОГЛАВЛЕНИЕ
3.27 Windows 16-bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
3.27.1 Пример#1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
3.27.2 Пример #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
3.27.3 Пример #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
3.27.4 Пример #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
3.27.5 Пример #5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
3.27.6 Пример #6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634

4 Java 638
4.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
4.1.1 Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
4.1.2 Возврат значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
4.1.3 Простая вычисляющая функция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
4.1.4 Модель памяти в JVM4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
4.1.5 Простой вызов функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
4.1.6 Вызов beep() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
4.1.7 Линейный конгруэнтный ГПСЧ5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
4.1.8 Условные переходы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
4.1.9 Передача аргументов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
4.1.10 Битовые поля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
4.1.11 Циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
4.1.12 switch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
4.1.13 Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
4.1.14 Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
4.1.15 Исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
4.1.16 Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
4.1.17 Простейшая модификация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
4.1.18 Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676

5 Поиск в коде того что нужно 677


5.1 Идентификация исполняемых файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
5.1.1 Microsoft Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
5.1.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
5.1.3 Intel Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
5.1.4 Watcom, OpenWatcom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
5.1.5 Borland . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
5.1.6 Другие известные DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
5.2 Связь с внешним миром (на уровне функции) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
5.3 Связь с внешним миром (win32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
5.3.1 Часто используемые функции Windows API . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
5.3.2 Расширение триального периода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
5.3.3 Удаление nag-окна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
5.3.4 tracer: Перехват всех функций в отдельном модуле . . . . . . . . . . . . . . . . . . . . . 682
5.4 Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
5.4.1 Текстовые строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
5.4.2 Поиск строк в бинарном файле . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
5.4.3 Сообщения об ошибках и отладочные сообщения . . . . . . . . . . . . . . . . . . . . . . 688
5.4.4 Подозрительные магические строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
5.5 Вызовы assert() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
5.6 Константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
5.6.1 Магические числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
5.6.2 Специфические константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
5.6.3 Поиск констант . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
5.7 Поиск нужных инструкций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
5.8 Подозрительные паттерны кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
5.8.1 Инструкции XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
5.8.2 Вручную написанный код на ассемблере . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
5.9 Использование magic numbers для трассировки . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
5.10 Циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
5.10.1 Некоторые паттерны в бинарных файлах . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
5.10.2 Сравнение «снимков» памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
4 Java Virtual Machine
5 Генератор псевдослучайных чисел

ix
ОГЛАВЛЕНИЕ
5.11 Определение ISA6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
5.11.1 Неверно дизассемблированный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
5.11.2 Корректино дизассемблированный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
5.12 Текстовые строки прямо посреди сжатых данных . . . . . . . . . . . . . . . . . . . . . . . . . 710
5.13 Прочее . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
5.13.1 Общая идея . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
5.13.2 Порядок функций в бинарном коде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
5.13.3 Крохотные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
5.13.4 Си++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712

6 Специфичное для ОС 713


6.1 Способы передачи аргументов при вызове функций . . . . . . . . . . . . . . . . . . . . . . . . . 713
6.1.1 cdecl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
6.1.2 stdcall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
6.1.3 fastcall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
6.1.4 thiscall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
6.1.5 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
6.1.6 Возвращение переменных типа float, double . . . . . . . . . . . . . . . . . . . . . . . . . . 719
6.1.7 Модификация аргументов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
6.1.8 Указатель на аргумент функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
6.2 Thread Local Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
6.2.1 Вернемся к линейному конгруэнтному генератору . . . . . . . . . . . . . . . . . . . . . 722
6.3 Системные вызовы (syscall-ы) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
6.3.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
6.3.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
6.4 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
6.4.1 Адресно-независимый код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
6.4.2 Трюк с LD_PRELOAD в Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
6.5 Windows NT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
6.5.1 CRT (win32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
6.5.2 Win32 PE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
6.5.3 Windows SEH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
6.5.4 Windows NT: Критические секции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766

7 Инструменты 768
7.1 Дизассемблеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.1.1 IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.2 Отладчики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.2.1 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.2.2 GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.2.3 tracer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
7.3 Трассировка системных вызовов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
7.4 Декомпиляторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
7.5 Прочие инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
7.5.1 Калькуляторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
7.6 Чего-то здесь недостает? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770

8 Примеры из практики 771


8.1 Шутка с task manager (Windows Vista) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
8.1.1 Использование LEA для загрузки значений . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
8.2 Шутка с игрой Color Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
8.3 Сапёр (Windows XP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780
8.3.1 Автоматический поиск массива . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
8.3.2 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
8.4 Хакаем часы в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
8.5 Донглы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
8.5.1 Пример #1: MacOS Classic и PowerPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
8.5.2 Пример #2: SCO OpenServer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
8.5.3 Пример #3: MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
8.6 «QR9»: Любительская криптосистема, вдохновленная кубиком Рубика . . . . . . . . . . . . 815
8.7 Случай с зашифрованной БД #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
8.7.1 Base64 и энтропия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
8.7.2 Данные сжаты? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
6 Instruction Set Architecture (Архитектура набора команд)

x
ОГЛАВЛЕНИЕ
8.7.3 Данные зашифрованы? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
8.7.4 CryptoPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
8.7.5 Режим обратной связи по шифротексту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848
8.7.6 Инициализирующий вектор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
8.7.7 Структура буфера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
8.7.8 Шум в конце . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
8.7.9 Вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
8.7.10 Post Scriptum: перебор всех IV7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
8.8 Разгон майнера биткоинов Cointerra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
8.9 SAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
8.9.1 Касательно сжимания сетевого траффика в клиенте SAP . . . . . . . . . . . . . . . . . 858
8.9.2 Функции проверки пароля в SAP 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
8.10 Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873
8.10.1 Таблица V$VERSION в Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873
8.10.2 Таблица X$KSMLRU в Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
8.10.3 Таблица V$TIMER в Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882
8.11 Вручную написанный на ассемблере код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886
8.11.1 Тестовый файл EICAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886
8.12 Демо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
8.12.1 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
8.12.2 Множество Мандельброта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
8.13 ”Прикуп” в игре ”Марьяж” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
8.13.1 Упражнение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909
8.14 Другие примеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909

9 Примеры разбора закрытых (proprietary) форматов файлов 910


9.1 Примитивное XOR-шифрование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
9.1.1 Norton Guide: простейшее однобайтное XOR-шифрование . . . . . . . . . . . . . . . . . 911
9.1.2 Простейшее четырехбайтное XOR-шифрование . . . . . . . . . . . . . . . . . . . . . . . . 914
9.1.3 Простое шифрование используя XOR-маску . . . . . . . . . . . . . . . . . . . . . . . . . . 918
9.1.4 Простое шифрование используя XOR-маску, второй случай . . . . . . . . . . . . . . . . 925
9.2 Информационная энтропия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
9.2.1 Анализирование энтропии в Mathematica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931
9.2.2 Вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
9.2.3 Инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
9.2.4 Кое-что о примитивном шифровании как XOR . . . . . . . . . . . . . . . . . . . . . . . . . 941
9.2.5 Еще об энтропии исполняемого кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
9.2.6 ГПСЧ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
9.2.7 Еще примеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
9.2.8 Энтропия различных файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
9.2.9 Понижение уровня энтропии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
9.3 Файл сохранения состояния в игре Millenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
9.4 Файл с индексами в программе fortune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
9.4.1 Хакинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
9.4.2 Файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
9.5 Oracle RDBMS: .SYM-файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956
9.6 Oracle RDBMS: .MSB-файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965
9.6.1 Вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
9.7 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
9.8 Дальнейшее чтение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972

10 Прочее 973
10.1 Модификация исполняемых файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
10.1.1 Текстовые строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
10.1.2 x86-код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
10.2 Статистика количества аргументов функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974
10.3 Compiler intrinsic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974
10.4 Аномалии компиляторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
10.4.1 Oracle RDBMS 11.2 and Intel C++ 10.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
10.4.2 MSVC 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
10.4.3 Итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
10.5 Itanium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
10.6 Модель памяти в 8086 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
7 Initialization Vector

xi

Вам также может понравиться