====== Reverse Engineering: анализ стандартных функций в дизассемблировании ======
===== Введение =====
Знание и распознавание этих функций критически важно:
* для сокращения времени анализа;
* для распознавания поведения программы;
* для идентификации точек взаимодействия с ОС и 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`, `clock` | Работа со временем |
==== Пример анализа: memcpy ====
mov ecx, [esp+8] ; длина копируемых данных
mov esi, [esp+4] ; источник
mov edi, [esp] ; назначение
rep movsb ; копирует ECX байт из ESI в EDI
==== 3. Windows API функции ====
^ Функция ^ Назначение ^
| `CreateFileA/W`, `ReadFile`, `WriteFile`, `CloseHandle` | Работа с файлами |
| `GetModuleHandle`, `GetProcAddress` | Работа с загрузкой DLL |
| `VirtualAlloc`, `VirtualFree` | Работа с виртуальной памятью |
| `LoadLibrary`, `FreeLibrary` | Загрузка DLL |
| `CreateProcess`, `ExitProcess`, `TerminateProcess` | Работа с процессами |
| `MessageBoxA/W` | Простое графическое окно |
| `GetTickCount`, `QueryPerformanceCounter` | Работа со временем |
| `RegOpenKey`, `RegSetValue`, `RegQueryValue` | Работа с реестром |
==== Пример: вызов MessageBoxA ====
push 0 ; MB_OK
push offset szTitle ; "Hello"
push offset szText ; "World"
push 0 ; NULL hWnd
call MessageBoxA
==== 4. POSIX/Linux-системные вызовы ====
^ Функция ^ Назначение ^
| `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`, `CheckRemoteDebuggerPresent` | Антиотладка |
| `NtQueryInformationProcess` | Сбор информации о процессе |
| `Sleep`, `RDTSC`, `GetTickCount` | Замедление исполнения, антианализ |
| `SetUnhandledExceptionFilter` | Обход отладчиков через SEH |
| `CreateRemoteThread` + `WriteProcessMemory` | Инъекция в другой процесс |
===== Распознавание функций =====
==== Подписи (Function signatures) ====
* Используются в **IDA**, **Ghidra**, **Binary Ninja** — с помощью **FLIRT-сигнатур** (Fast Library Identification and Recognition Technology)
* Позволяют автоматически распознать стандартные функции по шаблонам байт-кода
==== Динамическое поведение ====
* Поведение можно наблюдать в отладчике:
* Параметры передаются через стек или регистры (в зависимости от calling convention)
* Возвращаемое значение — обычно в `EAX`/`RAX`
==== Calling conventions ====
^ Тип ^ Описание ^
| `cdecl` | Параметры передаются через стек, вызывающий очищает стек |
| `stdcall` | Параметры передаются через стек, вызываемая очищает стек |
| `fastcall` | Первые параметры — в регистрах (ECX, EDX), остальные — в стеке |
| `thiscall` | Используется для C++ методов: `ECX` указывает на `this` |
===== Практические советы =====
* **Не тратьте время на стандартные функции** — если распознана `memcpy`, переходите к тому, **что она копирует**
* **Отмечайте часто встречающиеся шаблоны** — например, `push 0; call ExitProcess`
* **Используйте cross-references (XREFs)** — для поиска, где вызывается данная функция
* **Анализируйте не только функции, но и их аргументы** — например, вызов `VirtualAlloc` с флагами `0x1000` и `0x40` часто указывает на исполнение shellcode
===== Заключение =====
Понимание стандартных функций, их сигнатур и поведения критически важно при дизассемблировании. Это позволяет быстро отбрасывать "лишнее" и фокусироваться на пользовательской логике или вредоносной нагрузке. Используйте автоматические средства распознавания, сопоставление аргументов и следите за контекстом вызовов.
===== Полезные ресурсы =====
* https://ghidra-sre.org/
* https://x64dbg.com/
* https://learn.microsoft.com/en-us/windows/win32/api/
* https://man7.org/linux/man-pages/
* https://reverseengineering.stackexchange.com/
* https://www.hex-rays.com/products/ida/