How to hack der virtuellen Tabelle?
Ich würde gerne wissen, wie das ändern der Adresse von Test
die in der virtuellen Tabelle mit der HackedVTable
.
void HackedVtable()
{
cout << "Hacked V-Table" << endl;
}
class Base
{
public:
virtual Test() { cout <<"base"; }
virtual Test1() { cout << "Test 1"; }
void *prt;
Base(){}
};
class Derived : public Base
{
public:
Test()
{
cout <<"derived";
}
};
int main()
{
Base b1;
b1.Test(); //how to change this so that `HackedVtable` should be called instead of `Test`?
return 0;
}
Antwort wird sehr geschätzt werden.
Vielen Dank im Voraus.
Ich interessiere mich nicht, warum Sie dies tun wollen. Seine eine schlechte Idee. Tun Sie es nicht.
dies ist nur für die Ausbildung Zweck. ich wollte wissen, wie es funktioniert. 🙂
Kommentar ist der beste Rat, den Sie bekommen können für pädagogische Zwecke. ansonsten - einfach aufgeben, der compiler ist besser für diesen job.
Normalerweise würde ich dir Zustimmen, aber come on. Build a compiler? "Ja, entweder zu manipulieren, einige Speicher, oder erstellen einen compiler." Die zwei variieren enorm in Schwierigkeiten! Sie können nicht möglicherweise nehmen Sie sich selbst ernst, wenn Sie vorschlagen, jemand build a compiler über Herumspielen mit einigen Speicher. Es ist eine schreckliche Idee für jede Produktion code, aber Herumspielen mit diese Dinge offenbaren kann eine Menge darüber, wie Sie arbeiten, und Sie können lernen, eine Menge in den Prozess.
Ein Beispiel, wie dies funktioniert in COM (die übersetzt C++ auf windows -)
dies ist nur für die Ausbildung Zweck. ich wollte wissen, wie es funktioniert. 🙂
Kommentar ist der beste Rat, den Sie bekommen können für pädagogische Zwecke. ansonsten - einfach aufgeben, der compiler ist besser für diesen job.
Normalerweise würde ich dir Zustimmen, aber come on. Build a compiler? "Ja, entweder zu manipulieren, einige Speicher, oder erstellen einen compiler." Die zwei variieren enorm in Schwierigkeiten! Sie können nicht möglicherweise nehmen Sie sich selbst ernst, wenn Sie vorschlagen, jemand build a compiler über Herumspielen mit einigen Speicher. Es ist eine schreckliche Idee für jede Produktion code, aber Herumspielen mit diese Dinge offenbaren kann eine Menge darüber, wie Sie arbeiten, und Sie können lernen, eine Menge in den Prozess.
Ein Beispiel, wie dies funktioniert in COM (die übersetzt C++ auf windows -)
InformationsquelleAutor mahesh | 2009-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser arbeitet für 32-bit-MSVC baut (es ist eine sehr vereinfachte version von dem Teil der Produktion code, das schon seit weit über einem Jahr). Beachten Sie, dass Sie Ihre Ersatz-Methode muss explizit angeben, die
this
- parameter (Zeiger).InformationsquelleAutor Sam Harwell
V-Tabelle ist eine Implementierung detail.
Den compiler ist nicht erforderlich, um eine (es passiert einfach die einfachste Möglichkeit zum implementieren von virtuellen Funktionen). Aber zu sagen, dass jeder compiler kann (und tut), dann implementieren Sie es etwas anders als Ergebnis gibt es keine Antwort auf deine Frage.
Wenn Sie sich Fragen, wie Hacke ich eine vtable für ein Programm gebaut mit:
Compiler <X> Version <Y> Aufbau <Z>
Dann jemand vielleicht die Antwort wissen.
InformationsquelleAutor Martin York
dies ist ganz verschiedene daraus resultierenden Funktionalität als meine. Hier, es ersetzt die Funktionen für eine einzelne Instanz (b1). In mir, es ersetzt die Funktionen für alle Instanzen eines bestimmten Typs.
InformationsquelleAutor Ganesh Kundapur
Ich glaube nicht, dass es ist ein tragbares Art und Weise. Vor allem, weil der compiler-Optimierung und verschiedenen Architektur-ABI zwischen jedes Ziel.
Aber C++ bietet Sie mit, dass genau die gleiche Funktion, warum nicht verwenden es?
Sie will es gar nicht wissen. Auch für pädagogische Zwecke, die Theorie ist fine in diesem Fall. Der compiler weiß viel mehr als Sie über Ihr Programm, als Sie vielleicht denken, so messing mit einer Tabelle, die möglicherweise oder möglicherweise nicht vorhanden (in diesem Fall, niemals, da es nicht in Gebrauch ist), ist eine schlechte Idee und wird nur dazu führen, dass Sie denken, du bist ein schlechter Programmierer von segfaulting zu viel. Nicht.
Ja ich möchte auf jeden Fall wissen. Der Unterschied ist, dass Ihre Methode compile-Zeit, während die brauche ich run-time änderung, die virtuelle Funktionen / Tabelle.
InformationsquelleAutor LiraNuna
Einen anderen Weg, das gleiche zu erreichen, ist durch checken ähnliche code:
GObject:
http://en.wikipedia.org/wiki/Gobject
GLib:
http://en.wikipedia.org/wiki/GLib
Vala:
http://en.wikipedia.org/wiki/Vala_%28programming_language%29
Diese Jungs wollten an die Arbeit mit einem Objekt und Klasse-orientierte Programmier-Sprache, aber "C++", passte nicht Ihre Voraussetzungen. Dann nahmen Sie "plain C", und simulieren Sie die Objekte mitn records & Zeiger, auch "Virtuelle" Tabellen-Methode. Schließlich hat eine ähnliche Sprache namens "Vala", Ihre eigene "C++" gleichermaßen Sprache (mit Ihren eigenen V. M. T.).
Andere Verwandte links:
http://en.wikipedia.org/wiki/Virtual_method_table
http://www.artima.com/insidejvm/ed2/jvmP.html
Cheers.
InformationsquelleAutor umlcat
Unter Mac-OS X 10.10.3 + gcc 4.8.3, der folgende code funktioniert gut.
Seinen Ausgang:
Teste ich den gleichen code unter Ubuntu 12.04 + g++ 4.9.0. Jedoch, es funktioniert nicht, und entsteht segmentation fault.
Es scheint, daß Linux weist die virtuelle Funktion Tabelle in einem nur-lese-Bereich (z.B. rodata) zu verbieten hacken.
InformationsquelleAutor chetui
gut, es ist ziemlich einfach herauszufinden. Finden hte VTAble-Zeiger (In visual studio seine ersten 4/8 bytes). Anschließend Schritt für Schritt in einen normalen Aufruf von Test (in assembler) und du wirst es sehen, springen Sie auf die Vtable und dann zu Ihrem test-Funktion. Überschreiben testen, ersetzen Sie einfach den Mauszeiger auf die Stelle, Sie sprang von der VTable.
InformationsquelleAutor Goz
Dies ist in der Regel als "virtuelle Tabelle "Einhaken" oder so ähnlich.
Wenn du gehst, es zu benutzen viel, dann schlage ich vor, die SourceHook Bibliothek. Es wurde entwickelt für hacking-closed-source-game-engines in der game-mods. Zum Beispiel wurde es in The Dark Mod vor idTech4 wurde open source.
InformationsquelleAutor stgatilov
Ich glaube nicht, dass die vTable ist im nur-lese-Bereich, da ist es dynamisch aufgefüllt. Der einzige Weg, es kann fehlschlagen, wenn der compiler ist absolut sicher, welche Implementierung aufgerufen wird im compile-Zeit und überspringen Sie die vTable-lookup für den direkten Aufruf der Funktion(de-Virtualisierung).
VTables sind nicht dynamisch aufgefüllt, aber festgelegt zur compile-Zeit. Ob oder nicht dieses segment beschreibbar ist, ist systemabhängig. Der vtable-Zeiger (innerhalb der Instanz der Klasse) fair-Spiel und könnte umgeschrieben werden, zeigen Sie auf eine benutzerdefinierte vtable. Just sayin'.
InformationsquelleAutor Nik.B