AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Suche: Tutorial zu Dll Injection
Thema durchsuchen
Ansicht
Themen-Optionen

Suche: Tutorial zu Dll Injection

Ein Thema von Lesco · begonnen am 31. Mär 2005 · letzter Beitrag vom 2. Apr 2005
Antwort Antwort
Seite 2 von 3     12 3      
NicoDE
(Gast)

n/a Beiträge
 
#11

Re: Suche: Tutorial zu Dll Injection

  Alt 31. Mär 2005, 15:56
Zitat von perle:
warum?
Zu unsicher. Funktioniert in 99% ohne Probleme, Nebenwirungen sind aber nicht ausgeschlossen. Die Implementierungen von CreateRemoteThread für Win9x von Madshi und EliCZ sind besser.
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Suche: Tutorial zu Dll Injection

  Alt 31. Mär 2005, 16:00
Zitat von NicoDE:
Zitat von perle:
warum?
Zu unsicher. Funktioniert in 99% ohne Probleme, Nebenwirungen sind aber nicht ausgeschlossen. Die Implementierungen von CreateRemoteThread für Win9x von Madshi und EliCZ sind besser.
Hmm ok dafür kostet abver der Code von Madshi was und EliCZ sagt mir nix...

Bye
Christian
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#13

Re: Suche: Tutorial zu Dll Injection

  Alt 31. Mär 2005, 16:13
Zitat von Kedariodakon:
Hmm ok dafür kostet abver der Code von Madshi was und EliCZ sagt mir nix...
Es gibt AFAIK keine entsprechende OpenSource-Variante für CRT9x, sorry.
Ich habe anno dazumal mit einem befreundeten Entwickler an einer eigenen Implementation gearbeitet. Die Methode ist letztendlich der von Madshi ziemlich ähnlich (ich habe kurz danach Madshis Quellen erworben).

EliCZ ist der Nickname von Bei Google suchenRadim Picha. http://www.apihooks.com
  Mit Zitat antworten Zitat
MartinA

Registriert seit: 27. Aug 2003
13 Beiträge
 
#14

Re: Suche: Tutorial zu Dll Injection

  Alt 1. Apr 2005, 08:49
Die einfachste Methode is meiner Neinung nach einen Denkanstos werfe ich einfach einen Hook in den Raum.

Vorraussetzung: Ich kenne den Namen der EXE in die Injiziert werden soll.

Verfahren:

