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


Идентификация аргументов функций - часть 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-у следовало бы определиться:

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

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




- Начало -  - Назад -  - Вперед -