AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Methodenaufruf umbiegen?

Ein Thema von Neutral General · begonnen am 26. Nov 2009 · letzter Beitrag vom 27. Nov 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:20
Hi,

Ich komme einfach direkt zum Punkt:

Delphi-Quellcode:
TTest = class
  function GetTest: String;
  function GetTest2: String;
end;
Ist es möglich einen Aufruf von GetTest auf GetTest2 umzubiegen?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:35
Mit ein wenig Umweg:

Delphi-Quellcode:
type
  TMyFunc = function: String of object;

  TMyClass
  private
    function FFunc1: String;
    function FFunc2: String;
  public
    GetText: TMyFunc;
    GetText2: TMyFunc;
  end;

implementation

constructor TMyClass(...)
begin
  GetText := FFunc1;
  GetText2 := FFunc2;
end;
Und die Zuweisungen kannst du zur Runtime beliebig umherwürfeln. Ich bin mir grad nur unsicher, ob die Syntax für TMyFunc so geht, bislang hatte ich irgendwie immer nur procedure of object genutzt
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:50
Hi,

Ich habs wohl zu allgemein ausgedrückt..

Auf die Struktur der Klasse habe ich letztendlich keinen Einfluss. Genauer gesagt habe ich soetwas:

Delphi-Quellcode:
TBeispiel = class
private
  FText: String;
  function GetText: String;
public
  property Text: String read GetText;
end;
Diese Klasse ist jetzt auch fest. Daran darf im Code nichts geändert werden.

Was ich jetzt per RTTI rausfinden kann sind die Properties.
Ich hab den Namen der Property und die Pointer zu der jeweiligen Getter und Setter Methode.

Was ich jetzt prinzipiell will ist GetText zu "hooken".

So in der Art:

Delphi-Quellcode:
function GetTextHook(Self: TBeispiel): String;
begin
  Result := Self.GetText + '_Hooked!';
end;

HookProperty(TBeispiel,'Test',mkGetter,@GetTextHook);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:53
Wie wäre es mit einer Ableitung der Klasse, die alles wie ihr Vorfahr durchreicht, aber die Property überdeckt und auf decorator-artige Weise erweitert? (Ich weiss nur grad nicht so 100%ig ob sich Properties überhaupt verdecken lassen...)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 18:53
Wenn du das hooken willst, musst du das ganz klassisch machen, also einen Jump bzw. Call an den Anfang des Methodencodes schreiben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#6

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:01
Zitat von Apollonius:
Wenn du das hooken willst, musst du das ganz klassisch machen, also einen Jump bzw. Call an den Anfang des Methodencodes schreiben.
Wenn er aber den Anfang überschreibt, dann wird es hiermit schwerer
Code:
result := [color=#ff0000]Self.GetText[/color] + '_Hooked!';
(gut, man darf dieses jetzt nicht wörtlich nehmen, denn es würde eine kleine Endlosschleife entstehen )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:08
Zitat von Medium:
Wie wäre es mit einer Ableitung der Klasse, die alles wie ihr Vorfahr durchreicht, aber die Property überdeckt und auf decorator-artige Weise erweitert? (Ich weiss nur grad nicht so 100%ig ob sich Properties überhaupt verdecken lassen...)
Das ist aber nicht was ich will..

Zitat von Apollonius:
Wenn du das hooken willst, musst du das ganz klassisch machen, also einen Jump bzw. Call an den Anfang des Methodencodes schreiben.
Ja theoretisch wäre das auch mein erster Ansatz gewesen.. Problem ist nur, dass ich blöderweise einfach keinen Platz dafür hab. Ich überschreibe ja direkt wichtigen Code
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:11
Es geht aber nicht anders. Eigenschaften existieren im Kompilat nur noch als RTTI, die Aufrufe selbst sind nur noch Methodenaufrufe bzw. Feldzugriffe. Zum Hooken musst du dir irgendeine Grenze zwischen Anweisungen suchen. Das ist ein bisschen schwierig, weil du dazu schon fast Maschinencode parsen musst. Quick & Dirty geht es aber meistens, schau dir einfach mal an, was für Code der Delphi-Compiler im Prolog generiert.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:14
Das hier:

Delphi-Quellcode:
push ebx
mov ebx, edx
// Result := 'Test';
mov eax, ebx
mov edx, $004D6A10
call UStrAsg
// end;
pop ebx
ret
allerdings ist da halt wirklich nicht viel Platz...
Das sind also 3 Bytes bevor der "Result := 'Test'"-Teil kommt... etwas wenig..
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Methodenaufruf umbiegen?

  Alt 26. Nov 2009, 19:42
Zitat von Neutral General:
Das ist aber nicht was ich will..
Aber es könnte das tun, was du hier gezeigt hast

Edit: Alles andere liefe auf recht unschönes Gehacke in der Methodentabelle hinaus, was nicht nur extrem unelegant ist, sondern aufgrund der Freiheit die ein Compiler da hat auch praktisch unportierbar - möglicherweise eben auch innerhalb der Delphiversionen. Evtl. können wir besser hier weiter machen, wenn du konkret vorstellst, was du möchtest, und vor allem in welchem Kontext. Die bisherigen Beispiele waren offenbar zu stark minimiert.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 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