owned this note
owned this note
Published
Linked with GitHub
# CSRn-8_15.11.2022_ Reverse Engineering & Introduction To Malware Analysis / Реверс-инжиниринг и введение в анализ malware
Преподаватель: Алексей поляков
# Занятие 1. Задачи анализа вредоносного ПО и обратной разработки



Вредоносное программное обеспечение

Backdoor - любая функциональность машины на передачу команд средств управления (любой элемент передачи данных)
trojan -по, которое мимикрирует под нормальное приложение, попытка показаться не тем кем является программа. Известные службы, названия схожие с виндовыми по.
rootkit - все возможности внутри сети по скрытию активности, перехват системных функций
malicious tools - подозрительные тулзы. Набор функциональности.
## **Общие понятия и цели**

## Задачи анализа ВПО

## Типы анализа

## Инструменты анализа





https://urlhaus.abuse.ch/browse/
## Преданализ




**Швейцарский нож для исследования на винде**





## Поведенческий анализ

**Мониторы процессов**
system internals - набор утилит для администрирования винды. Process explorer входит сюда.


**Анализаторы трафика**



**Внешние ресурсы для анализа**

https://cuckoo.cert.ee/
**Virus total**





**Hybrid Analysis**







**app.any.run**







скачать архив с мальварем и проверить на внешних ресурсах ( с виртуалки)
infected - пароль к архиву малварю
винда + вижл студия
в исключения добавить 2 папки

control panel - security 
# Занятие 2. Понятие процесса и исполняемого файла. Основы языка C.


WinAPI - внутренности строени]я системы


## Основы языка С

**Структурированный типы и указатели**

сhar * asd = указатель на конкретную ячейку в памяти

В структуру заранее будут заполняться данные, указатели, байты.
Если заранее не знаем когда будем использовать структуру - то создаем указатель на данную структуру.
struct date* birthday2 ( в винде на уровне winapi - используется функция hipalog (выделяет память))

В определенном поле позволяет хранить данные разных типов, либо передать указатель данных, который будет указывать характерный путь к данным
**Циклы**

**Ветвления**

Оператор switch принимает параметр и проверяет по имеющимся значениям и если попадает в определенный интервал - выполняет ту или иную функцию.
**Типы WinApi**

В языке С заранее надо сообщить с какими строками мы работаем.
**Вызовы функции**

