Содержание

Reverse Engineering: анализ стандартных функций в дизассемблировании

Введение

Знание и распознавание этих функций критически важно:

Категории часто встречающихся функций

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)

Динамическое поведение

Calling conventions

Тип Описание
`cdecl` Параметры передаются через стек, вызывающий очищает стек
`stdcall` Параметры передаются через стек, вызываемая очищает стек
`fastcall` Первые параметры — в регистрах (ECX, EDX), остальные — в стеке
`thiscall` Используется для C++ методов: `ECX` указывает на `this`

Практические советы

Заключение

Понимание стандартных функций, их сигнатур и поведения критически важно при дизассемблировании. Это позволяет быстро отбрасывать «лишнее» и фокусироваться на пользовательской логике или вредоносной нагрузке. Используйте автоматические средства распознавания, сопоставление аргументов и следите за контекстом вызовов.

Полезные ресурсы