hacktricks/src/reversing/common-api-used-in-malware.md

140 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Загальні API, що використовуються в шкідливому ПЗ
{{#include ../banners/hacktricks-training.md}}
## Загальні
### Мережа
| Сирі сокети | WinAPI сокети |
| ------------- | -------------- |
| socket() | WSAStratup() |
| bind() | bind() |
| listen() | listen() |
| accept() | accept() |
| connect() | connect() |
| read()/recv() | recv() |
| write() | send() |
| shutdown() | WSACleanup() |
### Постійність
| Реєстр | Файл | Служба |
| ---------------| ------------- | ---------------------------- |
| RegCreateKeyEx() | GetTempPath() | OpenSCManager |
| RegOpenKeyEx() | CopyFile() | CreateService() |
| RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
| RegDeleteKeyEx() | WriteFile() | |
| RegGetValue() | ReadFile() | |
### Шифрування
| Назва |
| --------------------- |
| WinCrypt |
| CryptAcquireContext() |
| CryptGenKey() |
| CryptDeriveKey() |
| CryptDecrypt() |
| CryptReleaseContext() |
### Анти-аналіз/VM
| Назва функції | Інструкції асемблера |
| --------------------------------------------------------- | --------------------- |
| IsDebuggerPresent() | CPUID() |
| GetSystemInfo() | IN() |
| GlobalMemoryStatusEx() | |
| GetVersion() | |
| CreateToolhelp32Snapshot \[Перевірка, чи запущено процес] | |
| CreateFileW/A \[Перевірка, чи існує файл] | |
### Непомітність
| Назва | |
| ------------------------ | -------------------------------------------------------------------------- |
| VirtualAlloc | Виділення пам'яті (пакувальники) |
| VirtualProtect | Зміна дозволів пам'яті (пакувальник надає дозвіл на виконання секції) |
| ReadProcessMemory | Ін'єкція в зовнішні процеси |
| WriteProcessMemoryA/W | Ін'єкція в зовнішні процеси |
| NtWriteVirtualMemory | |
| CreateRemoteThread | Ін'єкція DLL/процесів... |
| NtUnmapViewOfSection | |
| QueueUserAPC | |
| CreateProcessInternalA/W | |
### Виконання
| Назва функції |
| ---------------- |
| CreateProcessA/W |
| ShellExecute |
| WinExec |
| ResumeThread |
| NtResumeThread |
### Різне
- GetAsyncKeyState() -- Логування клавіш
- SetWindowsHookEx -- Логування клавіш
- GetForeGroundWindow -- Отримати назву активного вікна (або вебсайту з браузера)
- LoadLibrary() -- Імпорт бібліотеки
- GetProcAddress() -- Імпорт бібліотеки
- CreateToolhelp32Snapshot() -- Список запущених процесів
- GetDC() -- Скриншот
- BitBlt() -- Скриншот
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Доступ до Інтернету
- FindResource(), LoadResource(), LockResource() -- Доступ до ресурсів виконуваного файлу
## Техніки шкідливого ПЗ
### Ін'єкція DLL
Виконати довільну DLL всередині іншого процесу
1. Знайти процес для ін'єкції шкідливої DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
2. Відкрити процес: GetModuleHandle, GetProcAddress, OpenProcess
3. Записати шлях до DLL всередині процесу: VirtualAllocEx, WriteProcessMemory
4. Створити потік у процесі, який завантажить шкідливу DLL: CreateRemoteThread, LoadLibrary
Інші функції для використання: NTCreateThreadEx, RtlCreateUserThread
### Рефлексивна ін'єкція DLL
Завантажити шкідливу DLL без виклику звичайних API Windows.\
DLL відображається всередині процесу, вона вирішить адреси імпорту, виправить переміщення та викличе функцію DllMain.
### Викрадення потоку
Знайти потік з процесу та змусити його завантажити шкідливу DLL
1. Знайти цільовий потік: CreateToolhelp32Snapshot, Thread32First, Thread32Next
2. Відкрити потік: OpenThread
3. Призупинити потік: SuspendThread
4. Записати шлях до шкідливої DLL всередині процесу жертви: VirtualAllocEx, WriteProcessMemory
5. Відновити потік, що завантажує бібліотеку: ResumeThread
### Ін'єкція PE
Ін'єкція Portable Execution: Виконуваний файл буде записаний у пам'яті процесу жертви і буде виконаний звідти.
### Порожнє процесу
Шкідливе ПЗ видалить легітимний код з пам'яті процесу та завантажить шкідливий бінарний файл
1. Створити новий процес: CreateProcess
2. Видалити пам'ять: ZwUnmapViewOfSection, NtUnmapViewOfSection
3. Записати шкідливий бінарний файл у пам'ять процесу: VirtualAllocEc, WriteProcessMemory
4. Встановити точку входу та виконати: SetThreadContext, ResumeThread
## Хукінг
- **SSDT** (**System Service Descriptor Table**) вказує на функції ядра (ntoskrnl.exe) або драйвера GUI (win32k.sys), щоб користувацькі процеси могли викликати ці функції.
- Руткіт може змінити ці вказівники на адреси, які він контролює.
- **IRP** (**I/O Request Packets**) передають частини даних з одного компонента в інший. Практично все в ядрі використовує IRP, і кожен об'єкт пристрою має свою власну таблицю функцій, яку можна підключити: DKOM (Direct Kernel Object Manipulation).
- **IAT** (**Import Address Table**) корисний для вирішення залежностей. Можливо підключити цю таблицю, щоб перехопити код, який буде викликано.
- **EAT** (**Export Address Table**) Хуки. Ці хуки можуть бути виконані з **userland**. Мета - підключити експортовані функції бібліотек DLL.
- **Inline Hooks**: Цей тип важко досягти. Це передбачає модифікацію коду самих функцій. Можливо, шляхом вставлення стрибка на початку цього.
{{#include ../banners/hacktricks-training.md}}