Frage

Ich bin gerade dabei, eine ausführbare Windows umgekehrt zu entwickeln. Ich habe eine Klasse gefunden, die ich aus einem Code verwenden möchte, den ich in die ausführbare Datei injiziere (unterschiedlicher Thread, eigener Stack). Wie würde ich eine solche Klasse, angegebene Methodenadressen und Mitgliedsvariablenstruktur deklarieren?

Angenommen, ich habe eine Klasse namens Foo mit seinem Konstruktor @ 0x4012D30 und einer Funktion Dothemario @ 40125D4 gefunden. Ich weiß auch, dass es drei Dwords privater Daten enthält. Da beide Methoden _thiscalls sind, erkläre ich eine Klasse wie in meinem Code:

class GuessedFoo {
    private:
        int bar;
        char *cafebabe;
        float deadbeef;
    public:
        GuessedFoo(int a, int b);
        void doTheMario();
};

Dies ist eine perfekt Dandy -Klasse, aber jetzt gibt es eine Möglichkeit, den Compiler / Linker die Klassenmethoden an die beiden vorherigen Adressen zu binden, die ich angegeben habe? Natürlich kann ich einen ASM -Wrapper schreiben, um eine stdcall in eine Thiscall für jede Methode umzuwandeln, die ich verwenden muss, und dann Strukturen anstelle von Klassen verwenden, aber es muss einen besseren Weg geben.

Ich verwende im Moment GCC/G ++, aber ich kann zu VC ++ wechseln (da GCCs Inline ASM mir sowieso Kopfschmerzen gibt).

War es hilfreich?

Lösung

Wenn die Klasse kein VTable hat, können Sie im Prinzip eine solche Klasse in Ihrem eigenen Code erstellen, in dem alle Funktionen auf die entsprechenden realen Implementierungen aufrufen. Sie können dies tun, indem Sie die Mitgliedsfunktionen als Wringen als Wringen Nackte Funktionen enthält einen Montage -Sprunganweis für die tatsächliche Implementierung.

Wenn die Klasse eine VTable hat, werden die Dinge wahrscheinlich viel komplexer; Sie müssen wahrscheinlich explizit die VTable als Struktur von Funktionszeigern erstellen und Ihre Funktionsstummel in sie aufrufen. Dies bedeutet komplexere Schimfunktionen; Eine einfache nackte Funktion mit einem Sprung reicht möglicherweise nicht aus, und es ist möglicherweise besser, eine echte Funktion zu erreichen. Denken Sie jedoch daran, dass das Mitglied auf Win32 funktioniert a Andere Anrufkonvention; Dies bedeutet, dass ein gewöhnlicher Mitgliederfunktionsaufruf nicht funktioniert. Du kann in der Lage sein, mit dem Aufbau von Zeiger zu Mitgliedern davon zu kommen, aber denken Sie daran, dass sie eine haben ziemlich seltsame Struktur Für sie, und Sie müssen es mit etwas übereinstimmen, das die gleiche Darstellung wie die vtable Zeiger hat. Viel Glück!

Andere Tipps

Sie sind hier umgekehrt, daher (fast, wahrscheinlich) gezwungen, bei der Interaktion mit vorhandenem Code niedriger zu werden.

Ich würde diese Funktion mit einem reinen Montagecode aufrufen.
Wenn die Basisadresse des EXE festgelegt ist, ist sie noch einfacher.
Beispielcode:

void main()
{
    int bar = 5;
    int * cafebabe = &bar;
    __asm
    {
        push [bar];
        push [cafebabe];
        mov eax, 123456; // address of the function
        call eax;
    }
}

Überprüfen Sie einfach, wie diese Funktion vom Originalcode aufgerufen wird, um zu sehen, in welcher Reihenfolge Sie Argumente überschreiten müssen. Vergessen Sie nicht, dass einige Argumente möglicherweise durch Register weitergeleitet werden müssen!

Ich bin mir nicht ganz sicher, ob ich Sie richtig verstehe, aber trotzdem denke ich: Ich denke, der einfachste Weg zu "Handlager" -Methoden ist die Verwendung von Funktionsbecken.

C ++ definiert keine binäre Schnittstelle, was es so gut wie unmöglich macht, irgendeine Art von dynamischer Bindung für C ++ - Klassen zu implementieren.

Das Beste, was Sie tun können, ist, zwei Strukturen zu deklarieren - eine, die eine C -Funktion typedefs für jede Methode enthält, das andere das Klassendatenlayout widerspiegelt.

Natürlich - weil __thiscall auf einer Klassenmethode über das ECS -Register 'this' übergeht, glaube ich nicht, dass Sie tatsächlich eine explizite C -Funktionserklärung abgeben können "CallThiscallMethodwithParameters", den Sie in der Versammlung geschrieben haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top