Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi user defined calling convention hooken (https://www.delphipraxis.net/110112-user-defined-calling-convention-hooken.html)

Neotracer64 13. Mär 2008 00:25


user defined calling convention hooken
 
Hallo,

Ich muss eine Funktion hooken, dessen Parameter halb über register und halb normal über den Stack übergeben werden.

1. Parameter in EAX
2. Parameter in EDI
3. Parameter in [ESP]
4. Parameter in [ESP+04]

Pseudo-Typedef:
procedure sub_WalkList(a1<eax>, a2<edi>, a3, a4: DWORD);

Wie setze ich nun am besten meinen Callback auf, sodass keine Parameter zerstört werden?

Zum testen habe ich folgendes probiert:

Delphi-Quellcode:
procedure Callback_WalkList(a3, a4: DWORD);
begin
  new_WalkList(a3,a4);
end;
Da nichts in der Funktion gemacht wird, dachte ich, dass EAX und EDI unberührt bleiben würden. Aber anscheind irrte ich mich da.
Denn Delphi benutzt EAX um die Parameter auf den Stack zu pushen. :/

Hier beim Aufruf von new_WalkList()

Delphi-Quellcode:
01731A64   55               PUSH EBP
01731A65   8BEC            MOV EBP,ESP
01731A67   8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C] // Parameter in EAX wird zerstört
01731A6A  50               PUSH EAX
01731A6B  8B45 08          MOV EAX,DWORD PTR SS:[EBP+8]
01731A6E  50               PUSH EAX
01731A6F  FF15 44477301    CALL DWORD PTR DS:[1734744]
Wie verhindere ich nun, dass Delphi EAX für den Funktionsaufruf nutzt? :/
Den sonstigen Erhalt beider Register kann ich ja problemlos mit InlineASM per PUSH und POP vom/auf den Stack regeln.

Der.Kaktus 13. Mär 2008 06:16

Re: user defined calling convention hooken
 
hallo,

liegt doch noch ordentlich im Stack oder?..pop evtl.?

sirius 13. Mär 2008 07:57

Re: user defined calling convention hooken
 
evtl. so:
Delphi-Quellcode:
function new_WalkList(a1,a2,a3,a4:DWord):DWord;
begin
  ...
end;


procedure Callback_WalkList;
asm
  mov edx,edi
  pop ecx
  call new_WalkList;
end;

Neotracer64 13. Mär 2008 14:09

Re: user defined calling convention hooken
 
Hallo, danke für die Antworten. :)
Ich hab es jetzt so gelöst:

Delphi-Quellcode:
procedure Callback_WalkList(a1,a2,a3,a4: DWORD);
asm
  POP EBP
  JMP new_WalkList;
end;

Das jumpt dann direkt zum Trampolin der Original-Funktion. Das POP EBP weil keine naked function calls mit delphi gehen und ich den aufgebauten stackframe wieder kaputt machen muss, weil sonst die return addresse nicht mehr stimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 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