Различия
Показаны различия между двумя версиями страницы.
| reverseenengineering:функции [2025/06/23 23:56] – создано Lex | reverseenengineering:функции [2025/07/16 22:27] (текущий) – Lex | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Функции ====== | + | ====== |
| + | |||
| + | ===== Введение ===== | ||
| + | |||
| + | Знание и распознавание этих функций критически важно: | ||
| + | * для сокращения времени анализа; | ||
| + | * для распознавания поведения программы; | ||
| + | * для идентификации точек взаимодействия с ОС и API; | ||
| + | * для обхода обфускации и упаковки. | ||
| + | |||
| + | ===== Категории часто встречающихся функций ===== | ||
| + | |||
| + | ==== 1. Стартовые функции CRT (C Run-Time) ==== | ||
| + | Эти функции запускают основную программу. | ||
| + | |||
| + | ^ Название ^ Назначение ^ | ||
| + | | `_start` / `__libc_start_main` | Начальная точка C-программы (Linux) | | ||
| + | | `mainCRTStartup` | Точка входа в Windows-программе (console) | | ||
| + | | `WinMainCRTStartup` | Точка входа в Windows-программе (GUI) | | ||
| + | | `__main` / `__init` | Инициализация глобальных переменных и конструкций до вызова `main` | | ||
| + | |||
| + | Обычно после запуска этих функций вызывается `main` или `WinMain`. | ||
| + | |||
| + | ==== 2. Стандартные функции языка C ==== | ||
| + | |||
| + | ^ Функция ^ Назначение ^ | ||
| + | | `malloc`, `calloc`, `realloc`, `free` | Выделение и освобождение памяти | | ||
| + | | `memcpy`, `memset`, `memcmp` | Работа с памятью | | ||
| + | | `strlen`, `strcpy`, `strncpy`, `strcat` | Работа со строками | | ||
| + | | `printf`, `sprintf`, `puts`, `putchar` | Вывод | | ||
| + | | `scanf`, `gets`, `fgets` | Ввод | | ||
| + | | `exit`, `_exit`, `abort` | Завершение работы программы | | ||
| + | | `atoi`, `atof`, `itoa` | Преобразование типов | | ||
| + | | `time`, `gettimeofday`, | ||
| + | |||
| + | ==== Пример анализа: | ||
| + | |||
| + | < | ||
| + | mov ecx, [esp+8] | ||
| + | mov esi, [esp+4] | ||
| + | mov edi, [esp] ; назначение | ||
| + | rep movsb ; копирует ECX байт из ESI в EDI | ||
| + | </ | ||
| + | |||
| + | ==== 3. Windows API функции ==== | ||
| + | |||
| + | ^ Функция ^ Назначение ^ | ||
| + | | `CreateFileA/ | ||
| + | | `GetModuleHandle`, | ||
| + | | `VirtualAlloc`, | ||
| + | | `LoadLibrary`, | ||
| + | | `CreateProcess`, | ||
| + | | `MessageBoxA/ | ||
| + | | `GetTickCount`, | ||
| + | | `RegOpenKey`, | ||
| + | |||
| + | ==== Пример: | ||
| + | |||
| + | < | ||
| + | push 0 ; MB_OK | ||
| + | push offset szTitle ; " | ||
| + | push offset szText | ||
| + | push 0 ; NULL hWnd | ||
| + | call MessageBoxA | ||
| + | </ | ||
| + | |||
| + | ==== 4. POSIX/ | ||
| + | |||
| + | ^ Функция ^ Назначение ^ | ||
| + | | `open`, `read`, `write`, `close` | Работа с файлами | | ||
| + | | `fork`, `execve`, `exit`, `wait` | Работа с процессами | | ||
| + | | `mmap`, `munmap`, `brk` | Работа с памятью | | ||
| + | | `socket`, `bind`, `connect`, `recv`, `send` | Сетевое взаимодействие | | ||
| + | | `strace`, `ptrace` | Отладка и трассировка | | ||
| + | |||
| + | ==== 5. Часто используемые функции в malware и RCE ==== | ||
| + | |||
| + | ^ Функция ^ Назначение ^ | ||
| + | | `VirtualAlloc` + `memcpy` + `CreateThread` | Загрузка shellcode | | ||
| + | | `GetProcAddress` + `LoadLibrary` | Импорт функций во время выполнения | | ||
| + | | `IsDebuggerPresent`, | ||
| + | | `NtQueryInformationProcess` | Сбор информации о процессе | | ||
| + | | `Sleep`, `RDTSC`, `GetTickCount` | Замедление исполнения, | ||
| + | | `SetUnhandledExceptionFilter` | Обход отладчиков через SEH | | ||
| + | | `CreateRemoteThread` + `WriteProcessMemory` | Инъекция в другой процесс | | ||
| + | |||
| + | ===== Распознавание функций ===== | ||
| + | |||
| + | ==== Подписи (Function signatures) ==== | ||
| + | * Используются в **IDA**, **Ghidra**, **Binary Ninja** — с помощью **FLIRT-сигнатур** (Fast Library Identification and Recognition Technology) | ||
| + | * Позволяют автоматически распознать стандартные функции по шаблонам байт-кода | ||
| + | |||
| + | ==== Динамическое поведение ==== | ||
| + | * Поведение можно наблюдать в отладчике: | ||
| + | * Параметры передаются через стек или регистры (в зависимости от calling convention) | ||
| + | * Возвращаемое значение — обычно в `EAX`/ | ||
| + | |||
| + | ==== Calling conventions ==== | ||
| + | |||
| + | ^ Тип ^ Описание ^ | ||
| + | | `cdecl` | Параметры передаются через стек, вызывающий очищает стек | | ||
| + | | `stdcall` | Параметры передаются через стек, вызываемая очищает стек | | ||
| + | | `fastcall` | Первые параметры — в регистрах (ECX, EDX), остальные — в стеке | | ||
| + | | `thiscall` | Используется для C++ методов: | ||
| + | |||
| + | ===== Практические советы ===== | ||
| + | |||
| + | * **Не тратьте время на стандартные функции** — если распознана `memcpy`, переходите к тому, **что она копирует** | ||
| + | * **Отмечайте часто встречающиеся шаблоны** — например, | ||
| + | * **Используйте cross-references (XREFs)** — для поиска, | ||
| + | * **Анализируйте не только функции, | ||
| + | |||
| + | ===== Заключение ===== | ||
| + | |||
| + | Понимание стандартных функций, | ||
| + | |||
| + | ===== Полезные ресурсы | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||