Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

Очень интересный вопрос   Найти похожие ветки 

 
ctapik-net ©   (2002-11-14 20:34) [0]

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


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

можно.


 
Ihor Osov'yak ©   (2002-11-15 01:29) [2]

2 ctapik-net © (14.11.02 20:34)

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


 
Opuhshii ©   (2002-11-15 07:03) [3]

2ctapik-net © (14.11.02 20:34)

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

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



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

to All

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


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

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


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

Ноу флейм!

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


 
Ihor Osov'yak ©   (2002-11-15 22:08) [7]

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


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


 
Tano ©   (2002-11-15 22:51) [8]

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


 
ctapik-net ©   (2002-11-16 06:41) [9]

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


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

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

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

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


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

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


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

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

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


 
SV ©   (2002-11-16 23:31) [13]

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


Удачи
/SV/


 
ctapik-net ©   (2002-11-17 09:50) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-86723
Вованчик
2003-01-08 08:52
2003.01.27
Генераторы


4-87198
Nubie
2002-11-22 14:37
2003.01.27
Мигание


1-86812
simka
2003-01-19 00:37
2003.01.27
вопрос по memo


4-87194
Bukerman
2002-12-11 18:22
2003.01.27
как получить handle уже запущенного процесса?


3-86707
uw
2003-01-09 14:40
2003.01.27
Oracle и TSCLClientDataSet