AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateProcess und uallHook.InjectLibrary
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess und uallHook.InjectLibrary

Ein Thema von wicht · begonnen am 25. Mär 2008 · letzter Beitrag vom 30. Mär 2008
Antwort Antwort
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

CreateProcess und uallHook.InjectLibrary

  Alt 25. Mär 2008, 19:10
Hallo Forum,

mal wieder eine Frage von mir.... Also, ich mache CreateProcess() und möchte dann mittels den schönen uall-Units eine DLL einschleusen (uallHook.InjectLibrary()).

Mein Code sieht so aus:
Delphi-Quellcode:
procedure MyCreateProcess(Filename: string);
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := 1;
  CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo);
  uallHook.InjectLibrary(ProcessInfo.dwProcessId, 'D:\hook.dll');
end;
Funktioniert meistens auch, aber eben nicht immer. Als mir das aufgefallen ist, habe ich einfach die Funktion 10 mal mit 'notepad.exe' aufgerufen und 10 mal mit 'sndvol32.exe', einfach nur zum testen. Es kommt dann teilweise vor, dass der Prozess gar nicht mehr startet. Teilweise kommt überhaupt kein Fenster, oder das Programm startet (sndvol32), macht ein "Beep" (keine Ahnung warum) und ist dann auch weg, ohne ein Fenster anzuzeigen.
Vielleicht könnte man das Problem lösen, indem man vor InjectLibrary() ein Sleep oder so packt, aber das ist unsauber und hilft mir auch nicht wirklich weiter, das Problem zu verstehen. Ich vermute einfach mal, dass der Thread (von CreateRemoteThread) den Start des Programms (sndvol32/notepad) irgendwie durcheinander bringt.
Aber was kann man dagegen tun und wo genau liegt das Problem?

Würde mich sehr über Antworten freuen..

Gruß,
Alexander
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

Re: CreateProcess und uallHook.InjectLibrary

  Alt 26. Mär 2008, 12:25
denke eher es liegt an der hook.dll
mach mal ne cleane dll die nur mit MessageBoxA was anzeigt
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#3

Re: CreateProcess und uallHook.InjectLibrary

  Alt 27. Mär 2008, 19:15
Hi

Irgendwie habe ich gehofft, dass du dazu was sagst ... Ich habe das natürlich sofort ausprobiert, allerdings hat das nicht weiter geholfen.

Delphi-Quellcode:
library Project1;

uses
  Windows;

begin
  MessageBox(0, 'x', 'x', MB_ICONINFORMATION);
end.
Das da oben ist die DLL. Auch wenn ich die MessageBox rausnehme, funktioniert es nicht. Ich teste es jetzt nur noch mit sndvol32.exe (XP/SP2), entweder das Teil startet oder es macht nur Beep und nix weiter passiert.
Ausserdem habe ich versucht, den Prozess mit CREATE_SUSPENDED zu erstellen, dann InjectLibrary() machen, dann ResumeThread().
Ist aber genau das selbe...

Ich würde mich sehr freuen, wenn das mal jemand selber ausprobieren würde. Oder wenn jemand so eine Erklärung dafür hat...


Einen schönen Abend noch, und vielen Dank erstmal
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#4

Re: CreateProcess und uallHook.InjectLibrary

  Alt 27. Mär 2008, 19:44
Hmmm ... es wird definitiv damit zu tun haben, daß versucht wird die DLL zu injezieren, bevor der Prozess überhaupt vollständig initialisiert wurde. Nur weil CreateProcess beendet ist, heißt es ja nicht zwangsläufig, daß der Prozess bereits läuft.

Ich kenn die Routinen von uall nicht. Kannst mal die InjectLibrary API posten? Einfach nur um zu sehen wie die DLL injeziert wird.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#5

Re: CreateProcess und uallHook.InjectLibrary

  Alt 29. Mär 2008, 00:33
Hi,

danke für deine Antwort
Also, es klappt nicht nur nicht mit uallHook, sondern auch mit einer anderen (einfacheren) Funktion. Es kommt aufs gleiche hinaus (Beep und Prozess ist weg), hier ist mal der Code:
Delphi-Quellcode:
function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String):Boolean;
var
  hProc: Cardinal;
  oAlloc: Pointer;
  cWPM: Cardinal;
  hRemThread: Cardinal;
begin
  result := false;
  SetLastError(ERROR_SUCCESS);
  hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID);
  oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM);
  CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread);
  if GetLastError = ERROR_SUCCESS then
   result := true;
  CloseHandle(hProc);
end;
Der Code kommt von irgendwoher, ich schätze aber mal, dass der Code in Ordnung ist, weil das ganze sowohl mit dieser Funktion als auch mit uallHook funktioniert, wenn ich z.B. ein Sleep(500) zwischen CreateProcess() und die Inject-Funktion setze...

