![]() |
Delphi-Version: 2010
Adresse einer privaten Methode bekommen
Hallo,
ist es möglich die Adresse einer privaten Methode zur Laufzeit zu bestimmen? Eine "Hack"/"Dummy"-Klasse kommt in diesem Fall nicht in Frage, da der Code für mehrere Versionen der Klasse arbeiten soll. Ich habe gedacht, dass das bestimmt mit der RTTI geht, aber
Delphi-Quellcode:
gibt leider für private Methoden immer nil zurück.
TRttiType.GetMethod()
Es muss aber einen Weg geben, da Delphi in der CPU-Ansicht den Namen anzeigen kann. Es ist auch möglich per Name zu dieser Funktion zu springen. Grüße, Win32.API |
AW: Adresse einer privaten Methode bekommen
Wozu brauchst du die Adresse einer privaten Methode?
|
AW: Adresse einer privaten Methode bekommen
Funktioniert
Delphi-Quellcode:
?
TMyClass.MethodAddress('MyMethod')
|
AW: Adresse einer privaten Methode bekommen
Das würde ja dem Prinzip des information hiding ( black box) widersprechen
|
AW: Adresse einer privaten Methode bekommen
Das Ganze scheitert schon am Konzept. Du kannst nicht die Adresse einer privaten Prozedur auslesen. Eine private Prozedur ist vom Konzept her (ähnlich wie protected) nur INNERHALB eines Objektes verwendbar. Du kannst sie also auch nicht von außen aufrufen, weil es so aussieht, als würde sie gar nicht existieren. Somit kann sie von RTTI nicht gefunden werden.
Bernhard |
AW: Adresse einer privaten Methode bekommen
Delphi-Quellcode:
liest aber direkt die VMT aus.
MethodAddress
|
AW: Adresse einer privaten Methode bekommen
Vielen Dank für die raschen Antworten :thumb:!
Ich brauche die Adresse um einen Bug in der Komponente zu beseitigen. Mir ist auch klar, dass es gegen das Konzept von OOP geht. Aber leider lässt es sich in diesem Fall nicht verhinden.
Delphi-Quellcode:
gibt leider auch nil zurück.
TMyClass.MethodAddress('MyMethod')
Alle Methoden, egal ob privat oder public, sind nur innerhalb einer Object-Instanz verwendbar (Class Functions/Procesdures und Hacks ausgeschlossen). Ich will sie auch nicht aufrufen sondern sie Hooken. //Win32.API |
AW: Adresse einer privaten Methode bekommen
Zitat:
Hast du den Source der Komponente? |
AW: Adresse einer privaten Methode bekommen
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Zitat:
Nein, der Source liegt leider nicht vor. Zitat:
Also muss an die Funktions Adresse ein:
Code:
gepatch werden.
xor eax, eax
add eax, 1 retn |
AW: Adresse einer privaten Methode bekommen
Dann frag den Rückabe wert nicht ab? Wenn der immer true sein soll ist das Result ja egal
|
AW: Adresse einer privaten Methode bekommen
Eine Rückgabe die immer True ergibt? Dann könnte man ja auf die Rückgabe verzichten
|
AW: Adresse einer privaten Methode bekommen
Zitat:
Spannendes Problem :twisted: |
AW: Adresse einer privaten Methode bekommen
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Dann melde es dem Hersteller
|
AW: Adresse einer privaten Methode bekommen
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Delphi-Quellcode:
Das funktioniert bei mir. Ich weiß allerdings nicht genau was du damit meinst:
unit Unit1;
interface uses classes; type TMyClass = class strict private procedure BuggyMethod; end; TMyClassHack = class helper for TMyClass public function GetBuggyMethodAddress: Pointer; end; procedure Test; implementation uses SysUtils; { TmyClassHack } function TMyClassHack.GetBuggyMethodAddress: Pointer; asm lea eax, [0+TMyClass.BuggyMethod] end; { TMyClass } procedure TMyClass.BuggyMethod; begin writeln('hello'); end; procedure Test; var Obj: TMyClass; Addr: Pointer; begin Obj := TMyClass.Create; writeln(format('%p',[Obj.GetBuggyMethodAddress])); Addr := Obj.GetBuggyMethodAddress; asm call Addr end; Obj.Free; end; end. Zitat:
|
AW: Adresse einer privaten Methode bekommen
strict private sollte doch eigentlich komplett privat sein, also nichtmal in einer anderen Klasse, der selben Unit.
Und selbt normale private Methoden kann man "eigentlich" nicht von anderen Units aus aufrufen. Wollte erst fragen, ob du das auch mal mit getrennten Units getestes hast, aber selbst da geht es. Also dieser Hack ist dann ja richtig böse :shock: Es gibt abner noch einen einfachen Hack, um virtuelle private Methoden zu bekommen ... ohne RTTI- oder VMT-Auslesen und so. Einfach 'ne Dummy-Klasse, ebenfalls mit diesen virtuellen Methoden (natürlich in selber Reihenfolge) erstellen und rübercasten. |
AW: Adresse einer privaten Methode bekommen
Zitat:
Zitat:
[edit] Zitat:
[/edit] |
AW: Adresse einer privaten Methode bekommen
Hättest du das nicht mal vor 'nem knappen Jahr sagen können?
Weil irgendein "Arsch" TApplication.ProcessMessage als Privat deklariert hat, kommt man da einfach nicht ran und so hätte ich mir vel Arbeit und umständliche Alternativen ersparen können. :cry: Hey, jetzt könnte man vermutlich auch Hagens Delay mit einer noch besseren Zeiteinhaltung versehen, selbst wenn viele Messages eintreffen :thumb: |
AW: Adresse einer privaten Methode bekommen
So weit es möglich ist sollte man eh uaf solche Hacks verzichten. Denn diese Lücke könnte irgendwann geschlossen werden
|
AW: Adresse einer privaten Methode bekommen
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Zitat:
Es gibt z.B. keinen Grund, warum ProcessMessage (drum sind dieses und Delay soein schönes Beispiel) versteckt sein muß. ProcessMessages bearbeitet immer alle Messages, bis nix mehr da ist. ProcessMessage verarbeitet nur die nächste Message, also könnte man damit. Somit könnte Delay hier seine Pausenzeiten besser einhalten, da man die Verarbeitung eher abbrechen könnte und nicht alles sofort verarbeitet. Zitat:
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Zitat:
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Zitat:
|
AW: Adresse einer privaten Methode bekommen
Zitat:
Jawoll :thumb:. Das Zusammenspiel aus Classhelper und Zugriff via Assembler macht es Möglich. Mit Hack-Klasse meinte ich eine Klasse, die exakt gleich deklariert ist, aber die entsprechende Methode als public deklariert. Somit liegt im Speicher alles an der gleichen Stelle und der Zugriff ist auch Möglich. Grüße, Win32.API |
AW: Adresse einer privaten Methode bekommen
Zitat:
und mit Feldern. Normalte Methoden kann man so nicht zugänglich machen, da diese direkt im Quellcode, bei allen Aufrufen, und z.B. nicht über die VMT des erzeugten Objekts adressiert sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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