Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Можно ли запустить файл, скопированный в память?


Автор: need_ur_help 14.9.2003, 13:58
Столкнулся с проблеммой. Допустим, файл (exe) скопирован в память:
Memory:=TMemostream.Create;
Memory.LoadFromFile('FileNmae');
Можно ли исполнить этот файл из памяти, то есть не обращаясь к жесткому диску после занесения файла ы оперативку?
P.S. Не спрашивайте, нафига этот файл там оказался =) Просто очень нужно.
PLs.

Автор: Dr.Death 14.9.2003, 15:18
можно сделать jump на область в памяти, где лежит этот файл, на асме пимерно так:
Код

asm
mov ax,segment//сегмент
mov es,ax
mov ax,offset//смещение
mov di,ax
jump [es:di]
end;

Автор: need_ur_help 14.9.2003, 15:37
to Dr.Death, tnx, но это понятно. Но для такого решения, нужно динамически узнавать адрес в памяти для каждого файла. Как это сделать срадствами самой Delphi?

Автор: Dr.Death 14.9.2003, 15:48
Я точно не знаю, но если у тебя есть Pointer вот этого TMemoryStream, то ты можешь узнать сегмент и смещение.

Автор: need_ur_help 14.9.2003, 16:27
tnx. again. Я покопаюсь.
Вопрос еще актуален.

Автор: p0s0l 14.9.2003, 17:34
Dr.Death - ты вспомнил досовские 16-битные времена, хотя вопрос про Delphi - это 32-битная среда... Да и простым джампом не обойтись - ведь загрузчик exe-файлов в винде не просто грузит в память файл, а еще выполняет целую тьму всяких-яких инициализаций...

Автор: need_ur_help 14.9.2003, 21:06
Вопрос снят. Архитектура процессора реализовать текую операцию не позволяет. Возможно какие-то хитрые манипуляции и возможны, но мне не светит. А p0s0l, кстати, истину глаголит =(

Автор: Baa 14.9.2003, 23:25
Более того, прыгать надо на точку входа в файл, а не на начало файла, но и этого будет мало wink.gif
и, кстати, нет команды jump, есть jmp wink.gif

Автор: oleg1973 14.9.2003, 23:38
Цитата
Вопрос снят. Архитектура процессора реализовать текую операцию не позволяет.

проц тут совсем не при делах
просто можно взять исходники UPX например и посматреть как там сделано
он же создает процесс не сохраняя темп файл на диск

Автор: need_ur_help 15.9.2003, 19:56
oleg1973, tnx, я постораюсь в них разобраться.
Стоп, а кто занает, можно ли запуская внешнюю программу из проекта Delphi, убедить её в том, что он запускается не из того каталога, где лежит, а из какого-нибудь другого?
P.S. Только ногами не бейте =)

Автор: Гость_Frikazoid 17.9.2003, 16:26
А если файл сохранить и запустить? Если сказал не то не пинайте ногами!

Автор: oleg1973 17.9.2003, 16:33
ну можно и так
но
Цитата
Можно ли исполнить этот файл из памяти, то есть не обращаясь к жесткому диску после занесения файла ы оперативку?

Автор: stab 17.9.2003, 20:57
Цитата
Стоп, а кто занает, можно ли запуская внешнюю программу из проекта Delphi, убедить её в том, что он запускается не из того каталога, где лежит, а из какого-нибудь другого?


У CreateProcess есть параметр lpCurrentDirectory, который устанавливает начальную директорию. Т.к. почти все программы узнают свою директорию при старте через GetCurrentDirectory, то это должно сработать.

з.ы. у ShellExecute тоже есть подобный параметр, это даже лучше, т.к. легче работать с этой функцией.

Автор: need_ur_help 17.9.2003, 21:05
Все уже ok =) уже все сделал. Спасибо всем. Порешало копирование в левый каталог, а потом shellexecute с нужной рабочей директорией.
Еще раз всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)