Делаю инжект exe в процесс таким образом:
| Код |
Код: { Внедрение образа Exe файла в чужое адресное пространство и запуск его точки входа. Data - адрес образа файла в текущем процессе. } function InjectExe(Process: dword; Data: pointer): boolean; var Module, NewModule: pointer; EntryPoint: pointer; Size, TID: dword; hThread : dword; BytesWritten: dword; Header: PImageOptionalHeader; begin Result := False; Header := PImageOptionalHeader(pointer(integer(Data) + PImageDosHeader(Data)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))); Size := Header^.SizeOfImage; Module := pointer(Header^.ImageBase); EntryPoint := pointer(Header^.ImageBase + Header^.AddressOfEntryPoint);
NewModule := VirtualAllocEx(Process, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); if NewModule = nil then exit; WriteProcessMemory(Process, NewModule, Module, Size, BytesWritten); hThread := CreateRemoteThread(Process, nil, 0, EntryPoint, NewModule, 0, TID); if hThread <> 0 then Result := True; end;
Приведем пример использования этого метода:
Код: program InjectProcess;
{$IMAGEBASE $13140000}
uses Windows, advApiHook;
var StartInf: TStartupInfo; ProcInf: TProcessInformation;
function Main(dwEntryPoint: Pointer): dword; stdcall; begin LoadLibrary('kernel32.dll'); LoadLibrary('user32.dll'); MessageBox(0, 'Hello World', 'Process Injection', 0); ExitThread(0); end;
begin //запускаем блокнот ZeroMemory(@StartInf, SizeOf(TStartupInfo)); CreateProcess(nil, 'notepad.exe', nil, nil, false, 0, nil, nil, StartInf, ProcInf); //внедряем в него образ текущего процесса InjectThisExe(ProcInf.hProcess, @Main); end.
|
Но если
| Код | function Main(dwEntryPoint: Pointer): dword; stdcall; begin LoadLibrary('kernel32.dll'); LoadLibrary('user32.dll'); MessageBox(0, 'Hello World', 'Process Injection', 0); ExitThread(0); end;
|
заменить на
| Код | function Main(dwEntryPoint: Pointer): dword; stdcall; var MYNAME:string; begin LoadLibrary('kernel32.dll'); LoadLibrary('user32.dll'); MessageBox(0, 'Hello World', 'Process Injection', 0); MYNAME:=ParamStr(0); ExitThread(0); end;
|
То сразу после сообщения Hello World Прога в которую внедрил exe вылетает с ошибкой(Прекращена работа программы).
Винда 7.
Подскажите почему так, и что делать чтобы это работало?
|