Entwickler-Ecke

Windows API - Zugriff verweigert bei InjectLibrary


Flamefire - Do 06.03.08 22:33
Titel: Zugriff verweigert bei InjectLibrary
Ich erstelle einen Prozess und möchte gleich darauf eine DLL mit der uall Collection injecten
Hier der Code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var siLoader: TStartupInfo;
  piLoader: TProcessInformation;
  i,start:Integer;
begin
  FillChar(siLoader, SizeOf(siLoader), 0);
  FillChar(piLoader, SizeOf(piLoader), 0);
  if (not CreateProcess(nil'C:\Programme\prozess.exe'NilNil, False, CREATE_SUSPENDED, Nil'C:\Programme\', siLoader, piLoader)) then
  begin
    raise Exception.Create('couldn''t create process...');
  end else
  begin
    ResumeThread(piLoader.hProcess);
    ResumeThread(piLoader.hThread);
    Sleep(200);
    InjectLibrary(piLoader.hProcess,'C:\Programme\test.dll');

Ich erhalte aber (mit syserrormessage) eine Fehlermeldung: Zugriff verweigert. Bei nem eigen-erstellten Prozess

UND: Wenn ichs aus dem Delphi-Compiler (F9) heraus ausführe klappts!

Wie kann das sein?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 06.03.2008 um 21:38


Martok - Fr 07.03.08 00:05

Bei der Sache, dass es aus der IDE raus geht, tippe mal auf vererbte Rechte.

Was für ein OS hast du, und als was für ein User bist du angemeldet (Admin/Eingeschränkt)?


Tobi482 - Fr 07.03.08 14:36

Hi,

sieht für mich etwas seltsam aus

Wenn du eine DLL in einen Prozess injektieren willst, (mir fällt dabei
immer nur der eine Grund ein für das "Warum?" und dir sicherlich auch^^)

muss dafür gesorgt werden, dass der Prozess selber nicht merkt, dass
er von dir gestartet wurde (nur falls er das auch überprüft, was deiner sicherlich macht^^)

Dazu hookt man am besten ShellExecute des originalen Starter.

Dann sollten folgende Schritte in richtiger Reihenfolge abgearbeitet werden

1. Prozess erstellen aber noch nicht laufen lassen
2. DLL Injektion
3. Prozess laufenlassen

Zu 1 sollte das ganze so aus sehen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
     ZeroMemory(@StartInfo, Sizeof(TStartupInfo));
     StartInfo.cb             := SizeOf(StartInfo);
     StartInfo.wShowWindow    := SW_SHOW;
     StartInfo.dwFlags        := STARTF_USESHOWWINDOW;

     hostapp := ExtractFileDir(Application.ExeName) + '\XXX.exe';

     CreateOK := CreateProcess(    nil,
                                   pchar(hostapp),
                                   nil,
                                   nil,
                                   false,
                                   CREATE_SUSPENDED,
                                   nil,
                                   nil,
                                   StartInfo,
                                   ProcInfo);

     if CreateOK = False then
     begin
          Showmessage('XXX.exe konnte nicht gestartet werden');
          exit;
     end;


Zu 2. hier kommt die Injektion

Delphi-Quelltext
1:
     InjectDLL(flb.FileName, ProcInfo.dwProcessId);                    


Zu 3. und jetzt erst laufen lassen

Delphi-Quelltext
1:
     ResumeThread(ProcInfo.hThread);                    


Mit freundlichen Grüßen
Tobi


Flamefire - Mo 10.03.08 18:33

nein der prozess hat keinerlei schutz gegen fremdstarten, was auch normalerweise prima funktioniert
sonst konnte ich DLLs immer auch mit Openprocess und so in diesen prozess injecten
aber ich versuch mal die dll zu injecten bevor der prozess resumed wird

hab WINXP SP2 und adminrechte