Текущий архив: 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.47 MB
Время: 0.012 c