Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
31-03-2009 17:55 | Комментарий к предыдущим ответам
XP SP3 rus, Delphi 2009.
Это и менее извращёнными методами делается. Опишите подробнее задачу.
Хотел бы запускать программу и манипулировать запущенным файлом, для защиты. И какие методы ещё есть?
27-03-2009 08:38 | Комментарий к предыдущим ответам
Буду очень рад помощи, почему она выскакивает понять не могу.
Какая операционка? Какая версия Delphi? Возникает на всех компах или на одном?
И не понятно, при чём тут вирусы, если антивирус такой файл ещё при записи на постоянный носитель заметит.
Вы надеюсь понимаете, что использование кода который заведомо считается некоторыми антивирусами вредоносным, это довольно плохая идея, независимо от конечных целей.
Прильщает возможность изменять запускной EXE файл, после запуска RES.
Это и менее извращёнными методами делается. Опишите подробнее задачу.
Буду очень рад помощи, почему она выскакивает понять не могу.
И не понятно, при чём тут вирусы, если антивирус такой файл ещё при записи на постоянный носитель заметит. Прильщает возможность изменять запускной EXE файл, после запуска RES.
21-07-2008 03:38 | Комментарий к предыдущим ответам
Такой способ я опробывал и он вполне работает. И антивирусы на него не ругаются (нод и каспер). Но может кто-нибудь подскажет как передавать параметры командной строки в такой "подмененный" процесс?
И еще, будет ли он работоспособным на Висте?
22-09-2006 08:46 | Вопрос к автору: запрос дополнительной информации
У меня код заработал , благодарю ! но проблема новая возникла
программа которую была в потоке запустилась , но программа несет с собой файл который в будущем будет ей отображатся в памяти,
после запуска программы Вашим кодом файл не был отображен , т.е. запустили только программу...я так понимаю
WriteProcessMemory(PI.hProcess,Mem,Image,Headers.OptionalHeader.SizeOfHeaders,Size) тут мы пишим только инфу о Нашей проги а все остальное что в Нашей программе не будет записано в процесс,подскажите где подправить ?
14-03-2006 07:04 | Комментарий к предыдущим ответам
Для загрузки EXE-файлов из памяти (из ресурса например), можно использовать вот такой код, идея не моя, кто оригинальный автор я не в курсе:
procedure RunExeFromMemory(Image:Pointer);
var
PI:TProcessInformation;
SI:TStartupInfo;
HView,Mem:Pointer;
Headers:PIMAGE_NT_HEADERS;
Section:PIMAGE_SECTION_HEADER;
Context:TContext;
A,Size,Dummy:DWORD;
const
Mapping:array[0..7] of DWORD=(PAGE_NOACCESS,PAGE_EXECUTE,PAGE_READONLY,PAGE_EXECUTE_READ,PAGE_READWRITE,PAGE_EXECUTE_READWRITE,PAGE_READWRITE,PAGE_EXECUTE_READWRITE);
begin
FillChar(SI,SizeOf(SI),0);
SI.cb:=SizeOf(SI);
Win32Check(CreateProcess(nil,'cmd.exe',nil,nil,False,CREATE_SUSPENDED,nil,nil,SI,PI));
try
try
Context.ContextFlags:=CONTEXT_INTEGER;
Win32Check(GetThreadContext(PI.hThread,Context));
Win32Check(ReadProcessMemory(PI.hProcess,Pointer(Context.Ebx+8),@HView,SizeOf(HView),Size)and(Size=SizeOf(HView)));
Win32Check(ZwUnmapViewOfSection(PI.hProcess,HView)=0);
Headers:=PIMAGE_NT_HEADERS(DWORD(Image)+PIMAGE_DOS_HEADER(Image).e_lfanew);
Mem:=VirtualAllocEx(PI.hProcess,Pointer(Headers.OptionalHeader.ImageBase),Headers.OptionalHeader.SizeOfImage,MEM_RESERVE or MEM_COMMIT,PAGE_EXECUTE_READWRITE);
Win32Check(Mem<>nil);
Win32Check(WriteProcessMemory(PI.hProcess,Mem,Image,Headers.OptionalHeader.SizeOfHeaders,Size)and(Headers.OptionalHeader.SizeOfHeaders=Size));
Section:=PIMAGE_SECTION_HEADER(Headers);
Inc(PIMAGE_NT_HEADERS(Section));
for A:=0 to Headers.FileHeader.NumberOfSections-1 do begin
if Section.SizeOfRawData>0 then begin
Win32Check(WriteProcessMemory(PI.hProcess,PChar(Mem)+Section.VirtualAddress,PChar(Image)+Section.PointerToRawData,Section.SizeOfRawData,Size)and(Section.SizeOfRawData=Size));
Win32Check(VirtualProtectEx(PI.hProcess,PChar(Mem)+Section.VirtualAddress,Section.SizeOfRawData,Mapping[Section.Characteristics shr 29],@Dummy));
end;
Inc(Section);
end;
Win32Check(WriteProcessMemory(PI.hProcess,Pointer(Context.Ebx+8),@Mem,SizeOf(Mem),Size)and(SizeOf(Mem)=Size));
Context.Eax:=DWORD(Mem)+Headers.OptionalHeader.AddressOfEntryPoint;
Win32Check(SetThreadContext(PI.hThread,Context));
Win32Check(ResumeThread(PI.hThread)<>$FFFFFFFF);
except
TerminateProcess(PI.hProcess,0);
raise;
end;
finally
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end;
Всё это не очень хорошо (смахивает на поведение вирусов/троянов), так как процесс-менеджеры будут показывать, что запущен "cmd.exe", а не ваша программа. Для подобного трюка (в отличие от загрузки DLL) требуются права админа.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.