reverseenengineering:функции

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

reverseenengineering:функции [2025/06/23 23:56] – создано Lexreverseenengineering:функции [2025/07/16 22:27] (текущий) Lex
Строка 1: Строка 1:
-====== Функции ======+====== 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/функции.1750697771.txt.gz
  • Последнее изменение: 2025/06/23 23:56
  • Lex