ich bin gerade an einem Skinning-Programm, und dazu muss ich eine DLL-Bibliothek in den Speicherbereich anderer Anwendungen laden ... bisher bin ich auf das hier gekommen - aber der Remote LoadLibrary-Call scheitert immer ... warum?
{$MODE DELPHI} program DLL_Loader; uses windows; const nPlugin = 11; sTarget = 'Target.exe'; sPlugin = 'Plugin.dll'; function VirtualAllocEx(hProcess: HANDLE; lpAddress: Pointer; dwSize: LongInt; flAllocationType, flProtect: DWORD): Pointer; external 'kernel32.dll'; function VirtualFreeEx(hProcess: HANDLE; lpAddress: Pointer; dwSize: LongInt; dwFreeType: DWORD): Boolean; external 'kernel32.dll'; var nRemote : DWORD; hRemote : HANDLE; pLoadLibrary : LPVOID; sRemotePlugin : LPSTR; tTargetInit : STARTUPINFO; tTargetInfo : PROCESS_INFORMATION; pRemoteMem : Pointer; begin sRemotePlugin := sPlugin; tTargetInit.cb := SizeOf(tTargetInit); if not CreateProcess(sTarget, nil, nil, nil, False, 0, nil, nil, tTargetInit, tTargetInfo) then WriteLn('CreateProcess Failed.'); CloseHandle(tTargetInfo.hThread); // Close unneeded handle pRemoteMem := VirtualAllocEx(tTargetInfo.hProcess, nil, nPlugin, MEM_COMMIT, PAGE_READWRITE); if Integer(pRemoteMem) = 0 then WriteLn('VirtualAllocEx failed.'); if not WriteProcessMemory(tTargetInfo.hProcess, pRemoteMem, @sRemotePlugin, nPlugin, nil) then WriteLn('WriteProcessMemory failed.'); pLoadLibrary := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryA'); hRemote := CreateRemoteThread(tTargetInfo.hProcess, nil, 0, pLoadLibrary, pRemoteMem, 0, nil); if Integer(hRemote) = 0 then WriteLn('CreateRemoteThread failed.'); WaitForSingleObject(hRemote, INFINITE); GetExitCodeThread(hRemote, @nRemote); CloseHandle(hRemote); if nRemote = 0 then WriteLn('Remote LoadLibrary failed.'); VirtualFreeEx(tTargetInfo.hProcess, pRemoteMem, 0, MEM_RELEASE); CloseHandle(tTargetInfo.hProcess); end.
Als Compiler verwende ich FreePascal von FreePascal.org (ist übrigens der ultimativste freie Compiler, den es gibt )... und die Library selbst funktioniert schon, denn ein einfaches
LoadLibrary('plugin.dll');funktioniert ...
Many Thankx!!