2. О чем не сегодня
Ни какого погружения в дебри ассемблера
Мы не будем разбирать как восстанавливаются
структуры, классы или стековые переменные
Это не мастер класс по IDA
Декомпилятора в Си не существует
Обсуждать прохождение Fallout тоже не будем
3. Сегодня о другом
Как можно вносить изменения в «чужой» код?
И как можно использовать «чужой» код у себя?
Почему листинг дизассемблера нельзя
просто так скомпилировать?
Как связывать свой код с «чужим»?
При чем тут вообще Fallout к восстановлению в С++?
4. Как вносить изменения в код
Патчи:
1) Обычный
2) in-line
3) Наращивание файла
Хуки:
1) Подкладывание DLL
2) Дописывание в импорт
3) Инжект
ЭТО ВСЕ РАВНО ПЛЯСКИ С БУБНОМ!
5. Как использовать чужой код у себя
Хуки/патчи
Прямой вызов
Перенести ассемблерный кусок вручную
DLL2Lib
7. А что если руками декомпилировать?
Долго
Много ошибок
Сложно тестировать
Невозможно распределить работу
Hex Rays – не декомпилятор !
8.
9. Что ж за невезуха с дизассемблерами
Неполное дизассемблирование
Ошибки в генераторе ассемблера
Олбанский синтаксис
Теряются связи кода с данными
Не интерактивно + нет Intellisence
IDA – Interactive Disassembler
10. Генерация компилируемого ассемблера
Минимум распознавания!
Отключить:
1) Деманглинг
2) Flirt
3) Распознавание типов
Исправить импорт
Доработать напильником
11. Сборка в Visual Studio
Пустой проект типа «windows application»
Custom Build tool:
ML.EXE /coff /Fl /Sf /I. /Zi /c /Cp /Zp1 /Zm /Ta
!DEP && !ASLR
Entry Point = start
И совсем чуточку везения…
15. Как заменять ассемблер на С++
extern "C" __declspec(naked) int * jMyCFunc(Object *object)
{
static void * result;
__asm pushad
__asm push eax
__asm call MyCFunc
__asm mov result, eax
__asm popad
__asm mov eax, result
__asm ret
}
extern _jMyCFunc : proc
16. Как вызывать ассемблер из С++
extern "C" __declspec(naked) int CallAsmFunc()
{
static void * result;
__asm pushad
__asm push eax
__asm call AsmFunc
__asm mov result, eax
__asm popad
__asm mov eax, result
__asm ret
}
17.
18. Насколько это трудозатратно
Подготовка базы: 1 день
Подготовка ассемблера к компиляции: 1 день
Перенос ассемблера в C++: 20 функций в день
Fallout 2: 4300 функций – 10% библиотечных =
~ 200 человеко-дней
200 * 3 = 600 = 3 года если водиночку
Fallout 2 был написан командой ЗА ГОД