Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP) (https://www.delphipraxis.net/104996-adresse-einer-funktion-ohne-%40-ermitteln-evtl-ueber-cs-ip.html)

OldGrumpy 17. Dez 2007 15:34

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Ich vermute mal, Du kannst Dir zu einem laufenden Prozess ganz einfach die gerade ablaufende Exe holen, und da schauste dann einfach rein. In psapi.dll und imagehlp.dll sind ja die wesentlichen APIs drin und auch dokumentiert. Die MS-eigenen Exen könnten zudem digital signiert sein, die zu verändern dürfte dann einen ziemlichen Aufwand bedeuten :)

Zacherl 17. Dez 2007 15:37

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Zitat:

Zitat von OldGrumpy
Ich vermute mal, Du kannst Dir zu einem laufenden Prozess ganz einfach die gerade ablaufende Exe holen, und da schauste dann einfach rein. In psapi.dll und imagehlp.dll sind ja die wesentlichen APIs drin und auch dokumentiert. Die MS-eigenen Exen könnten zudem digital signiert sein, die zu verändern dürfte dann einen ziemlichen Aufwand bedeuten :)

Ja die laufenden Exen kann man sich holen, nur was bringt mir das? :P Mh siehe mein letztes Edit: Injiziere ich meine Exe in eine MS Exe, bei der ich vorher die ImageBase angeglichen habe funktioniert die Sache wunderbar.

OldGrumpy 17. Dez 2007 15:50

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Irgendwie reden wir da wohl an einander vorbei. Du sollst nur folgenden Schritt zusätzlich implementieren:

Alt:
Setze Startadresse auf $00400000, kopiere Kram rüber und los geht's.

Neu:
Hole Startadresse aus dem Image der Exe in deren Prozess injiziert werden soll, kopiere Kram rüber und los geht's.

Wo ist denn da das Problem?

Edith sagt:
Delphi-Quellcode:
BaseAddress := VirtualAllocEx(ProcessInfo.hProcess, Pointer(NtHeaders.OptionalHeader.ImageBase), NtHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
Da holst Du doch die Baseaddress, sorg einfach dafür, dass das die Base wird, die zur Ziel-Exe passt :) Im Code fehlt auch an etlichen Stellen Fehlerbehandlung, gerade Sachen wie VirtualAllocEx und VirtualProtectEx sollte man nicht in "fire and forget"-Manier benutzen sondern immer akribisch auch die Rückgabewerte checken.

Zacherl 17. Dez 2007 16:29

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Die Fehlerbehandlung mache ich später. Habe die Stelle jetzt so abgeändert, wobei Target das komplette Image von Notepad enthält.

Delphi-Quellcode:
BaseAddress := VirtualAllocEx(ProcessInfo.hProcess,
            Pointer(PImageNtHeaders(
            Cardinal(Target) + Cardinal(Windows.PImageDosHeader(Target).
            _lfanew))^.OptionalHeader.ImageBase),
            NtHeaders.OptionalHeader.SizeOfImage,
            MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
:arrow: Ergebniss: Notepad startet ganz normal :mrgreen: Allerdings werden VirtualAllocEx, WriteProcessMemory und co korrekt ausgeführt. Vermutlich muss man noch irgendwas am EntryPoint feilen oder?

Sorry mein Fehler .. ne Notepad startet mit meiner MessageBox, aber wieder bekomme ich ERROR_BAD_EXE_FORMAT bei CreateThread.

Apollonius 17. Dez 2007 16:35

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Wenn du an den Problemen mit der Image-Base arbeiten willst, kannst du ja mal debuggen. Das geht relativ einfach, wenn du den Delphi-Debugger dazuschaltest und dann an einem definierten Punkt anhältst, indem du dort einm
Delphi-Quellcode:
asm
  int 3
end;
einbaust. Dann kannst du wenigstens mal schauen, ob die Thread-Funktions-Adresse korrekt auf den Stack gepusht wird und die globalen Variablen korrekt angesprochen werden (auch wenn du sagst, dass sie funktionieren, habe ich Bauchschmerzen dabei).

Zacherl 17. Dez 2007 16:40

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Ich kann den Prozess nicht debuggen. Weder mit Delphi noch mit OllyDbg ..

Apollonius 17. Dez 2007 16:41

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Wie hast du es denn probiert? Mit Run->Attach to process... ?

Zacherl 17. Dez 2007 16:42

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Genau. Es kommt nur der Fehler: "Vorgang kann nicht fortgesetzt werden" und Olly sagt Ähnliches: "Unable to attach the process notepad.exe".

OldGrumpy 17. Dez 2007 17:40

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Da wäre dann doch wohl der Moment gekommen, einen Kernelmode-Debugger zur Hand zu nehmen :)

Zacherl 17. Dez 2007 17:53

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Mhh :D nach was genau soll ich den suchen? Bzw welche Funktion sollte ich debuggen? Kernelmode Debugger für Vista? Gibts da schon was?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 5 von 6   « Erste     345 6      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz