AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Zacherl · begonnen am 13. Dez 2007 · letzter Beitrag vom 17. Dez 2007
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 16. Dez 2007, 21:55
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!"
Angehängte Dateien
Dateityp: pas inmemlauncher_325.pas (4,3 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#32

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

  Alt 16. Dez 2007, 22:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 16. Dez 2007, 22:48
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"
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#34

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

  Alt 16. Dez 2007, 23:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 16. Dez 2007, 23:16
Funktioniert leider auch nicht. GetLastError liefert mir jetzt: "%1 ist keine zulässige Win32-Anwendung"
- Bei nicht MS Exen funktioniert es allerdings.
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#36

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

  Alt 16. Dez 2007, 23:29
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 ).

Edit: also ich glaube es liegt eher an IMAGE_DIR_ENTRY_BOUND_IMPORT.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#37

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

  Alt 17. Dez 2007, 00:02
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 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 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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 17. Dez 2007, 07:16
Okay, danke für eure Antworten, ich werde das heute Abend nach der Schule nochmal genauer testen.
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#39

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

  Alt 17. Dez 2007, 08:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 17. Dez 2007, 16:08
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 von OldGrumpy:
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 Es passiert einfach nichts.

// Edit 2:

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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 20:53 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