Eine andere Sache noch nebenbei: sndvol32 erstellt sein Fenster erst, wenn die MessageBox weggeklickt wurde. Sollte die MessageBox nicht sozusagen Zeitgleich mit dem Programmfenster erscheinen? Weil die doch in einem anderen Thread erstellt wird...?

Danke für Antworten und einen schönen Abend noch ...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#6

Re: CreateProcess und uallHook.InjectLibrary

  Alt 29. Mär 2008, 09:55
Nunja, sicher, daß kernel32.dll bereits geladen ist, wenn Du versuchst zu injecten? Das würde erklären wieso es "plötzlich" funktioniert, sobald Du einen Moment wartest. Die Wahrscheinlichkeit ist höher, daß die DLL geladen wurde .

Generell soll Deine Funktion ja die DLL laden, sobald der Prozess gestartet wurde. Entsprechend würde ich eher den EP des neuen Prozesses überschreiben mit nem einfachen LdrLoadDll. LdrLoadDll weil NTDLL.DLL die einzige DLL ist, die wirklich in jedem Prozess geladen ist. KERNEL32.DLL ist zwar in den meisten, aber noch längst nicht allen Prozessen vorhanden .
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

Re: CreateProcess und uallHook.InjectLibrary

  Alt 29. Mär 2008, 11:04
Danke für Antwort !

Bevor ich jetzt anfange (lange) rumzuprobieren... Verstehe ich dich richtig, dass ich anstelle von LoadLibraryA() LdrLoadDll() benutzen soll? Das frage ich, weil ich keine 'Lust' habe rumzuprobieren, stundenlang, und es nichts bringt, weil ich dich nicht verstanden habe ...
Ich müsste nur zusehen, wie ich mit WriteProcessMemory die Parameter passend dahinschreiben kann. Vielleicht bekomme ich das hin, aber freuen würde ich mich trotzdem wahnsinnig, wenn mir da jemand noch einmal unter die Arme greifen würde.. So stark bin ich nämlich nicht in dieser Materie drin, dass ist ja schon was anderes als mal eben ein 'normales' Programm mit Delphi zusammen zu bauen...

Falls jemand (oder du *g*) noch einmal hilft wäre ich sehr dankbar!
Erstmal noch einen schönen Samstag
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#8

Re: CreateProcess und uallHook.InjectLibrary

  Alt 29. Mär 2008, 11:18
Zitat von wicht:
Bevor ich jetzt anfange (lange) rumzuprobieren... Verstehe ich dich richtig, dass ich anstelle von LoadLibraryA() LdrLoadDll() benutzen soll? Das frage ich, weil ich keine 'Lust' habe rumzuprobieren, stundenlang, und es nichts bringt, weil ich dich nicht verstanden habe ...
Ja und nein. Ich befürchte da jetzt etwas weiter ausholen zu müssen. Aber ich denke mal, das ist notwendig weil Du es ansonsten eher nicht verstehst .

Was passiert wenn Du einen Prozess startest? Vereinfacht gesagt, mapped Windows das Image (die Datei) der Anwendung in den Speicher, lädt evtl. statisch gelinkte Bibliotheken, initialisiert jede einzelne Bibliothek in der Reihenfolge ihrer Abhängigkeiten zu einander und springt dann erst an einen fix definierten Punkt innerhalb deiner Anwendung und fängt an die Befehle dort abzuarbeiten. Dieser definierte Punkt nennt sich Entry Point.

Ich empfehle Dir nun den Prozess SUSPENDED zu starten. Dann wird der Prozess bis zu dem Punkt vorbereitet, an dem die Ausführung am Entry Point beginnt. Dort änderst Du den Entry Point einfach, so daß bevor irgendetwas gemacht wird, ein LdrLoadDLL() ausgeführt wird, der deine Bibliothek lädt und DANN erst der Code am Original Entry Point ausgeführt wird.

Das hat mit deiner jetzigen Methode nicht viel zu tun, ist aber deutlich zuverlässiger, weil Du nur so sichergehen kannst, daß deine DLL geladen wird zu einem Zeitpunkt, an dem sie überhaupt geladen werden kann.

Zitat von wicht:
Falls jemand (oder du *g*) noch einmal hilft wäre ich sehr dankbar!
Erstmal noch einen schönen Samstag
Naja, für was willst es denn benutzen? Prinzipiell lassen sich so problemlos hübsche Usermode Rootkits bauen. Das würd ich eher nicht unterstützen .
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#9

Re: CreateProcess und uallHook.InjectLibrary

  Alt 30. Mär 2008, 22:54
Hi, danke für deine Hilfe und die Erklärung.
Weil mir das alles etwas zu weit geht habe ich das Problem anders gelöst. Ich gehe einfach die vom Prozess geladenen Module durch, wenn die benötigten geladen sind injekte ich die DLL. Klappt erstmal, Problem gelöst
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz