Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Очень интересный вопрос [Win95/98, WinME, NT4, Win2k, WinXP]


ctapik-net ©   (2002-11-14 20:34:00) 

Можено ли выделив часть памяти и записав в нее исполняемый код запустить на выполнение?


ctapik-net   (2002-11-17 09:50:00) [1]

Спасибо всем ответившим


SV   (2002-11-16 23:31:00) [2]

Купи RSDN Mag. #1 там как раз по теме.
Пример программы, перехватывающий вызовы апи, подменой точки вызова. Я так с сокетами забовлялся - перхватывал данные.
В MSDN смотри CreateRemoteThread.


Удачи
/SV/


Моджахед   (2002-11-16 20:22:00) [3]

2 Есть, однако, подводный камень - такой код должен перемещаемым (то есть, безразличным к адресу загрузки).

Собственно, это и есть самый главный подводный камень. И да, действительно, передать управление на "любую" выделенную область памяти (через GetMem) в чистом виде нельзя, поскольку, выделение памяти подразумевается только для данных, а не для кода.
Если впихнуть в стек, то разумеется, пройдет нормально (тут, впрочем, тоже есть камни). А есть еще способ не выделять память специально. Просто можно "перезатирать" память в своей области кода. Например, любую свою "фиктивную" процедуру можно забить чем угодно (лучше DB-шками, чтобы размер легче было вычислить).
Хотя, тут есть над чем подумать. Во всяком случае, этот метод я не использовал.
Впрочем, это все мелочи. Главное, это написать процедуру, так чтобы (см. Top).


evgeg   (2002-11-16 15:10:00) [4]

Работающий пример:
http://www.delphikingdom.com/treasury/compile.htm


Юрий Зотов   (2002-11-16 10:17:00) [5]

Это сделать можно, но придется немного схитрить. Просто передать управление на данные не получится (регион исполнимого кода должен иметь флажок Executable, а данные его не имеют), но если поместить их в стек - то пройдет. Например, код можно передать, как параметр функции.

Есть, однако, подводный камень - такой код должен перемещаемым (то есть, безразличным к адресу загрузки).

См. статью Криса Касперски в журнале "Программист", №3, 2001.


ctapik-net   (2002-11-16 06:41:00) [6]

Нет это нужно для защиты программы


Tano   (2002-11-15 22:51:00) [7]

А всякая лебуда насчет защищенного режима процессора, вроде разделения областей памяти на код/данные/стек не всчет, что ли???
Вообще это попахивает очередным гриппером...


Ihor Osov'yak   (2002-11-15 22:08:00) [8]

Ну понимаю. И то что сам сказал, и то, что другие. А те что, пол-главы перепечатывать с Рихтера?


Зы. Хотя бы удосужился сказать, тебя интересует это для cвоего процесса, или для чужого?


Моджахед   (2002-11-15 19:20:00) [9]

Ноу флейм!

Народ, вы понимаете хоть, о чем говорите? Хоть приблизительно -- каким должен быть код, которому передается управление? Хотя-бы как там выполнена адресация.
А то глубокомыслия очень много, а сути нет.


Yegor Derevenets   (2002-11-15 16:36:00) [10]

В паскале, помнится, было можно завести массив, указатель на него переделать в указатель на процедуру и вызывать ее по указателю!
К сожалению, не нашел достаточно времени проверить на дельфи, но must work. :-)


ctapik-net   (2002-11-15 07:04:00) [11]

to All

Буду признателен за линки


Opuhshii   (2002-11-15 07:03:00) [12]

2ctapik-net © (14.11.02 20:34)

что-то в стиле,...

var
P:Pointer;
...
GetMem(P,SizeOf(MyCodeToExec));
asm
Call P
end;
FreeMem(P);
...


Ihor Osov'yak   (2002-11-15 01:29:00) [13]

2 ctapik-net © (14.11.02 20:34)

В Рихтера это подробно описано, на примере создания потока в чужом приложении (естественно, с размещением своего кода в функции потока)


AngeL B.   (2002-11-14 21:49:00) [14]

можно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо