| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Исполнение кода из памяти |
| Автор: Morinehtar 27.5.2011, 08:52 | ||||
| Ребятушки, возник такой вопрос.... Есть простенький код, который работает:
Чуток меняем одну процедуру:
И он чудесным образом перестаёт работать (Нарушение доступа) . Подскажите, может кто знает... Почему он перестаёт работать? Где можно прочитать об этом поподробнее? В приложении скрины отладчика. На левой картинке сам буфер с процедурой, место перехода на вторую картинку отмечено красным. На правой картинке отмечено место вызывающее нарушение доступа. Он вылетает на переходе, не переходя. |
| Автор: Dik0n 27.5.2011, 15:12 |
И правда, чудеса да и только А если серьезно, кто так делает во первых Код выполняется на странице не имеющей атрибута на исполнение, ну да ладно это пол беды. во вторых вызов CALL указывает уже не на ShowMessage а черт знает куда, в связи с относительной адресацией. Гугли: Относительная адресация Советую почитай, много познавательного http://wasm.ru/ |
| Автор: bems 28.5.2011, 07:45 |
| это же просто чтение на х86 |
| Автор: Dik0n 28.5.2011, 10:03 |
какое же это чтение, внимательно смотрим на тему топика. тут копируется полностью процедура в свой буфер и из него запускается! |
| Автор: CodeMonkey 28.5.2011, 10:49 |
http://www.transl-gunsmoker.ru/2008/12/blog-post.html. |
| Автор: 500mhz 28.5.2011, 12:52 |
| код в сегменте read/write будет спокойно запускаться, не нада никаких virtualprotect у ТС именно проблема с адресацией |
| Автор: 500mhz 28.5.2011, 16:09 |
| проблема эксцепшина что ShowMessage('rtg') вызываеться не по абсолютному адресу в асм листинге это должно выглядить примерно так push ptr rtg mov eax,ShowMessage call eax смотря опять же как ShowMessage сделано (я в дельфи не силен) может быть вариант mov eax,[ShowMessage] |
| Автор: CodeMonkey 28.5.2011, 16:28 |
Почему не может-то? DEP если включён - будет вылет. Или ты в том смысле, что это не исключение, а именно завершение программы? Ну так автор и не говорил, что у него именно исключение. |
| Автор: 500mhz 28.5.2011, 17:08 | ||
| CodeMonkey вы о чем? проблему то уже решили - адресация
а это как раз эксцепш, и если он не обрабатываеться то будет сам понимаете что. |
| Автор: bems 28.5.2011, 20:38 |
| поправочка, аппаратный DEP говорил что AV |
| Автор: Morinehtar 3.6.2011, 09:35 | ||
| 500mhz Dik0n
Цимес в том, что вылетает внутри ShowMessage, а сам асм-код ShowMessage я сравнивал с кодом при нормальном вызове - абсолютно идентичен. |