Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

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)

Zacherl 16. Dez 2007 20:55

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mir eine Unit nach dem InMemExe Prinzip gebastelt. Vielleicht hilft es dir, wenn du den Code siehst.

//Edit 1: Ich bemerke grade etwas .. und zwar funktioniert der CreateThread aufruf unter Vista doch. Allerdings nur unter gewissen Vorraussetzungen. Zum Testen habe ich als Zielprozess die ganze Zeit notepad.exe verwendet. Jetzt habe ich testweise mal firefox.exe genommen und siehe da es funktioniert oO

Woran könnte das liegen? Ein extra Schutz für MS Dateien? Mit iexplore.exe funktioniert es auch nicht.

//Edit 2: Verwende ich in den Microsoft Exen CreateThread ist der Fehler ERROR_BAD_EXE_FORMAT, verwende ich die native NtCreateThreadEx Funktion, welche erst unter Vista zur Verfügung steht, liefert SysErrorMessage: "%1 ist keine gültige Win32 Anwendung!"

ErazerZ 16. Dez 2007 21:37

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
ERROR_BAD_EXE_FORMAT kommt meist als Fehler zurück wenn ImageDosHeader.e_magic, ImageNtHeaders.Signature oder die Characteristics nicht korrekt ist. Das heißt, dass dein Pointer möglicherweise auf was falsches zeigt? möööööglich wäre es.
Du könntest aber noch die 2 Programme vergleichen (also die PE-header) und unterschiede feststellen (zB ImageBase, welche Tabellen sind vorhanden und welche nicht (Bound IAT, etc.)). Benutz Stud PE für die analyse der Dateien, ist ein gutes Programm für sowas.

Zacherl 16. Dez 2007 21:48

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Der Pointer ist richtig. Was ich beim ersten analysieren mit PE Explorer schon festegestellt habe, ist, dass die Characteristics von iexplore und firefox zum Beispiel unterschiedlich sind.

Ich lade mir jetzt mal Stud PE runter und vergleiche die Images :)

IEXPLORE:
Characteristics: 102

FIREFOX:
Characteristics: 10F

Ansonsten scheint alles (bis auf die verschiedenen Imports / Exports) gleich zu sein.

//Edit: Teilweise erscheint bei NtCreateThreadEx auch noch der Fehler: "Unzulässiger Zugriff auf einen Speicherbereich"

negaH 16. Dez 2007 22:12

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

Delphi-Quellcode:
procedure ThreadProc(); stdcall; export;

exports
  ThreadProc;

procedure Test;
var
  P: Pointer;
begin
  P := GetProcAddress(Instance, 'TheadProc');
 
  CreateThread(..., P, ..);
end;
Gruß Hagen

Zacherl 16. Dez 2007 22:16

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Funktioniert leider auch nicht. GetLastError liefert mir jetzt: "%1 ist keine zulässige Win32-Anwendung"
- Bei nicht MS Exen funktioniert es allerdings. :gruebel:

ErazerZ 16. Dez 2007 22:29

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Dann liegt es möglicherweise daran das MS Exe Dateien diese Data Directories haben
  • IMAGE_DIR_ENTRY_BOUND_IMPORT
  • IMAGE_DIR_ENTRY_LOAD_CONFIG
  • IMAGE_DIR_ENTRY_COPYRIGHT
  • IMAGE_DIR_ENTRY_DEBUG
Versuche mal diese auf 0 zu setzen (VA + Size) und dann teste es nochmal ob es klappt (natürlich mit einer Kopie von der original Exe :P).

Edit: also ich glaube es liegt eher an IMAGE_DIR_ENTRY_BOUND_IMPORT.

OldGrumpy 16. Dez 2007 23:02

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

Zitat von Zacherl
//Edit 2: Verwende ich in den Microsoft Exen CreateThread ist der Fehler ERROR_BAD_EXE_FORMAT, verwende ich die native NtCreateThreadEx Funktion, welche erst unter Vista zur Verfügung steht, liefert SysErrorMessage: "%1 ist keine gültige Win32 Anwendung!"

Das ist das gleiche in Grün, nur einmal als Fehlercode und einmal in eine Klartextfehlermeldung übersetzt.

Zitat:

Zitat von Zacherl
Ich hab mir eine Unit nach dem InMemExe Prinzip gebastelt. Vielleicht hilft es dir, wenn du den Code siehst.

Ja, ich sagte ja ich muss mir den noch anschauen.

Zitat:

Zitat von Zacherl
//Edit 1: Ich bemerke grade etwas .. und zwar funktioniert der CreateThread aufruf unter Vista doch. Allerdings nur unter gewissen Vorraussetzungen. Zum Testen habe ich als Zielprozess die ganze Zeit notepad.exe verwendet. Jetzt habe ich testweise mal firefox.exe genommen und siehe da es funktioniert oO

Woran könnte das liegen? Ein extra Schutz für MS Dateien? Mit iexplore.exe funktioniert es auch nicht.

Das wäre nicht das erste Mal dass die Besonderheiten von MS-Exen zu seltsamen Effekten führen :)

Und wie ich oben schon erwähnte, müssen die Exen für diese Tauschaktion recht ähnlich sein. Auf jeden Fall muss das Characteristics-Field identisch sein. Bit 0 nicht gesetzt heisst zum Beispiel dass das File Relocations enthält. Wenn dann Exe und PE-Header dazu im Konflikt stehen, könnte das schon ausreichen. JFTR: Meine notepad.exe (XP) hat auch nicht 0x00400000 als image base sondern 0x01000000 :) Allerdings Characteristics 0x010f, womit teilweise erklärt sein dürfte, warum es unter XP geht, aber nicht unter Vista.

Zacherl 17. Dez 2007 06:16

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Okay, danke für eure Antworten, ich werde das heute Abend nach der Schule nochmal genauer testen. :)

Relicted 17. Dez 2007 07:02

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
bei dem iexplore7 könnte es auch dran liegen dass der in ner sandbox gestartet wird unter vista (unter xp nicht).
die sandbox spielt dabei "firewall" zwischen dem prozess des iexplore und dem system. vielleicht liegt es auch daran dass dieser effekt auftritt. notepad allerdings benutzt IMHO diese sandbox methode nicht..

gruß
Reli

Zacherl 17. Dez 2007 15:08

Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
 
Es tritt bei allen MS Executables auf. Egal ob Notepad, Calc, Cmd, IExplore, Explorer, etc .. das ist vollkommen egal. Ich versuche jetzt mal die BoundIAT zu nullen.

Zitat:

Zitat von OldGrumpy
Zitat:

Zitat von Zacherl
//Edit 2: Verwende ich in den Microsoft Exen CreateThread ist der Fehler ERROR_BAD_EXE_FORMAT, verwende ich die native NtCreateThreadEx Funktion, welche erst unter Vista zur Verfügung steht, liefert SysErrorMessage: "%1 ist keine gültige Win32 Anwendung!"

Das ist das gleiche in Grün, nur einmal als Fehlercode und einmal in eine Klartextfehlermeldung übersetzt.

Ja stimmt. Meinte eigentlich, dass sich nun dieser Fehler mit: "Zugriff auf einen ungültigen Speicherbereich abwechselt"

// Edit 1: Das Nullen der IMAGE_DIR_ENTRYs bringt nichts. Und mir fällt noch etwas auf. Kopiere ich z.b. notepad.exe unter dem Namen notepad2.exe (oder irgeneinen Anderen), will die Datei nicht mehr starten :wall: Es passiert einfach nichts.

// Edit 2:

:arrow: Ich habs. Es liegt doch an der ImageBase -.- Ich bemerke grade, dass die MS Dateien alle die ImageBase 0x01000000 haben, mein Programm aber ganz normal 0x00400000. Setze ich die ImageBase von Notepad auf $00400000, dann lässt sich Notepad zwar nicht mehr starten, aber ich kann die Resource in den Prozess injizieren und CreateThread funktioniert auch. Nur möchte ich ja grade verhindern irgendwie die Dateien selbst zu verändern und sei es nur den Header anzupassen. Kann man den Code zum Injizieren nicht irgendwie anpassen, sodass an der richtigen ImageBase injiziert wird und die injizierte EXE Resource aber trotzdem noch die richtigen Adressen verwendet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr.
Seite 4 von 6   « Erste     234 56      

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