Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исполнение кода из памяти 
:(
    Опции темы
Morinehtar
Дата 27.5.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.5.2011

Репутация: нет
Всего: нет



Ребятушки, возник такой вопрос....
Есть простенький код, который работает:

Код

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
buf: array[1..1000] of byte;
n:Integer;
implementation

{$R *.dfm}

Procedure incr;
Begin
n:=n+1;
End;

Procedure _Print;
Begin
Form2.Edit1.Text:=inttostr(n);
End;

procedure TForm2.Button1Click(Sender: TObject);
begin
incr;
_print;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
p:TProcedure;
begin
copymemory(@buf[1],@incr,Integer(@_Print)-Integer(@incr));
@p:=@buf[1];
p;
_print;
end;

end.


Чуток меняем одну процедуру:

Код

Procedure incr;
Begin
n:=n+1;
ShowMessage('rtg');
End;

И он чудесным образом перестаёт работать (Нарушение доступа) . Подскажите, может кто знает... 
Почему он перестаёт работать? Где можно прочитать об этом поподробнее?

В приложении скрины отладчика.
На левой картинке сам буфер с процедурой, место перехода на вторую картинку отмечено красным.
На правой картинке отмечено место вызывающее нарушение доступа. Он вылетает на переходе, не переходя.



Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  3.JPG 45,84 Kb
PM MAIL   Вверх
Dik0n
Дата 27.5.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(Morinehtar @  27.5.2011,  08:52 Найти цитируемый пост)
И он чудесным образом перестаёт работать (Нарушение доступа)

И правда, чудеса да и только smile

А если серьезно, кто так делает
во первых
Код выполняется на странице не имеющей атрибута на исполнение, ну да ладно это пол беды.
во вторых
вызов CALL указывает уже не на ShowMessage а черт знает куда, в связи с относительной адресацией.

Цитата(Morinehtar @  27.5.2011,  08:52 Найти цитируемый пост)
Где можно прочитать об этом поподробнее?

Гугли: Относительная адресация

Советую почитай, много познавательного http://wasm.ru/



Это сообщение отредактировал(а) Dik0n - 27.5.2011, 15:15
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
bems
Дата 28.5.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Dik0n @  27.5.2011,  15:12 Найти цитируемый пост)
Код выполняется на странице не имеющей атрибута на исполнение
это же просто чтение на х86



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dik0n
Дата 28.5.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(bems @  28.5.2011,  07:45 Найти цитируемый пост)
это же просто чтение на х86

какое же это чтение, внимательно смотрим на тему топика.
тут копируется полностью процедура в свой буфер и из него запускается!
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
CodeMonkey
Дата 28.5.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(bems @  28.5.2011,  08:45 Найти цитируемый пост)
это же просто чтение на х86


Just follow the rules, nobody gets hurt.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
500mhz
Дата 28.5.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



код в сегменте read/write будет спокойно запускаться, не нада никаких virtualprotect
у ТС именно проблема с адресацией


--------------------

PM MAIL ICQ   Вверх
bems
Дата 28.5.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Dik0n @  28.5.2011,  10:03 Найти цитируемый пост)
тут копируется полностью процедура в свой буфер и из него запускается! 
верно. Но на х86 исполнение разрешено если разрешено чтение

Цитата(CodeMonkey @  28.5.2011,  10:49 Найти цитируемый пост)
Just follow the rules, nobody gets hurt. 

я вообще так не делаю, мне это не говори smile (совсем другое дело получить доступ на запись туда откуда разрешено выполнение)
Я только сказал что в этом причины эксцепшна быть не может.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
500mhz
Дата 28.5.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



проблема эксцепшина что ShowMessage('rtg') вызываеться не по абсолютному адресу
в асм листинге это должно выглядить примерно так

push ptr rtg
mov eax,ShowMessage
call eax

смотря опять же как ShowMessage сделано (я в дельфи не силен)
может быть вариант mov eax,[ShowMessage]


--------------------

PM MAIL ICQ   Вверх
CodeMonkey
Дата 28.5.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(bems @  28.5.2011,  16:04 Найти цитируемый пост)
Я только сказал что в этом причины эксцепшна быть не может


Почему не может-то? DEP если включён - будет вылет.

Или ты в том смысле, что это не исключение, а именно завершение программы? Ну так автор и не говорил, что у него именно исключение.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
500mhz
Дата 28.5.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



CodeMonkey
вы о чем? проблему то уже решили - адресация
Цитата

И он чудесным образом перестаёт работать (Нарушение доступа) 

а это как раз эксцепш, и если он не обрабатываеться то будет сам понимаете что.


--------------------

PM MAIL ICQ   Вверх
bems
Дата 28.5.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(CodeMonkey @  28.5.2011,  16:28 Найти цитируемый пост)
DEP если включён - будет вылет.
поправочка, аппаратный DEP

Цитата(CodeMonkey @  28.5.2011,  16:28 Найти цитируемый пост)
Ну так автор и не говорил, что у него именно исключение. 
говорил что AV



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Morinehtar
Дата 3.6.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.5.2011

Репутация: нет
Всего: нет



500mhz
Dik0n
Цитата

проблема эксцепшина что ShowMessage('rtg') вызываеться не по абсолютному адресу

Цимес в том, что вылетает внутри ShowMessage, а сам асм-код ShowMessage я сравнивал с  кодом при нормальном вызове - абсолютно идентичен.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.