AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Hooks - außerhalb des Prozessspeichers möglich?
Thema durchsuchen
Ansicht
Themen-Optionen

Hooks - außerhalb des Prozessspeichers möglich?

Ein Thema von Zacherl · begonnen am 14. Aug 2008 · letzter Beitrag vom 15. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:20
Hey,

mir kam da grade eine Idee, wie ich einen Usermode Hook realisieren könnte, ohne eine Dll zu injizieren. Und zwar dachte ich mir, dass ich einfach wie bei einem normalen inline Hook vorgehe, dabei aber nicht in die eigene Dll zu springen, sondern in den Adressraum meiner eigenen EXE, bzw einer Art Shared Memory.

Ist sowas möglich?

Gruß Zacherl
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:35
Ich habe zwar nicht ganz verstanden, wie du das erreichen willst, aber es funktioniert auf jeden Fall. Du kannst zum Beispiel einen Thread injizieren, den du nicht bei LoadLibrary starten lässt, sondern bei einer selbst geschriebenen Funktion, die du mit VirtualAllocEx und WriteProcessMemory in den fremden Speicher beförderst. Das einzige Problem ist dabei, dass man nicht einfach auf fremde Routinen zugreifen kannst. Ich habe eine derartige Technik einmal verwendet, um die Places Bar in den Öffnen-Dialogen des BDS zu verändern. Dort habe ich das mit einer handcodierten Assembler-Funktion gelöst, die einfach Zeiger auf die Funktionen enthielt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:48
Meinte das bisschen anders. Einfach gesagt schreibe ich z.b. am Anfang des MessageBoxA Imports von notepad.exe ein JMP [Einsprungspunkt in meinem Prozess]. Also dass immer wenn notepad MessageBoxA aufgerufen wird erstmal ein JMP in meinen Prozess durchgeführt wird, dort dann mein Hook aufgerufen wird.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:50
Und wie sorgst du dafür, dass dein Code in den fremden Prozess gemappt wird?

Du kannst auf das Mappen natürlich verzichten, indem du zum Beispiel mit Fensternachrichten arbeitest, aber das war wohl nicht deine Intention.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:51
Ich geb zu, dass ich mich wahrscheinlich schlechter damit auskenne als du, aber soweit ich weiß, haben unter NT doch alle Prozesse ihren eignen virtuellen Prozessraum. Von daher würde ich mal schätzen, dass du nicht einfach in deinen eigenen Prozess springen kannst.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 19:59
@NamenLozer: Ja genau das meinte ich. Meine Frage ist halt, ob ich irgendwo eine Art zentralen Hook installieren kann. Sprich alle Prozesse rufen die selbe Hook Callback Funktion auf, welche sich in meinem Prozess befindet.

@Apollonius: Das Mappen geht dann ganz normal mittels WriteProcessMemory, aber ohne, dass ich CreateRemoteThread verwende. Um den Einsprungspunkt zu finden, muss ich ja nur GetProcAddress und GetModuleHandle anwenden. Die Adressen sollten ja in jedem virtuellen Adressram der geladenen Dll gleich sein.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 20:16
Ja, das geht auch ohne CreateRemoteThread. Aber die Funktionen erhältst du nicht so einfach. Schließlich brauchst du auch erst mal die Zeiger auf GetModuleHandle und GetProcAddress.

Wenn du viele Prozesse hooken willst, solltest du vielleicht über SendMessage nachdenken.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 21:20
Okay, wie würde das denn konkret aussehen, wenn ich z.b. MessageBoxA in einem Prozess jetzt auf einen Callback in meinem eigenen Prozess umlenken möchte?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 21:29
Was heißt für dich "in deinem Prozess"? Wenn du Zugriff auf globale Variablen brauchst, würde ich SendMessage nehmen. Alles andere wird sehr unschön. Wenn es dir nur darum geht, denn Code aus deinem Prozess zu holen, kannst du ihn ja einfach mit VirtualAllocEx und WriteProcessMemory hinüberschieben und dann diesen Funktionszeiger verwenden. Das Problem mit GetModuleHandle und GetProcAddress löst du z.B. folgendermaßen:
Delphi-Quellcode:
//nicht getestet
procedure AsmHelper({Parameters}); stdcall;
asm
  call @@Ahead
  @@GetProcAddr:
  dd 0
  @@GetModH:
  dd 0
  @Ahead:
  pop eax
  pop edx
  push [eax + 4]
  push [eax]
  push edx
  jmp RealProc
end;

procedure RealProc(GetProcAddr, GetModH: Pointer {; Parameters}); stdcall;
begin
end;
Dann musst du nur noch ein weiteres WriteProcessMemory verwenden, um die Adressen in AsmHelper einzufügen. Der Sprung am Ende müsste funktionieren, wenn du beide Routinen in einem Block belässt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Hooks - außerhalb des Prozessspeichers möglich?

  Alt 14. Aug 2008, 22:04
Danke dir, denke damit sollte ich was anfangen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:04 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