Код (Text): Function InjectDll(Process: dword; ModulePath: PChar): boolean; var Memory:pointer; Code: dword; BytesWritten: dword; ThreadId: dword; hThread: dword; hKernel32: dword; Inject: packed record PushCommand:byte; PushArgument:DWORD; CallCommand:WORD; CallAddr:DWORD; PushExitThread:byte; ExitThreadArg:dword; CallExitThread:word; CallExitThreadAddr:DWord; AddrLoadLibrary:pointer; AddrExitThread:pointer; LibraryName:array[0..MAX_PATH] of char; end; begin Result := false; Memory := VirtualAllocEx(Process, nil, sizeof(Inject), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if Memory = nil then exit; Code := dword(Memory); Inject.PushCommand := $68; inject.PushArgument := code + $1E; inject.CallCommand := $15FF; inject.CallAddr := code + $16; inject.PushExitThread := $68; inject.ExitThreadArg := 0; inject.CallExitThread := $15FF; inject.CallExitThreadAddr := code + $1A; hKernel32 := GetModuleHandle('kernel32.dll'); inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA'); inject.AddrExitThread := GetProcAddress(hKernel32, 'ExitThread'); lstrcpy(@inject.LibraryName, ModulePath); WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten); hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId); if hThread = 0 then exit; CloseHandle(hThread); Result := True; end; При вызове функции в Win2003x64 - она возвращает FALSE. Выход из функции происходит по условию "hThread = 0". Подскажите в чем может быть проблема? Реально ли использовать эту функцию под x64? Возможно ли внедрять 32х разрядную DLL в 64х разрядный процесс?
GetLastError выдаёт Access is Denied (функция CreateRemoteThread). Не могу понять почему это происходит... Ведь по идее надо во внедряемом коде только указатели заменить на 64х разрядные (т.е. дописать к ним старшие нулевые 4 байта). Подскажите где я не прав.