So, ich mach lieber mal hier dazu einen Thread auf. Also ich injiziere meine
Dll mit folgender Funktion in meinen Zielprozess:
Delphi-Quellcode:
function InjectLibrary(Process: LongWord; ModulePath: PChar): Boolean;
var
Parameters: Pointer;
Thread, TID: dword;
BytesWritten: dword;
pCreateRemoteThread: function(hProcess: THandle; lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
pVirtualAllocEx: function(hProcess: THandle; lpAddress: Pointer; dwSize, flAllocationType: DWORD; flProtect: DWORD): Pointer; stdcall;
pWriteProcessMemory: function(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;
begin
Result := False;
pCreateRemoteThread := GetRealProcAddress(GetModuleHandle('kernel32'), 'CreateRemoteThread');
pVirtualAllocEx := GetRealProcAddress(GetModuleHandle('kernel32'), 'VirtualAllocEx');
pWriteProcessMemory := GetRealProcAddress(GetModuleHandle('kernel32'), 'WriteProcessMemory');
Parameters := pVirtualAllocEx(Process, nil, Length(ModulePath) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
pWriteProcessMemory(Process, Parameters, ModulePath, Length(ModulePath) + 1, BytesWritten);
Thread := pCreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('kernel32'), 'LoadLibraryA'), Parameters, 0, TID);
if Thread = 0 then Exit;
CloseHandle(Thread);
Result := True;
end;
Das GetRealProcAddress ist aus der madDisAsm und umgeht nur mögliche Hooks der Funktionen.
Jetzt meine Frage:
Ich habe die
Dll als RCDATA Ressource in meine Exe integriert und möchte nun, dass die
Dll vom anderen Prozess direkt aus der Ressource geladen wird.
Oder noch besser wäre es, wenn ich die eigene Exe injizieren könnte und aus dieser aber nicht DllMain, sondern eine von mir exportierte Funktion aufrufen könnte.
Ich hoffe das war jetzt nicht zu kompliziert.
Florian