![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очень интересный вопрос [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]можно.