Фундаментальные основы хакерства



         

Идентификация аргументов функций - часть 47


; Сохранение модифицируемых регистров

; Или – быть может, резервирование памяти под локальные переменные?

sub    esp, 4

; Вот это уж точно явное резервирование памяти под одну локальную переменную,

; следовательно, две команды PUSH, находящиеся выше, действительно сохраняют

; регистры.

mov    [esp+0Ch+var_C], 2

; Занесение в локальную переменную значения 2

mov    eax, offset a333 ; "333"

call   strlen_

; Обратите внимание – WATCOM передает функции strlen указатель на строку

; через регистр!

mov    ecx, eax

; Возращенное функцией значение копируется в регистр ECX.

; WATCOM

знает, что следующий вызов strlen

не портит этот регистр!

mov    eax, offset a1      ; "1"

call   strlen_

and    eax, 0FFh

; Поскольку strlen возвращает тип int, здесь имеет место явное преобразование

; типов: int -> char

mov    ebx, esp

; В EBX заносится указатель на переменную var_C

call   MyFunc

; Какие же аргументы передавались функции? Во-первых, EAX

– вероятно крайний

; левый аргумент, во-вторых, EBX – явно инициализированный перед вызовом

; функции, и, вполне возможно, ECX, хотя последнее и не обязательно.

; ECX

может содержать и регистровую переменную, но в таком случае вызываемая

; функция не должна к нему обращаться.

push   eax

push   offset asc_42000A ; "%x\n"

call   printf_

add    esp, 8

add    esp, 4

; А еще говорят, что WATCOM – оптимизирующий компилятор! А вот две команды

; объединить в одну, он увы не смог!

pop    ecx

pop    ebx

retn

main_        endp

MyFunc       proc near           ; CODE XREF: main_+33p

push   4

call   __CHK

; Проверка стека

and    eax, 0FFh

; Повторное обнуление 24-старших бит. WATCOM-у следовало бы определиться:

; где выполнять эту операцию – в вызываемой или вызывающей функции, но зато

; подобный "дублеж" упрощает восстановление прототипов функций




Содержание  Назад  Вперед