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


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


; Уменьшаем EDX... Вы уже почувствовали, что мы имеем дело с циклом?

 

jns    short loc_4010D3

; вот – этот переход, срабатывающий пока EDX

не отрицательное число,

; подтверждает наше предположение о цикле.

; Да, такой вот извращенной конструкций Borland

передает аргумент - структуру

; функции по значению!

 

call   MyFunc

; Вызов функции... смотрите – нет очистки стека! Да, это последняя вызываемая

; функция и очистки стека не требуется – Borland

ее и не выполняет...

 

xor    eax, eax

; Обнуление результата, возращенного функцией. Borland

так поступает с void

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

; точнее: не они возвращают, а помещенный за их вызовом код, обнуления EAX

 

pop    edi

pop    esi

; Восстанавливаем ранее сохраненные регистры EDI

и ESI

 

mov    esp, ebp

; восстанавливаем  ESI, - вот почему стек не очищался после вызова последней

; функции!

 

pop    ebp

retn

_main        endp

Листинг 58

Обратите внимание – по умолчанию Microsoft C++ передает аргументы справа налево, а Borland C++ - слева направо! Среди стандартных типов вызов нет такого, который, передавая аргументы слева направо, поручал бы очистку стека вызывающей функции! Выходит, что Borland C++ использует свой собственный, ни с чем не совместимый тип вызова!

 

::адресация аргументов в стеке. Базовая концепция стека включает лишь две операции – занесение элемента в стек и снятие последнего занесенного элемента со стека. Доступ к произвольному элементу – это что-то новенькое! Однако такое отступление от канонов существенно увеличивает скорость работы – если нужен, скажем, третий по счету элемент, почему бы ни вытащить из стека напрямую, не снимая первые два? Стек это не только "стопка", как учат популярные учебники по программированию, но еще и массив. А раз так, то, зная положение указателя вершины стека (а не знать его мы не можем, иначе куда прикажите класть очередной элемент?), и размер элементов, мы сможем вычислить смещению любого из элементов, после чего не составит никакого труда его прочитать.




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



Книжный магазин