WinFuture-Forum.de: An die WinApi-Experten - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

An die WinApi-Experten


#1 Mitglied ist offline   HackZero 

  • Gruppe: aktive Mitglieder
  • Beiträge: 903
  • Beigetreten: 07. Januar 02
  • Reputation: 0

  geschrieben 04. August 2002 - 10:25

Hi,

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 :P )... und die Library selbst funktioniert schon, denn ein einfaches
LoadLibrary('plugin.dll');
funktioniert ...

Many Thankx!! :blink:
0

Anzeige



Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0