33
Ну что, юный падаван реверса, зачесались руки пощупать настоящий бинарник? Приготовился к битве с нулями и единицами? Отлично. Сегодня мы устроим тебе первое свидание с легендой – IDA Pro. Да, она выглядит как пульт управления звездолётом, который разбили об астероид, но не дрейф. Я покажу тебе, куда смотреть, чтобы не утонуть в этом океане ассемблерного кода. Помни, реверс – это не только мозг, это ещё и интуиция. И много, очень много кофе.
Точка входа (Entry Point): Сердце бинарника
Любой бинарник – это как дом. И у каждого дома есть парадный вход. В мире бинарников это называется Entry Point, или точка входа. Это первое место, куда ЦПУ ломанётся выполнять код. Если ты откроешь PE-файл (Windows-исполняемый файл), то IDA сама тебе покажет его. В Linux (ELF) это обычно _start
.
Как найти:
• В IDA Pro, она обычно сама на него прыгает.
• Если потерялся, глянь в окне Functions
(Shift+F3), там она обычно помечена специальным значком (звёздочка или стрелка).
• Ещё можно посмотреть в заголовке PE-файла. Возьми PE-bear или 010 Editor, открой бинарник и найди поле AddressOfEntryPoint
в IMAGE_OPTIONAL_HEADER
. Вот это число тебе и покажет, где оно в виртуалке начинается.
Что бросилось в глаза: Первые зацепки – Окна IDA, наши лучшие друзья
Ладно, ты открыл бинарник, и перед тобой каша из окон. Не паникуй. IDA – это швейцарский нож, в котором каждое лезвие для чего-то да нужно. Для начала сосредоточимся на главных
1. Functions window (Shift+F3): Карта дорог
• Представь, что ты попал в незнакомый город. Куда ты первым делом смотришь? На карту. Functions window
– это твоя карта. Здесь IDA перечисляет все функции, которые она смогла распознать в бинарнике. Это просто золото! Ищи функции с понятными именами типа main
, WinMain
, DialogProc
, sub_XYZ
(IDA сама их именует, если не знает имени), start
. Они часто указывают на интересные куски логики.
• Глубокий взгляд: Сортируй по размеру, по имени. Часто большие функции – это контроллеры или обработчики событий. Маленькие – это вспомогательные хелперы. Если видишь sub_401000
и вдруг MyCoolFunction
, знай, что это, скорее всего, экспорт, или она вызывается извне. Или это ты сам её так переименовал, хе-хе.
• Пример:
; Functions window
; Address Size Name
; ------------------------------------
; 00401000 1A _start
; 0040101A 5F _mainCRTStartup
; 00401079 E3 _WinMain
; 0040115C A5 sub_40115C
; 00401201 12 loc_401201
; ...
CreateProcess
рядом со строкой типа cmd.exe /c format c:
, то это уже серьёзный повод для беспокойства, бро.; Strings window (Shift+F12)
; Address Type Length String
; ---------------------------------------------
; 00405000 ASCII 12 "Hello, World!"
; 00405012 ASCII 18 "Error: Invalid License"
; 0040502A ASCII 25 "C:\Users\Public\backdoor.exe"
; 00405043 ASCII 20 "http://evil-c2.com/payload"
; ...
• Щелкни по строке, и IDA прыгнет в место, где она используется в коде. Это твой телепорт.
3. Imports window (Shift+F9): Что бинарник умеет делать
• Это список ‘чужих’ функций, которые бинарник тянет из DLL-библиотек системы. kernel32.dll
, user32.dll
, ws2_32.dll
– это классика. Если бинарник импортирует CreateRemoteThread
, WriteProcessMemory
, VirtualAllocEx
(из kernel32.dll
), то он, скорее всего, инжектит код. Если socket
, connect
, send
(из ws2_32.dll
), то он, мать его, общается по сети.
• Глубокий взгляд: Поищи подозрительные импорты. Например, из advapi32.dll
функции для работы с реестром (RegOpenKeyEx
, RegSetValueEx
). Из wininet.dll
– InternetOpen
, HttpSendRequest
. Чем экзотичнее или ‘мощнее’ импорты, тем больше шансов, что бинарник делает что-то интересное.
• Пример:
; Imports window (Shift+F9)
; Library Function
; ------------------------------------
; kernel32.dll CreateFileA
; kernel32.dll WriteFile
; kernel32.dll CreateProcessA
; ws2_32.dll socket
; ws2_32.dll connect
; ws2_32.dll send
; user32.dll MessageBoxA
; ...
4. Exports window (Ctrl+E): Что бинарник предлагает другим
• “Это, по сути, публичное API бинарника. Если это DLL, здесь будут функции, которые она ‘выставляет’ наружу для использования другими программами. Для EXE-шников это редко бывает интересно, если только это не какой-то хитрый упаковщик или плагин.
• Глубокий взгляд: Смотри на имена. `InstallHook`, `StartMaliciousService` – ну ты понял, да?
• Пример:
; Exports window (Ctrl+E)
; Ordinal Address Name
; ----------------------------------
; 1 00401000 MyExportedFunction
; 2 00401050 AnotherExport
; ...
Секции (Segments window): Расчленёнка бинарника
Каждый бинарник делится на секции, как на квартиры в доме. Секция .text
– это код, .data
– инициализированные данные, .rdata
– только для чтения данные (строки часто здесь). .bss
– неинициализированные данные. А вот если видишь секции с именами вроде .UPX0
, .sanco
или .rsrc
с необычно большим размером, это может быть признаком упаковщика или обфускации.
• Инструменты: IDA сама их покажет. Или можно глянуть с помощью PE-bear.
Deep Dive: Пример с UPX
Помнишь, я говорил про упаковщики? UPX – это классика. Многие малвари им запакованы.
• Как увидеть: Открываешь бинарник в IDA. Если он запакован UPX, то ты увидишь секции типа .UPX0
, .UPX1
. В начале кода (где-то возле Entry Point) будет виден специфический код распаковщика, который распаковывает оригинальный код в память.
• Что искать: Часто это последовательность инструкций: pushad
, потом какой-нибудь call
или jmp
, а потом popad
и jmp
на оригинальную точку входа. Задача этого кода – распаковать себя в память, а потом передать управление оригинальной программе.
• Трюк:
1. Запусти бинарник в отладчике (например, x64dbg).
2. Поставь брейкпоинт на pushad
.
3. Прогони код до popad
и jmp
.
4. После popad
ты обычно оказываешься на реальной точке входа распакованной программы. Дампни память, и получишь распакованный бинарник. Или используй специализированные анпакеры.
• Пример (псевдокод):
; IDA Pro view of UPX packed binary
.text:00401000 pushad ; Сохраняем регистры
.text:00401001 call loc_401006 ; Переходим к распаковщику
.text:00401006 pop ebp ; Получаем текущий EIP
; ... много кода распаковщика ...
.text:00401XXX popad ; Восстанавливаем регистры
.text:00401YYY jmp loc_OriginalEntryPoint ; Прыгаем на реальную точку входа
• Вот loc_OriginalEntryPoint
– это то, что тебе нужно! Если ты увидишь такой код, то знай – перед тобой упаковщик. А с упаковщиком мы разбираемся отдельными методами.
Заключение:
Ну вот, бро, ты только что совершил первое ‘свидание’ с IDA Pro. Да, это только верхушка айсберга, но ты уже знаешь, куда смотреть, чтобы не утонуть. Помни: Functions
– это карта, Strings
– сплетни, Imports
– возможности, Segments
– внутренности. И, конечно, всегда держи под рукой IDA Free или Demo, PE-bear для заголовков и x64dbg для динамического анализа. Практикуйся, и скоро ты будешь чувствовать себя в ассемблере как дома. И не забывай про кофе, его будет нужно много.