В подовляющем большинстве исполняемых функций CreateFileA (принимает на вход любую строку (askii строки);
CreateFileW (юникодовые строки - имеют на символ 2 байта) - перед нашей строкой должен стоять модификатор L


В заголовках указываем какие библиотеки нужно подтягивать.
кол-во входных параметров в приложение. argc - кол-во строк. argv - пробегает по массиву.
Далее объявление переменных обязательно.
HANDLE - проработка на уровне ядра. Указатель системы как работать с тем или иным объектом.

**Полезные hotkey visual studio**

## **Исполняемый файл**
Исполняемый файл- В винде являются как exe так и библиотеки




image data directory - каталог данных (адрес и размер где лежит та или иная структура)
для dll нам интересна цирфа 0, для exe - 1 (data directory)


Энтропия - степень случайности/ неопределенности данных
## **Используемые библиотеки**

99% библиотек рано или поздно должны дойти до ntdll.dll, кото рая будет вызывать sysvol и передавать параметры ядру
Набор библиотек которые мы будем сразу перехватывать с высокой вероятностью что это малварь:
wsock32.dll и ws2_32.dll - api adress, port - отправили - получили ответ.
wininet.dll и winhttp.dll
## Процесс
динамический контекст исполняемой програмы

**текущее состояние процесса**



В РЕВ - описание процесса на уровне памяти. Идентификаторы процессов, список библиотек, где лежит библиотеке и получить адреса нужных функций.
Чтобы проникнуть в explorer.exe - обращаемся к peb, узнаем где лежит kernel32.dll - узнаем где лежит CreateProcess.
**Process explorer**


system - Если видим аномалию в системных процессах, родитель и порождаемый процесс - предполагаем что малварь.
Основная подделка - мимикрия под системное название, но не точно похожее.
smss.exe - процесс диспетчера сеансов.Единственный в системе
0 сеанс - загрузка назначенных служб
1 сеанс - локальная консоль(работа без гуя)
csrss.exe - управление проуессами, потоками. запускается для каждого сеанса
wininit.exe - запуск ключевые фоновые процессы, диспетчер служб, автозапуск служб
services.exe - запускается wininit, диспетчер фоновых процессов
svchost.exe - любимая история злоумышленника. Если нет родителя и запущен из под эксплорер - значит мальварь.
**Системные процессы**

RuntimeBroker.exe- новая обвязка под новые платформы виндовс
taskhostw.exe - предназначен для работы с триггерными событиями, по времени запускаются
lsass.exe & lsaiso.exe - предназначеныы для средств локальной аутентификации.
lsass - собир инфу и проверяет о вхождении польз в систему. Тут находятся хеши и записи польз, кто работал в системе
lsaiso - позвол аппаратно виртуализировать память, которая будет относится к хранению польз кредов
winlogon.exe - обрабатывает польз входы и выходы. Он отображает первый польз экран.
explorer.exe - проводник, отвечает за панель задач и тд.
**методы создания процесса**
Основные функции:
CreateProcessA - имя модуля для исполнения, путь для exe, до полезной нагрузки
WinExec - путь до exe для запуска полезной нагрузки ,
ShellExecuteA - работает со строками ASKII, позвол инициировать эмуляцию двойного клика в проводнике. Можем открыть файл
Если видим эти функции - ставим брейкпоинты и пытаемся отследить

Запуск фоновых процессов

**стартовые функции исполняемых файлов**

Для консольного приложения функция main
Функция dllmain - первая функция в библиотеках. Будет выполнена каждый раз при запуске программы
**импорт функций**

loadLibraryA + GetProcAdress - первая простая связка для динамического подключения функций.
Как только видим - обязательно ставим брейкпоинты
**прототипирование функций**

Практика

исходдный код в расширениях cpp
Злоумышленник на уровне исходного кода (нижн скрин) создает прототип какойто функции. Обязательно создавать со звездочкой - она указывает адрес в памяти. Вначале повторяем тип Handle( в скобочках повторяем все тпы функции)
f12 - прыгаем на структуру

Пароль от архива - infected



f9 - брейкпоинт
f10 - шаг выполнения программмы без захода в функцию

в 32 разрядном - 4 байта
в 64 - 8 байт
# Занятие 3. Ассемблер. Структура разработки, инструкции, регистры

## концепт обратной разработки

**граф потока управления**


## Примитивы ассемблера
**Регистры процессора х86**

eax - сложение и умножения
ebx - база для операций с памятью
ecx - изначально использ как счетчик
edx - используется в делении и умножении, хранитель тех вещей которые не попадают eax ( которые не помещ в 4 байта/ 2 в 32 степени ), остаток от деления сюда помещ
ebp - системный регистр работы со стеком, помещение и хранение на стеке входных функций. Хранение временных переменных. Отвечает за значение фрейма для конкретной функции
esp - текущая вершина стека
esi - источник работы с памятью
edi - приемник данных для работы со строками
eip - указатель на текущую исполняемую инструкцию . Самый простой способ изменить выполение программы.
eflags - регистр флагов, отвеч за обраб условий и режимов отлада процессора
Сегментные : CS, DS, ES, FS, GS, SS - отвечают за адресацию виртуального адресного пространства на физ часть .
СS - указывает на блок кода
DS - указ на блок данных
FS -
SS - сегмент стека

**eflags**

СF - если переносится на след строку
PF - позволяет удостоверится в четности числа
ZF - если послед операция заканч 0, сравнение
SF - проверка знаковой арифметики
DF - подсказывает каким образом инструкциям обработкам строк надо бежать
OF - устан если целочисленный результат слишком длинный в целевом операнде
**Регистры процессора х64**

Отличие **первая буква R** и размер 8 байт
R8-R15 - передача параметров внутри функции
RIP - текущая исполн иснтрукций
RFLAGS - проверка условий
**Арифметический операции**

ADD/SUB - сложение операндов/ Вычитание
MUL/DIV - умножение и деление
INC/DEC - использ для изменения true на false, 0 на
NEG - группа целочисленных сложений, обратная арифметика
CMP - сравнение
**Перемещение данных**

MOV - помещает значение
CMOVcc
XCHG - принимает 2 регистра на вход и меняет местами
MOVCc/MOVZx - разные значения, указываем с какими числ работаем
PUSH/POP - вещи связ с работой стека, пытается что то положить в стек/ снимается со стеака и складируется в какой то регистр
PUSHA/PUSHAD - (использ злоум) собир все состояние процессора и кладут на стек
POPA/POPAD - обратная операция - восстан состояние процессора
PUSHF/PUSHFD - отдельно кладется регистр флагов
POPF/POPFD - снимаем с нашего стека регистр флагов
**Обращение к памяти**


[EAX]Как только мы видим в инфу в скобочках - понимаем что оттуда считываются данные
[EBP + 0x20] -быстрый элемент обращения к функции
EAX - начало нашего массива
EBX - отвечает за массив, к которому мы хотим обратится
**Логические интсрукции**

AND - логическое и
OR - или
XOR - исключает или
NOT - конвертирует в числе 0 на 1
**Сдвиги бит**

SHL/SHR - сдвигают арифметически в ту или иную сторону
SAL/SAR - идентично с выше, работают арифм и явл прообразом умножением и делением числа на 2
ROL/ROR - сдвиг циклический влево или вправо. Сдвигаемые числа прибавляются либо слева, либо справа.
**Инструкции контроля управления**

JMP - безусловный переход
TEST - инструкция использ при сравнении. Берет за основу операцию логического И . Часто использ на предмет сравгнения с 0
Jcc - операции условных переходов (JLE)
LOOP - работало на основе регистра ecx, указ адрес на который нужно прыгать, если ecx != 0
CALL - предназ для вызова функции, перехода управления в некоторый блок кода (для нас важно)
RET - использ в конце функции, со стека прочитывает функцию call (для нас важно)
INT - представляет вызов некоторого прерывания. Связаны с аппаратными действиями ( нажатия клавиши, подключ доп элемента шины в юсб).
INT3 0xcc - представляет из себя брейкпоинт( как только доходит до этого - передает управление отладчику).
**Инструкции работы со строками**

MOVSc - копирует либо 1,2,4 байта из того что находится esi в edi
CMPSc- предназначена для сравнения байт, слова, двойного слова. Сравниваем с конкретным байтиком. Сравнивает с регистрами esi и edi.
SCASc - сравнивает на вхожнение элемента
LODSc
STOSc - байт word/dword - пересылает из регистра...
REP - повторяет любую из использ инструкций, либо пока использ ecs
**Общие инструкции**

LEA - вычисляет эффект адрес смещения операнда источника команды и сохран в регистр, обратн операция взятия региистра в скобочки
NOP - в холостую прогоняет процесс. В байтовом представлении представл 0х90
UD2 - неопределенная операция, генерирует особую ситуацию для процессора в неопределенный код. Использ для аналога события отладки
CPUID - выдает некоторое захордкоженное в процессоре значение, которые отвечают за описание создантеля процессора, версии и тд.
## Синтаксис

## Cтек

Return adress - адрес возврата функции
ebp - отвечает за обращ к локальным переменным и входным параметрам
## Соглашение о вызовах
нужно для того чтобы заранее знать какие параметры передаем, кто заботится о целостности стека
**Пролог функции**


cdecl - основное соглаш о вызовах, использ для компилятора С. Аргументы передаются справа налево. Очистку стека производит вызывающая программа.
stdcall/winapi - соглаш о вызовах принятое в винде по умолччанию, все библиотечн функции поддерживают. Передаются справа налево. Но очистку стека производит вызывающ программа.
fastcall - общее назв соглаш передающ параметров о регистрах. Если заинтересованы в бысстроте наших функций. Для коротеньких функций.
thiscall - часто использ в компиляторах на плюсах. Прообраз указателя this.
Когда выполн та или иная фукнция - результат выполнения помещается в регистр EAX.
**cdecl**

**stdcall/winapi**

**fastcall**

## NASM

компилятор который из исходного кода ассемблера создаст ехе
(может пригодится для создания шелл кода)
Можно использрвать линкер golink
## получение информации о процессе

FS[0x18] - адрес запущенного процесса
FS[0x30] - откуда запущен процесс
PEB - можно получить список библиотек загруженных в процесс. Можно получить процесс kernel32.dll (самое важное) Как только нашли эту библиотеку - парсим 2 функции loadlibrary и getprocadress (для получения функции)
## Практика
**Crackme**

F12 - переходим на xor_string



f5 -запускаем

**import_by_hash**



Что произойдет в PEB ? - дз





Распарсили библиотеку kernel32.sll

с помощью такого алгоритма злоумышленник высчитывает хэш
# Занятие 4. Отладка с помощью x64gdb

**Интерфейс x64dbg**


INT3 - брейкпоинт
System Breakpoint - перехват библиотек
TLS Callbacks - метод который работает в многопоточн приложениях, обратный метод работы TLS функций(инициализирование потоков нашего процесса)
Запускаются до первой стартовой функции Entry Breakpoint
Entry Breakpoint - на уровне парсинга исполн файлов отследим события маин. ДЛя нас важный брейкпоинт
Dll Entry - будем врубатся во все длл ентри. Может понадобится только если работаем с малварной библиотекой
attach Breakpoint - будут устан, когда у нас есть уже запущенный процесс, чтобы прорваться в функции, переведет в системные функции коннекта к живому процессу. Полулим процесс в замороженном состоянии.
**параметры работы**

**старт работы**

Если мы наставили процессов - то надо убрать их
**Горячие клавиши отладки**

**точки останова**

как только видим 0хсс - понимаем что программу отлаживают - программный брейкпоинт (можно поставить неограниченное кол-во ) ставится внутри процесса, переписывается 1 байт
Можем поставить условно на область памяти ( можно выделить 2 способами: HeapAlloc, VirtualAlloc (создает участки памяти в неразмеченной области процесса))
Если увидели virtualAlloc - высокая вероятность что злоум запишет туда код
Аппаратные брейкпоинты - набор системных регистров, можем записать адрес. Есть 4 адреса - куда можем переместить процесс.

f2 - аппаратный брейкпоинт

**Поиск элементов**

![Uploading file..._2sgz4z9dn]()
**Декомпеляция**

Надо поставить плагин snowman для декомпиляции

**Стек вызовов**
![Uploading file..._fp2ntsly1]()
**Изменение кода**

NOP - холостая работа процессора
**Изменение регистров**

**Переименование**

**карта памяти**

сюда попадают все участки виртуального адресного пространства, но те цчастки которые отображаются в физической оперативе
**Установка плагинов**

практика

сtrl+g = переходит в интерес место
# Занятие 5. Отладка с помощью IDA Pro


## Интерфейс IDA Pro
**анализ файла**

**параметры работы**

**Просмотр кода**

**Просмотр данных**

**Используемые функции**

**Натсройка рабочего стола**

полезная клавиша - ида про распарсит все имещ строки **shift+f12**
Segments
**Используемые строки**

**Поиск элементов**

%s - показатель что злоумышленник будет собирать голый сокет.
**Перекрестыне ссылки - X**

shift+f12 - строки (strings вкладка)
x HotKey -
**Переименование элементов - N**

**Работа с кодом и данными**

Для построения ассемблерного листинга - нам нужно получать начальный адрес, по этому может понадобится преобразование кода в данные.
Пробежит по внутренностям и найдет внутренние переменные и смодет представить - гор клавиш Р.
Y - изменяет определение функции
**Массивы**

и
**Структуры**


**Создание снимка базы данных**





Характерен для получения РЕВ

Ins - создание структуры в дебаге
С чего начинать анализ:
[21:37] Алексей Поляков
CreateProcess
[21:37] Алексей Поляков
WinExec
[21:37] Алексей Поляков
ShellExecute
Низкоуровневый анализ малварь -
[21:59] Алексей Поляков
OpenProcess
[21:59] Алексей Поляков
WriteProcessMemory
# Занятие 6. Техники злоумышленников 1.

**Техники mitre**


**Тактика создания ресурсов атаки**

**Техники первоначального доступа**

**Техники на уровне анализа**

**Native API**

как только видим данную функцию - ставим брейкпоинт
create_suspended - запуск процесса в замороженном исполнении



**Планировщики задач**

**Функции позвол зломышл техники связ с работой служб**


**Инструмент Process Explorer**

**Тактика закрепления**

**реестр** находится в папке windows system32




для злоумышл важна функция

**места в реестре для автозапуска**


**системные службы - фоновые процессы**

sc - модификация списка служб

**техники повышения привилегий**

**api monitor**




**инъекции dll**


**внедрение в сторонний процесс**





практика

[21:12] Алексей Поляков
OpenSCManager
[21:13] Алексей Поляков
CreateService
[21:28] Алексей Поляков
NtUnmapViewOfSection
[21:28] Алексей Поляков
VirtaulAllocEx
[21:28] Алексей Поляков
VirtualAllocEx
[21:29] Алексей Поляков
WriteProcessMemory
[21:30] Алексей Поляков
SetThreadContext
[21:30] Алексей Поляков
ResumeThread
[21:56] Алексей Поляков
ctrl+d - все библиотеки в process explorer для выбранного файла
ctrl+e
# Занятие 7. Техники злоумышленников 2.

**утилиты**

**Полезные строки в бинаре**


хэш 0b6cd05bee398bac0000e9d7032713ae2de6b85fe1455d6847578e9c5462391f

**netsh**

41528a567e800c103b2d39f36dc85f0e4b5bee67879b71ef4666561c9124c84b

**техники проксирования**

regsvr32 - консольная утилита установки библиотек, обращение к длл по урлу.
rundll32 - можно запустить ехе, чтобы не палился при запуске

41528a567e800c103b2d39f36dc85f0e4b5bee67879b71ef4666561c9124c84b

21e64d764e3f5cbd028861156263dde446be46efa21304ecb6f07a6dc570b2d7

[19:50] Алексей Поляков
bcc62288a4c47f7e6f9673e25398d67561b5023a285a84bf868601138bd1efbf

## Попытки получения учетных данных

Input Capture - что нажимает атакуемый

91a52a793a152130c83797d84261c5e28764371c1011d98dfbae2e018e30f235 -> test.exe
Api Monitor


[20:06] Алексей Поляков
SetWindowsHookEx
[20:06] Алексей Поляков
GetAsyncKeyState

**OS Credential Dumping**


## Техники исследования окружения

**функции для реализации**

findFirstFile - снимок изначальный каталога
findNextFind - рекурсивно пробегаемся по дереву и получаем инфу о файловой системе




[20:30] Алексей Поляков
67dc5aa989ff3713103a0b2e53bacaa33e7a4c8a01626c40dc93ccf2dc96b0a4
test2.exe

FindFirstFile
FindNextFile



**попытка получения инфы о процессах**



1cv8c.exe
CreateToolhelp32Snapshot


**получение списка процессов**

f3176cc05e8d426b45711db5786e2f0e91cf1f3a82c2e6539627f3889a6818a7


**получение списка установленных приложений**


с помощью reg query можно получить список приложений
**техники связ с получением информации**

systeminfo - общая инфа о системе

**Получение сетевого окружения**

nbtstat- получние инфы о нет биос
arp - соответствие мак адресов и айпи ( куда коннектился пользователь)
route - роутинг
net config workstation -
netsh - интерфейсы на данной машине
**Получение инфы о текущем соединении**



**Техники передачи данных**

http,https,tsp,udp
**протоколы уровня приложений**




**Не связаны с уровнем приложения**




[21:47] Алексей Поляков
b0370f6376a5d16699031da048baac609701015f5890c46291736206191087db
InternetOpen
InternetConnect

HttpOpenRequest
InternetOpenUrl

**Нанесение вреда машине**
Деструктивное изменение данных
Получение импакта к доступу к шифрованию

wbadmin - вычисляет каталоги по восстановлению
bcdedit - точки восстановления

**встроенные шифровальщики**




# Занятие 8. Антиотладка. Запаковка.


**Антидизассемблирование**

**противоположные переходы по одному адресу**

Переходы по всегда выполнимому условию

невозможность дизасма

FF - является -1 в байтовой ...
llvm clang - низкоуровневая виртуальная машина помогающая вставлять мусорные действия и интсрукции, которые не изменяют внутренности приложения

**дополнительные трюки**

## Поиск средств анализа и окружения


Процессы и окружение


Горячая клавиша Х - показывает где еще отображает эти функции
u - cнимает с адреса
с - восстанавливает отчет
**SEH**https://www.exploit-db.com/docs/english/17505-structured-exception-handler-exploitation.pdf
## антивиртуализация

## Обфускация

## Запаковка и зашифровка







# Занятие 9. IOC. YARA правила. Примеры атак на ПО.

**Индикаторы компрометации**

Атомарные
исчисляемые индикаторы
Поведенческие
**Поставщики форматов**

**oenIOC**


**YARA**


шифровальщик логики


использование к обращению к памяти процессов

практика



## Примеры атак на ПО



# 10 Тестирование
хэш суммы, название
закрепление - таск шедулер, службы и тд
работа сети, управление вредоносом. Подвсечивание доменов, портов, урлов
специфич названия файла, процессов, объектов системы с котор работает малварь