
2015_лекции / Лекция №8_2015
.pdf
Анти-дизассемблирование: маскировка потока
выполнения программы
Маскировка вызовов функций
Манипуляция со стеком (изменение и адресация относительно ESP или EBP)
Использование SEH:

Анти-дизассемблирование: маскировка потока
выполнения программы
Маскировка вызовов функций:
Затрудняет анализ границ функций
Рекурсивные дизассемблеры интерпретируют инструкции после call как валидные
1.Инструкция call без ret
call == push ret_addr, jmp new_addr
Вариант использования:
call target
.target
pop <register_name> ; вытолкнули адрес возврата

Анти-дизассемблирование: маскировка потока
выполнения программы
2. Инструкция call, jmp + регистр Часто используется в упаковщиках, т.к.
Call <addr> = 5 байт Call <register> = 2 байта

Анти-дизассемблирование: маскировка потока
выполнения программы
3. Использование ret/ retn
ret == pop ret_addr, jmp ret_addr

Анти-дизассемблирование: маскировка потока
выполнения программы

Анти-дизассемблирование: маскировка потока
выполнения программы
Использование SEH:
SEH работает по принципу стека (Last IN – First OUT)

Анти-дизассемблирование: маскировка потока
выполнения программы
Назначить собственный обработчик:
push ExceptionHandler push fs:[0]
mov fs:[0], esp
Есть механизмы, контролирующие динамическое создание собственных обработчиков:
SafeSEH (Microsoft®)

Обфускация кода
Нарушение соглашений вызовов функций
Использование «ничего не делающего» кода («мусорные инструкции»)
Спрятать важный код за «мусором»
Существуют походы к семантическому анализу кода, есть множество недостатков
Обфускация констант

Полиморфизм, метаморфизм, обфускация кода
Цель: скрыть код дешифратора
Уровни полиморфизма
•Олигоморфизм
•Полиморфизм
•Метаморфизм
с
л
о
ж
н
о
с
т
ь

Олигоморфизм
Конечное множество дешифраторов.
Небольшие изменения
Небольшие изменения сложно увидеть