Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Mi 31.01.07 21:13 
Hi Leute,

ich habe ein Problem :)

durch etwas Patchen von Pointern möchte ich eine Intercept-Funktion in einen Prozess zwischenschalten, um den Parameterfluss an einer Stelle loggen zu können.

Die Funktion, die ich dabei intercepten möchte, ist ein Teil einer Klasse. Der Pointer befindet sich also vielfaches von 4 unter der Position der Klasse.

Gesagt getan ich leite alle Funktionsaufrufe dieser Methode auf meine Intercept Funktion um.

Das Problem, was sich dabei ergibt ist die Aufrufkonvetion der Zielfunktion. Es handelt sich dabei um einen FastCall, eine auf Speed getrimmte Parameterübergabe Varainte von MSVC Proc1(ECX, EDX, stack1, stack2, stack3 .....).

Delphi biete diese Konvention leider nicht an. Ein artverwandtes Pendant ist Borland's "register" Aufruf Proc1(EAX, EDX, ECX, stack1, stack2, stack3, ...)

Nun zu meinem Problem^^

Meine Zielfunktion wird also mit "fastcall" aufgerufen. Meine Intercept Funktion kann kein "fastcall" und versucht mit "register" zu kompensieren. Die Zielfunktion hat drei Parameter

Irgendwie ist da bei mir der Wurm drin.

Wie gelingt es mir an das 3. Parameter der Funktion zugelangen.

Org_Proc(ECX, EDX, stack1)
Intercep(EAX, EDX, ECX, stack1)

Org_Param1 befindet sich in Intercept_Param3
Org_Param2 befindet sich in Intercept_Param2
Org_Param3 befindet sich NICHT :[ in Intercept_Param4

Was ist schief gelaufen?
Hat meine Idee eine Macke?
Habe gehört die Richtung (left to right) der Parameterübergabe ist unterschiedlich in registern und stack und unterscheidet sich in "register" und "fastcall".

Alles sehr verwirrend.

Hat jemand vielleicht eine Idee über inline Assembler oder ein Funktions-Prefab für diesen Fall?

Bin für jeden Kommentar oder jede andere Art von Hilfe dankbar

Mit freundlichen Grüßen
Tobi
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 31.01.07 22:51 
Da musst Du ein wenig mit ASM die Dinge gerade biegen ;-)

In welchem Register übergibt MSVC den Instanzen-Zeiger? Ohne die Info macht sich das etwas schlecht, die ASM-Intercept-Routine zu schreiben ... Wenn de mir die Info noch geben kannst, sollte das kein Thema sein ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 01.02.07 11:21 
user profile iconTobi482 hat folgendes geschrieben:
Hi Leute,

ich habe ein Problem :)

durch etwas Patchen von Pointern möchte ich eine Intercept-Funktion in einen Prozess zwischenschalten, um den Parameterfluss an einer Stelle loggen zu können.

Die Funktion, die ich dabei intercepten möchte, ist ein Teil einer Klasse. Der Pointer befindet sich also vielfaches von 4 unter der Position der Klasse.

Gesagt getan ich leite alle Funktionsaufrufe dieser Methode auf meine Intercept Funktion um.

Das Problem, was sich dabei ergibt ist die Aufrufkonvetion der Zielfunktion. Es handelt sich dabei um einen FastCall, eine auf Speed getrimmte Parameterübergabe Varainte von MSVC Proc1(ECX, EDX, stack1, stack2, stack3 .....).

Delphi biete diese Konvention leider nicht an. Ein artverwandtes Pendant ist Borland's "register" Aufruf Proc1(EAX, EDX, ECX, stack1, stack2, stack3, ...)

....

Mit freundlichen Grüßen
Tobi


Hallo,

falls du mit dem Umstellen der Reihenfolge nicht klarkommst, bleibt dir ja immer noch die Möglichkeit, eine Stub in C/C++ zu schreiben, der die DLL-Routine mit fastcall aufruft, selbst aber als stdcall definiert ist - ist wahrscheinlich einfacher als in Assembler, und du must dazu nicht alles wissen, etwa über verborgene Parameter.

Gruss Reinhard