|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 19, 2003 11:29:27 Добрый день! Подскажите пожалуйста что содержит регистр EBP сразу после запуска программы. И зачем его сразу сохраняют в стек. Спасибо. |
|
|
Дата: Ноя 19, 2003 12:01:33 animator что содержит Значение установленное вызывающей подпрограммой. зачем его сразу сохраняют в стек Таковы правила игры в win32. Если твой код меняет содержимое одного из регистров: EBX, EDI, ESI, EBP, то необходимо их сохранять. |
|
|
Дата: Ноя 19, 2003 12:13:25 ... мне казалось при запуске любой Win32 программы EBP содержит что-то конкретное(или в EBP -остается всегда ). Мне просто хочется понять как сраатывает код получения delta - смещения. |
|
|
Дата: Ноя 19, 2003 12:53:54 animator Обычно через EBP организуют доступ к локальным переменным, поэтому он вполне конкретен для программы вызвавшей startproc. код получения delta - смещения Это откуда? Может быть все что я написал не в тему? |
|
|
Дата: Ноя 19, 2003 13:07:13 ... да нет все в тему подскажите пожалуйста как работает этот кусок кода CALL CallMe CallMe: POP EBP SUB EBP, OFFSET CallMe ; EBP -> delta |
|
|
Дата: Ноя 19, 2003 13:11:40 ... получается в EBP должен находиться адрес конца программы ( и начала стека )если смещение от начала программы находится таким вычитанием. Я правильно решил ответьте пожалуйста. |
|
|
Дата: Ноя 19, 2003 14:09:26 call пихает в стек адрес следующей инструкции,(pop ebp) pop его вынимает, а sub вычитает смещение этой самой инструкции. вот тебе и дельта... |
|
|
Дата: Ноя 19, 2003 14:14:34 Sickle ... спасибо! |
|
|
Дата: Ноя 19, 2003 15:30:08 носи на здоровье :) |
|
|
Дата: Ноя 19, 2003 15:53:15 ... извините за глупость всетаки хочу понять. Для того чтобы это работало нужно чтобы то что попало в стек после Call ,т.е. адрес следующей команды Call CallMe CallMe: было не равно Offset CallMe, но Следующая команда и лежит то по ссылке СаllMe. То есть результат SUB всегда будет =0. Но ведь в зараженных файлах он не равен 0. Вопрос как этот прием работает в вирусах.Еще раз извините. |
|
|
Дата: Ноя 19, 2003 18:39:00 смотри: 00000000: E80000 call 000000003 ; Next Next: 00000003: 665D pop ebp 00000005: 6683ED03 sub ebp,003 ;offset Next в ebp будет 0 только если начало кода находится по адресу 0. загрузи в любой другой адрес - он и окажется у тебя в ebp. понятно? |
|
|
Дата: Ноя 19, 2003 18:51:10 animator Все очень просто. Вирусу нужно узнать адрес, по которому он загрузился. Адрес этот лежит в EIP - и указывает на текущую команду. Взять бы его оттдуа, и нет проблем. Но доступа к EIP у программы нету (спасибо Интелу). Команда CALL делает слежующее: кладет в стек значение EIP, указывающее на следующую команду, и изменяет значение EIP - передавая управление в соотв. часть кода. Нормальная функция завершается командой RET, которая достанет из стека адрес возврата, и передаст управление по нему. А вирус делает вместо RET команду POP EBP (или любой другой регистр) - и получает значение EIP, которое сохранила команда CALL. Ну, а дальше вычисляется дельта-смещение: разница между текущим адресом и тем, который "планировался" при компиляции. |
|
|
Дата: Ноя 21, 2003 09:01:12 Sickle Grenader ... СПАСИБО за терпение, сейчас это редкость! Теперь понятно :)Значит всетаки EIP а не адресс. Я плохо слушал тему CALL RET. Вернусь к первоисточникам дабы не шокировать больше своей глупостью. Еще раз Вам спасибо. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097 |