![]() |
Compiler ändert asm Code ?
Hallo,
ich benutze folgende Funktion um meinen Hook zu überspringen.
Delphi-Quellcode:
Warum macht der Compiler dann folgenden Code daraus, bzw. wie kann ich verhindern das er es macht ?
function xPostMessage(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
asm mov edi, edi push ebp mov ebp, esp jmp OldDllFunc end;
Code:
Wie man sieht hat er einiges geändert.
003A5C60 G> $ 55 push ebp
003A5C61 . 8BEC mov ebp, esp 003A5C63 . 89FF mov edi, edi 003A5C65 . 55 push ebp 003A5C66 . 89E5 mov ebp, esp 003A5C68 . FF25 70FF3A00 jmp near dword ptr [3AFF70] |
Re: Compiler ändert asm Code ?
Ich finde das auch extrem lästig. In C++ würde man das mit __declspec(naked) lösen; in Delphi gibt es das nicht. Als hässlichen Workaround kannst du die Parameter sowie das stdcall weglassen. Wenn du die Funktion dann aus Delphi-Code aufrufen willst, nimmst du @xPostMessage und castest in einen entsprechenden Funktionszeigertypen, sodass du die Funktion mit Parametern aufrufen kannst.
|
Re: Compiler ändert asm Code ?
Schlüsselwort [oh]assembler;[/oh] vor stdcall; angeben.
|
Re: Compiler ändert asm Code ?
Was ist der Sinn von mov edi, edi?
Meinst Du mov edi, [edi]? |
Re: Compiler ändert asm Code ?
mov edi, edi steht auch am Anfang der meisten WinAPI-Funktionen und erleichtert erneutes Hooken - zumindest, wenn sich vor der Funktion noch fünf ungenutzte Bytes befinden.
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Also ich hab jetzt ne einfache Möglichkeit gefunden.
wenn ich es so mache ...
Delphi-Quellcode:
wird daraus ...
function xPostMessage(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
asm mov edi, edi jmp OldDllFunc end;
Code:
und es funktioniert.
003A5C60 G> $ 55 push ebp
003A5C61 . 8BEC mov ebp, esp 003A5C63 . 89FF mov edi, edi 003A5C65 . FF25 70FF3A00 jmp near dword ptr [3AFF70] |
Re: Compiler ändert asm Code ?
Das ändert am zugrunde liegenden Problem rein gar nichts. Nebenbei bemerkt kannst du dein mov edi, edi jetzt tatsächlich ersatzlos streichen.
|
Re: Compiler ändert asm Code ?
Hi,
Zitat:
Das
Delphi-Quellcode:
gehört zu der stdcall Aufrufkonvention und wird vom compiler automatisch erzeugt. Also das hat schon alles so seine Richtigkeit ;)
push ebp
mov ebp, esp |
Re: Compiler ändert asm Code ?
Zitat:
Zitat:
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Zitat:
Zitat:
|
Re: Compiler ändert asm Code ?
So what? In einer reinen Assembler-Routine sind Parameter auf dem Stack kein Grund, einen Stackframe zu generieren.
|
Re: Compiler ändert asm Code ?
Da im Originalbeitrag
Delphi-Quellcode:
überhaupt nicht auf die Parameter zu gegriffen wird und auch via jmp eh nicht der Stackframe abgebaut wird kann man doch eigentlich gleich schreiben?
function xPostMessage(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
asm mov edi, edi push ebp mov ebp, esp jmp OldDllFunc end;
Delphi-Quellcode:
Dann wird auch kein Stackframe erzeugt.
function xPostMessage: BOOL; stdcall;
asm mov edi, edi push ebp mov ebp, esp jmp OldDllFunc end; |
Re: Compiler ändert asm Code ?
Das war doch praktisch mein Vorschlag aus #2. Aber dann wird es eben hässlich, wenn man xPostMessage aus Delphi aufrufen will.
|
Re: Compiler ändert asm Code ?
Zitat:
|
Re: Compiler ändert asm Code ?
Aber den Stack sollte man trotzdem hinterher aufräumen. (oder man nimmt cdecl)
|
Re: Compiler ändert asm Code ?
Wenn du aus der Funktion herausjumpst, kann das die Zielfunktion übernehmen. Im Prinzip ist das ein Tailcall, auch wenn das manuelle Aufsetzen eines Stackframes etwas merkwürdig ist.
|
Re: Compiler ändert asm Code ?
ach, ich dachte der jump war nur so ein test
|
Re: Compiler ändert asm Code ?
Zitat:
ich muss das jetzt doch noch einmal ausgraben .. kann mir jemand an einem Beispiel zeigen wie ich so einen Typecast machen muss ? Danke |
Re: Compiler ändert asm Code ?
Hi,
muss das leider nochmal hochholen. Wär klasse wenn mir jemand nen beispiel hat. Danke. |
Re: Compiler ändert asm Code ?
Delphi-Quellcode:
So sollte es gehen.
procedure TestMe();
begin end; type TTestFunc = function(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall; var TestFunc: TTestFunc; begin TestFunc := @TestMe; TestFunc(0, 0, 0, 0); end; |
Re: Compiler ändert asm Code ?
Der automatisch erzeugte Eintritts- und Austrittscode (genannt Stack-Frame):
Delphi-Quellcode:
Dazu kommt dann noch die Behandlung von
PUSH EBP // Vorhanden wenn Locals <> 0 oder Params <> 0
MOV EBP, ESP // Vorhanden wenn Locals <> 0 oder Params <> 0 SUB ESP, Locals // Vorhanden wenn Locals <> 0 PUSH ECX // - ... MOV EAX, [EBP-4] // Vorhanden wenn nachdem Result etwas zugewiesen wurde auch noch EAX // etwas zugewiesen wird, in diesem Fall wird für Result [EBP-4] statt // EAX verwendet - wenn Result <= Integer POP ECX // - MOV ESP, EBP // Vorhanden wenn Locals <> 0 POP EBP // Vorhanden wenn Locals <> 0 oder Params <> 0 RET Params // Immer vorhanden {$W+} oder {$STACKFRAMES ON} [equote="OH satgt zu ''Stack-Frames (Delphi)''"]Die Direktive $W steuert die Erzeugung von Stack-Frames für Prozeduren und Funktionen. Im Status {$W+} werden Stack-Frames für Prozeduren und Funktionen auch dann erzeugt, wenn sie nicht benötigt werden. Im Status {$W-} werden Stack-Frames nur generiert, wenn die Verwendung lokaler Variablen durch die Routine dies erforderlich macht. [/equote] |
Re: Compiler ändert asm Code ?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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