1. Einen Messagehook aufsetzen:
Code:
Irgendwas := SetWindowsHookEx(WH_GETMESSAGE, @MsgHook, hInstance, 0);
2.1 Im Hook selbst wird bereits gemacht
Code:
function MsgHook(Code: Longint; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
if (extractexename(getcommandline)='MEINEXENAME.EXE') then
  begin
    :
    code hier
    :
  end;
 Result := CallNextHookEx(msghookc, Code, wParam, lParam);
2.2 Im Hook wird der zu injizierende Code nachgeladen.
Code:
function MsgHook(Code: Longint; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
if ((extractexename(getcommandline)='MEINEXENAME.EXE')) and (pruefung=false) then
  begin
    hinstance := Loadlibrary ('INJIZIERTE.DLL');
  end;
 Result := CallNextHookEx(msghookc, Code, wParam, lParam);
Als Schmankerl stelle ich dann noch folgende Procdeduren zur Verfügung.
Code:
Procedure WriteSecureBuffer(Addr: DWord; Data: Pointer; Len: Word);
Var
  Written: DWord;
  ToPos : Pointer;
begin
  ToPos:= Pointer(Addr);
  WriteProcessMemory(GetCurrentProcess, ToPos, Data, Len, Written);
end;

procedure MakeJump(ZielAddr, JumpAddr, NOPS: DWord);
Var
 Buffer : Array[1..5] of Byte;
 Data   : DWord;
 X      : Byte;
begin
  Data:= ZielAddr - (JumpAddr + 5);
  Move(Data, Buffer[2], 4);
  Buffer[1]:= $E9;
  WriteSecureBuffer(JumpAddr, @Buffer, 5);
  For X:= 1 to NOPS do WriteSecureByte(JumpAddr + 4 + X, $90);
end;
Gruß
Martin
ALT +F4
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#15

Re: Suche: Tutorial zu Dll Injection

  Alt 1. Apr 2005, 11:15
Zitat von MartinA:
1. Einen Messagehook aufsetzen:
Es kann (und wird, je nach Windows-Version) passieren, dass die Hook-DLL erst geladen wird, wenn die Anwendung den Eingabefokus erhält.

Zitat von MartinA:
Im Hook wird der zu injizierende Code nachgeladen.
Performance-Overkill. Message-Hook-Callbacks werden sehr oft aufgerufen. Warum nicht einfach in der LibraryProc der DLL?

Zitat von MartinA:
Als Schmankerl stelle ich dann noch folgende Procdeduren zur Verfügung.
Du hast vergessen die Attribute der Speicherseite zu prüfen und notfalls temporär zu ändern.
  Mit Zitat antworten Zitat
Lesco

Registriert seit: 29. Mär 2005
29 Beiträge
 
Delphi 2005 Architect
 
#16

Re: Suche: Tutorial zu Dll Injection

  Alt 1. Apr 2005, 15:11
Zitat von MartinA:
Die einfachste Methode is meiner Neinung nach einen Denkanstos werfe ich einfach einen Hook in den Raum.

Vorraussetzung: Ich kenne den Namen der EXE in die Injiziert werden soll.

Verfahren:

1. Einen Messagehook aufsetzen:
Code:
Irgendwas := SetWindowsHookEx(WH_GETMESSAGE, @MsgHook, hInstance, 0);

[/code]

Gruß
Martin
wieso denn einen systemweiten hook?
prozessweit würde auch reichen oder?

//EDIT: Habs jetzt mit nem prozessweiten Message-Hook hinbekommen. Diese Sachen mit VirtualAllocEx und Co. hab ich nie wirklich hinbekommen. Zu dem Punkt dass das Fenster die Nachrichten erst beim durch Focus empfängt: Trat bei mir nur bei SendMessage() auf, bei PostMessage() nicht.
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#17

Re: Suche: Tutorial zu Dll Injection

  Alt 1. Apr 2005, 20:02
So ... ich hab mir jetzt kurzerhand meine eigene DLL-Injektions Library geschrieben (vorallem für ein Jugend forscht Projekt). Sie läuft (bisher) nur unter NT-Systemen, aber dort eigentlich recht stabil (laut meinen tests ).
Die Library kann Dll's injezieren, und auch wieder uninjezieren.
Wer will kann sie sich ja mal anschauen, und ggf. auch kritisieren (aber bitte nur konstruktive Kritik).

Für den Fall, dass jemand den Code der RemoteThreads Debuggen will, den Kommentar des defines (break_in_remotethread) ganz oben aufheben & neucompilieren (dann wird in jedem RemoteThread ein "hartgecodeter" Breakpoint aufgerufen).

Ich denke, dass ich das ganze einigermaßen verständlich kommentiert habe, also könnte es auch als "Tutorial" dienen. Dazu sollte man sich aber zmd. mit den Grundlagen von Assembler auskennen.

ciao, Philipp
Angehängte Dateien
Dateityp: pas dllinjection_125.pas (7,8 KB, 63x aufgerufen)
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#18

Re: Suche: Tutorial zu Dll Injection

  Alt 2. Apr 2005, 00:45
Zitat von c113plpbr:
Wer will kann sie sich ja mal anschauen, und ggf. auch kritisieren (aber bitte nur konstruktive Kritik).
Die ganze Arbeit musst Du dir nicht machen...

Der Trick bei CreateRemoteThread besteht ja darin, dass die TThreadFunc aufrufkompatibel zu LoadLibrary ist.
Das heisst, dass Du per CreateRemoteThread einen Thread an der Adresse von LoadLibrary erzeugst und als 'Thread'-Parameter die Adresse des Dateinamens im entfernten Prozess angibst. Und das schöne darin ist, dass man anhand des ExitCodes des Threads (= Rückgabe von LoadLibrary) feststellen kann, ob das Laden erfolgreich war.

Das gleiche gilt für FreeLibrary.

ps: wie oben schon erwähnt, sollte man nicht versuchen aus einem 32-Bit Programm einen RemoteThread in einem 64-Bit Prozess zu erzeugen, da sich die LoadLibrary-Funktion dort an einer anderen Adresse befindet (man müsste also die Adresse aus der 64-Bit-Version der kernel32.dll auslesen - nicht sonderlich trivial).
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#19

Re: Suche: Tutorial zu Dll Injection

  Alt 2. Apr 2005, 01:11
Zitat von NicoDE:
Der Trick bei CreateRemoteThread besteht ja darin, dass die TThreadFunc aufrufkompatibel zu LoadLibrary ist.
Das heisst, dass Du per CreateRemoteThread einen Thread an der Adresse von LoadLibrary erzeugst und als 'Thread'-Parameter die Adresse des Dateinamens im entfernten Prozess angibst. Und das schöne darin ist, dass man anhand des ExitCodes des Threads (= Rückgabe von LoadLibrary) feststellen kann, ob das Laden erfolgreich war.

Das gleiche gilt für FreeLibrary.
Hmm ... ja, wäre eine überlegung wert, aber bei dieser Methode müsste ich mir ja dann zwangsweise das Modulehandle, das LoadLibrary zurückgibt merken, oder? Außerdem könnte ich doch (so wie es jetzt ist) z.B. DLL's die ich nicht geladen habe, damit entladen, oder?
Hmm ... naja, wie auch immer, es war mal interessant soetwas zu programmieren ... ^^ ... und es ist ja nicht "falsch"
Zitat von NicoDE:
ps: wie oben schon erwähnt, sollte man nicht versuchen aus einem 32-Bit Programm einen RemoteThread in einem 64-Bit Prozess zu erzeugen, da sich die LoadLibrary-Funktion dort an einer anderen Adresse befindet (man müsste also die Adresse aus der 64-Bit-Version der kernel32.dll auslesen - nicht sonderlich trivial).
Hmm ... ja ... bisher hab ich noch nicht viel mit 64-Bit systemen (oder auch mit deren prozessen) am hals, obwohl ich nen AMD64 hab ^^ (M$'s gratis testversion von xp64 hab ich schon, nur noch keine zeit gefunden es zu installieren ...)
BTW, wie kann ich herausfinden, ob ich einen 64-Bit Prozess vor mir hab?

Andere Frage, wie schauts da eigentlich bei .NET Programmen aus? Ich mein, die arbeiten doch nicht mehr mit DLL's, oder?

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#20

Re: Suche: Tutorial zu Dll Injection

  Alt 2. Apr 2005, 01:19
Zitat von c113plpbr:
ja, wäre eine überlegung wert, aber bei dieser Methode müsste ich mir ja dann zwangsweise das Modulehandle, das LoadLibrary zurückgibt merken, oder?
Jupp, das wäre ratsam.

Zitat von c113plpbr:
Außerdem könnte ich doch (so wie es jetzt ist) z.B. DLL's die ich nicht geladen habe, damit entladen, oder?
Man kommt zu Beispiel per ToolHelp32-API an die Modul-Handles. Aber warum sollte man DLLs entladen, die man selbst nicht geladen hat?

Zitat von c113plpbr:
BTW, wie kann ich herausfinden, ob ich einen 64-Bit Prozess vor mir hab?
Mittels IsWow64Process. Die Funktion sollte allerdings dynamisch geladen werden, da sie nicht auf allen Windows-Versionen vorhanden ist.

Zitat von c113plpbr:
Andere Frage, wie schauts da eigentlich bei .NET Programmen aus? Ich mein, die arbeiten doch nicht mehr mit DLL's, oder?
Funktioniert (auf Win32) genauso.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 21:25 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