Показать страницуИстория страницыСсылки сюдаНаверх Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно. ====== 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 ==== <code> mov ecx, [esp+8] ; длина копируемых данных mov esi, [esp+4] ; источник mov edi, [esp] ; назначение rep movsb ; копирует ECX байт из ESI в EDI </code> ==== 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 ==== <code> push 0 ; MB_OK push offset szTitle ; "Hello" push offset szText ; "World" push 0 ; NULL hWnd call MessageBoxA </code> ==== 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/ reverseenengineering/функции.txt Последнее изменение: 2025/07/16 22:27 — Lex Войти