Developing of native code obfuscator - Евгений Кулик

Preview:

Citation preview

Developing of native code obfuscator

1. Сферы применения бинарных

обфускаторов

2. Алгоритм работы обфускатора.

3. Переносимость на разные 3. Переносимость на разные

платформы.

4. Трудности деобфускации.

1. Защита от реверс-инженерии.

2. Противодействие сигнатурным

анализаторам.анализаторам.

3. Сокрытие полезной нагрузки

эксплоитов.

Пример обфускации кода в протекторе Shiva

Core-packer от Hacking Team скрывает

malware от сигнатурного анализа

1. Обфускаторы исходного кода.

2. Обфускаторы промежуточного

байт-кода.байт-кода.

3. Обфускаторы ассемблерных

инструкций.

1. Реализация поли- и метаморфизма

вирусных инфекторов.

2. Навесные упаковщики.

3. Критически важные части

алгоритмов регистрации приложений.

Схема применения обфускатора

Исходный

бинарный файлДизассемблерный

движок

Ассемблерный

движок Обфусцированный

бинарный файл

Пермутация как основа обфускатора

До пермутации После пермутации

xor eax,eax

mov eax,12345678

xor eax,eax

nop

add eax,12345678

nop

Шаблоны и полиморфизм

inc eax inc %reg0inc %reg0

inc %reg0inc eax inc %reg0 inc %reg0

dec %reg0

Подстановка оригинального

значения операнда в шаблон

inc %reg0

eax

inc eaxinc %reg0

inc %reg0

dec %reg0

inc eax

inc eax

dec eax

Генерация промежуточного представления

ассемблерных инструкций

mov eax, ecx

class Instruction{

public:

std::string Prefix;

std::string Opcode;

Argument left;

Argument right;

};

Prefix Opcode Argument Argument

class Argument{

public:

std::string Constant;

std::string Register;

std::string Label;

Expression expression;

Type type;

};

Expression – что это?

class Expression{

public:

std::string Register1;

std::string Terminal;

[eax]

[ecx + 5]

[edx + ebx]std::string Terminal;

std::string Constant;

std::string Register2;

}

[edx + ebx]

[esi * 2]

mov eax, [ecx + edx]

Expression

Алгоритм работы обфускатора

Исходная

инструкция1. Морфирующие

2. Мусорные

База

шаблонов

1

2

3

ГПСЧ

Обфусцированные

инструкции

24

5

Обфускатор

Исходный код обфускатора на С++

1. Метаморфные шаблоны.

2. Мусорные шаблоны.2. Мусорные шаблоны.

3. Возможность наложения шаблонов

друг на друга - ключевая.

Чем полиморфизм отличается от

метаморфизма?

push eax

mov eax, esp

mov ecx, dword ptr[eax-4]

add ecx,10

pop eax

push ebp

mov ebp, esp

mov ecx, dword ptr[ebp -4]

add ecx,10pop eax

retn 4

add ecx,10

pop ebp

retn 4

push eaxpush 0

mov dword ptr [esp], eax

Метод «чёрного» ящика

Обфусцированный

код

Разбиение на

блокиДанные для

анализа подаются

на вход каждого

блока. блока.

Анализируются

выходные данные.

Сложность в

правильном

разбиении на

блоки.

Наличие инструментов для реверс-

инженерии под разные системы

x86 x86-64 ARM

Windows

Linux

Где используются ARM-процессоры

1. Отличие встраиваемых систем от

канонических.

2. Необходимость сборки большинства

утилит для статического и динамического утилит для статического и динамического

анализа.

3. Сложность отладки модулей ядра.

4. Отсутствие портирования под arm

некоторых утилит.