![]() |
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!" |
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. |
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" |
Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
versuche mal
Delphi-Quellcode:
Gruß Hagen
procedure ThreadProc(); stdcall; export;
exports ThreadProc; procedure Test; var P: Pointer; begin P := GetProcAddress(Instance, 'TheadProc'); CreateThread(..., P, ..); end; |
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: |
Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
Dann liegt es möglicherweise daran das MS Exe Dateien diese Data Directories haben
Edit: also ich glaube es liegt eher an IMAGE_DIR_ENTRY_BOUND_IMPORT. |
Re: Adresse einer Funktion ohne @ ermitteln (evtl über CS:IP
Zitat:
Zitat:
Zitat:
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. |
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. :)
|
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 |
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:
// 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. |
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