Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Compiler ändert asm Code ? (https://www.delphipraxis.net/140239-compiler-aendert-asm-code.html)

TKC 14. Sep 2009 10:47


Compiler ändert asm Code ?
 
Hallo,

ich benutze folgende Funktion um meinen Hook zu überspringen.

Delphi-Quellcode:
function xPostMessage(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
asm
      mov edi, edi
      push ebp
      mov ebp, esp
      jmp OldDllFunc
end;
Warum macht der Compiler dann folgenden Code daraus, bzw. wie kann ich verhindern das er es macht ?

Code:
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]
Wie man sieht hat er einiges geändert.

Apollonius 14. Sep 2009 10:53

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.

Muetze1 14. Sep 2009 11:07

Re: Compiler ändert asm Code ?
 
Schlüsselwort [oh]assembler;[/oh] vor stdcall; angeben.

gammatester 14. Sep 2009 11:32

Re: Compiler ändert asm Code ?
 
Was ist der Sinn von mov edi, edi?
Meinst Du mov edi, [edi]?

Apollonius 14. Sep 2009 11:38

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.

sirius 14. Sep 2009 12:19

Re: Compiler ändert asm Code ?
 
Zitat:

Zitat von Muetze1
Schlüsselwort [oh]assembler;[/oh] vor stdcall; angeben.

Und in welchen Delphi-Versionen funktioniert das? In D7 schon mal nicht.

TKC 14. Sep 2009 13:32

Re: Compiler ändert asm Code ?
 
Zitat:

Zitat von Muetze1
Schlüsselwort [oh]assembler;[/oh] vor stdcall; angeben.

Also in Delphi 2010 funktioniert das auch nicht !

TKC 14. Sep 2009 13:32

Re: Compiler ändert asm Code ?
 
Zitat:

Zitat von Apollonius
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.

Klingt etwas umständlich aber ich werde es einmal versuchen.

TKC 14. Sep 2009 13:36

Re: Compiler ändert asm Code ?
 
Also ich hab jetzt ne einfache Möglichkeit gefunden.

wenn ich es so mache ...
Delphi-Quellcode:
function xPostMessage(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
 asm
      mov edi, edi
      jmp OldDllFunc
end;
wird daraus ...

Code:
003A5C60 G> $  55                push   ebp
003A5C61    . 8BEC             mov    ebp, esp
003A5C63    . 89FF             mov    edi, edi
003A5C65    . FF25 70FF3A00     jmp    near dword ptr [3AFF70]
und es funktioniert.

Apollonius 14. Sep 2009 13:44

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Seite 1 von 3  1 23      

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