Функции, вызовы и строки в дизассемблере

Учимся выделять функции и находить строки — опорные точки анализа.

Пролог функции — несколько инструкций в начале, которые настраивают стек для локальных переменных.

Как узнать функцию

Функция обычно начинается с пролога и заканчивается эпилогом:

my_func:
    push rbp          ; пролог: сохранить старый базовый указатель
    mov  rbp, rsp     ; настроить кадр стека
    ; ... тело функции ...
    pop  rbp          ; эпилог: восстановить
    ret               ; вернуться к вызывающему

Инструкция ret в конце — явный признак конца функции. Вызов — call my_func.

Как передаются аргументы (x86-64)

В 64-битном коде первые аргументы передаются через регистры. На Linux (System V) порядок: rdi, rsi, rdx, rcx, r8, r9. Результат возвращается в rax. Зная это, можно понять, что передают в функцию.

    mov  edi, 5        ; первый аргумент = 5
    mov  esi, 3        ; второй аргумент = 3
    call add           ; вызвать add(5, 3)
    ; результат теперь в eax/rax

Строки — лучший друг реверсера

Текстовые строки («Введите пароль», «Доступ разрешён», имена файлов, URL) хранятся в данных и часто прямо подсказывают логику. В дизассемблере вызов вроде

    lea  rdi, [str_wrong_pass]   ; адрес строки "Wrong password"
    call puts

мгновенно говорит: рядом — проверка пароля.

Как работает под капотом: кадр стека

Пролог push rbp; mov rbp, rsp создаёт «кадр стека» — область для локальных переменных текущей функции. Через rbp к ним обращаются по смещениям ([rbp-4]). При ret процессор берёт со стека адрес возврата (его положил call) и продолжает оттуда.

Частые ошибки

  • Не замечать ret и «склеивать» две функции в одну.
  • Игнорировать строки — а они часто решают задачу.
  • Путать порядок регистров-аргументов на Windows и Linux (соглашения разные).

Итог

  • Функция: пролог (push rbp; mov rbp, rsp) … тело … эпилог + ret.
  • Аргументы в x86-64 Linux: rdi, rsi, rdx, rcx, r8, r9; результат в rax.
  • Строки рядом с кодом — мощная подсказка о его назначении.
Проверьте себя
1. Какая инструкция явно завершает функцию и возвращает управление вызывающему?
Apush
Bret
Ccmp
Dlea
2. Почему строки так полезны при анализе бинаря?
AОни ускоряют программу
BОни часто прямо подсказывают логику (сообщения, имена файлов) и расположение нужного кода
CОни содержат машинный код
DОни шифруют функции