Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Команда ENTER; вопросы.
Посл.ответ Сообщение

Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 апреля 2006 16:25
· Личное сообщение · #1

Мое почтение всем.

Разбираю команду enter и стековые кадры, по книге Григорьева.

Не совсем понятна работа вложенной формы команды.
В случае уровня 1 команда ENTER только распределяет в стеке запрошенную динамическую память, т.к. предшествующего индикатора для копирования нет.
Пробую такой код:

enter 0, 1
call ENTER_l2
leave

Регистры перед enter:
EBP: 0x12FF80
ESP: 0x12FF18
После:
EBP: 0x12FF14 ;как и ожидалось
ESP: 0x12FF10 ;вот тут не понял, должно же быть ESP == EBP!

Т.е. почему-то в индикатор лег еще и EBP ТЕКУЩЕЙ ф-ии, а не только вызывающей. Это, как я понимаю, противоречит цитате. Да и не совсем понятно зачем он там нужен.

Есть еще пара вопросов по этой команде, но, возможно, сам пойму когда с этим вопросом разберусь.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 18 апреля 2006 20:45
· Личное сообщение · #2

Всё нормально. После {ENTER 0,1} разность между EBP и ESP составляет 4 байта, что соответствует уровню вложености равному единице, т.к. в эти 4 байта пишеццо значение старого EBP, а памяти под переменные выделяеццо ноль.
На каждый уровень вложенности требуется 4 байта, для сохранения каждого прежнего EBP. Таким образом, для ENTER X,Y выделяется X байт под локальные переменные + 4*Y под EBP.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2006 00:21
· Личное сообщение · #3

Видимо, я что-то недопонимаю. Зачем писать 2 раза EBP? Т.е. сначала будет выполнено

push ebp

а потом будет произведено копирование индикатора (в "ENTER 1, 0" копирования происходить не должно, как я понимаю). Еще не ясно, каким образом происходит определение, с какого лексического уровня был произведен вызов? Это входит в компетенцию процессора?



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 апреля 2006 22:22
· Личное сообщение · #4

Такъ, пардон, ошибочка вышла. Мозг не обратил внимания на строчку:

push frame_ptr

после копирования указателей стековых кадров. С ней все встало на свои места


 eXeL@B —› Программирование —› Команда ENTER; вопросы.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати