mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
140 lines
8.1 KiB
Markdown
140 lines
8.1 KiB
Markdown
# Загальні 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}}
|