|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 26, 2004 16:27:31 Встретил только что вот такую штуку: push dword ptr [edi] mov byte ptr [edi], 0C3h call edi pop dword ptr [edi], и теперь не могу понять, что эта штука делает. Точнее, умом-то я понимаю, что не должна она ничего делать, но всё равно сомневаюсь. Могут ли быть случаи, когда такой код нельзя "безболезненно" игнорировать? Один такой случай я представляю (исключение при доступе к [edi]), здесь дело точно не в этом. В чем еще может быть смысл такого кода, кроме простых попыток (кстати, успешных) заморочить голову? |
|
|
Дата: Апр 26, 2004 20:33:24 Этот код не только записывает в [ESP-4] содержимое [EDI], еще и в [ESP-8] адрес инструкции POP Возможно еще, что исключение при доступе к [EDI] будет при execute, а не при записи. |
|
|
Дата: Апр 26, 2004 21:19:52 [S_T_A_S_: еще и в [ESP-8] адрес инструкции POP] Дык он записывает адрес POP c помощью call edi, а по адресу в edi ставит ret 0, коим этот адрес сразу со стека и снимает, так что смысла я не вижу в этом.... хммм... или чего-то непонял :))) |
|
|
Дата: Апр 27, 2004 01:20:44 Никак RET его не снимает. Число записано в память, там и остается. Пока не записать туда другое число. Возможно, вызывается обработчик исключения, и ему передается [EDI] как параметр. Который там еще и изменится. Хотя тут сложно что-то без контекста утверждать. |
|
|
Дата: Апр 27, 2004 03:12:56 · Поправил: Dr.Golova Это вовсе не "патч самого себя" - это весьма стандартная попытка "обмануть" generic трейсеры/дамперы - если edi указывает в первую секцию PE файла, то не умный трейсер может подумать что это вызов OEP и попытаться снять и реконструировать дамп (который будет в этот момент естесно мертвым) Конкретно описанная конструкция характрена для AS и компании. Учите мат часть кароче, и не забивате себе мозги размышлениями о том какие адреса сохраняет этот вызов - это фуфло и провокация :) |
|
|
Дата: Апр 27, 2004 10:42:00 S_T_A_S_ Никакие обработчики исключения не установлены, никакие отладочные регистры не используются, и так далее, и так далее... Dr.Golova Насчет AS - ты знал, ты знал! Вот только указывает edi не в первую секцию файла, да и вообще не в секцию файла - а в выделенный (и частично заполненный кодом) буфер. Хотя... пожалуй, и тут ты прав - смещение внутри буфера равно 0x1000 :) Насчет фуфла и провокации - это понятно. А вот зачем такая провокация нужна - большое спасибо за разъяснения. Насчет матчасти - можно уточнить, о чем идет речь? А то я тут как пещерный человек, все по старинке, в лоб... уже 11 скриптов для иды написал :) И, если верить моей интуиции, их еще как минимум штук 30 написать придется :( P.S. Получается, что ни о каком конвеере речи даже не идет. Если бы конвеер заранее загружал команду по адресу edi, то все это дело падало бы очень громко :) P.P.S. Однако, с выходом SP2 для XP всем пользователям AS несладко придется - это же придется обновить версию протектора, потом перепаковать свои продукты, потом раздать их честным обиженным клиентам... ;-D |
|
|
Дата: Апр 27, 2004 11:55:19 Касательно SP2 - я думаю очень многие протекторы так работают, как SP2 просто не позволит работать. Тот же самый lm и прочая и прочая. Ох чуствую будет большая буря... А многие софтверные гиганты - к примеру Quest, DiscussData и NetIQ используют эти протекторы. Так что мелкософту, если все будет так как там написано придется несладко. |
|
|
Дата: Апр 27, 2004 12:51:50 RobinFood Мои коментарии относились не к конкретному применению этого кода, а к этому: понимаю, что не должна она ничего делать Т.е. я просто хотел сказать, что код меняет 8 байт в памяти. То, что это фуфло и провокация - другое дело :) и о каком конвеере речи даже не идет Да. Хотя процессоры могут выполнять команды out of order, здесь выполняют сначала MOV, а потом CALL. Поскольку есть зависимость - результат выполнения 2й команды зависит от первой. |
|
|
Дата: Апр 27, 2004 13:08:53 S_T_A_S_ А! Наконец-то до меня дошло, о чем ты. Этот код меняет 8 байт на стеке :) Ну, в данном случае это не страшно. Да и я уже очень давно не видел (если вообще видел когда-либо) извращений с использованием "неиспользуемых" участков стека, т.е. кода наподобие sub esp, 0x100 push eax add esp, 0x104 mov ebx, [esp-0x104] |
|
|
Дата: Апр 27, 2004 16:08:51 Это хорошо, что не страшно :) Просто в последнем примере DWORD заносится явно, а в первом - один явно, а второй нет. ЗЫ А как давно я таких вещей не видел :( Так и хочется порой что-нибудь "поисследовать" |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107 |