Domanda

Sono nel processo di reverse-engineering di un eseguibile di Windows. Ho trovato una classe che voglio usare da qualche codice che ho iniettare il file eseguibile (thread diverso, proprio stack). Come potrei fare per dichiarare una tale classe, dato indirizzi di metodo e la struttura variabili membro?

Per esempio, diciamo che ho trovato una classe chiamata foo, con il suo costruttore @ 0x4012D30 e una funzione doTheMario @ 40125D4. So anche che detiene tre DWORD di dati privati. Dal momento che entrambi i metodi sono _thiscalls, dichiaro una classe in questo modo nel mio codice:

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

Ora, questa è una classe perfettamente dandy, ma ora c'è un modo per rendere il compilatore / linker legano i metodi della classe ai due indirizzi precedenti ho dichiarato? Certo che posso scrivere un wrapper di ASM per convertire uno stdcall in un thiscall per ogni metodo che ho bisogno di usare, e quindi utilizzare le strutture al posto delle classi, ma ci deve essere un modo migliore.

Io uso gcc / g ++ al momento, ma posso passare a VC ++ (dal asm inline di GCC mi dà il mal di testa in ogni caso).

È stato utile?

Soluzione

Se la classe non ha vtable, si potrebbe, in linea di principio, creare una classe nel proprio codice, in cui tutte le chiamate alla funzione invocare le opportune implementazioni reali. È possibile farlo da strizzare le funzioni membro come funzioni nudi contenente un istruzioni di montaggio salto per l'effettiva attuazione.

Se la classe ha un vtable, le cose sono suscettibili di ottenere molto più complessa; è probabile che tu bisogno di creare in modo esplicito il vtable come una struttura di puntatori a funzione, e rendere la vostra funzione chiamata stub in loro. Questo mezzo funzioni spessoramento più complesse; una semplice funzione di nudo con un salto può non essere sufficiente, e può essere meglio andare con una funzione reale. Ricordate, però, che le funzioni membro su Win32 utilizzano un vocazione diversa convenzione ; Ciò significa che una chiamata di funzione socio ordinario non funzioneranno. È possono essere in grado di farla franca con la costruzione di puntatori-a-membri funzioni, ma di tenere presente che hanno un struttura piuttosto strana a loro, e avrete bisogno di abbinarlo con qualcosa che ha la stessa rappresentazione come i puntatori vtable. Buona fortuna!

Altri suggerimenti

Sei reverse-engineering qui, quindi (quasi, probabilmente) costretti a ottenere più basso quando si tratta di interagire con il codice esistente.

mi piacerebbe chiamare questa funzione utilizzando il codice assembly puro.
Se è fissato l'indirizzo di base del EXE è ancora più facile.
Esempio di codice:

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

È sufficiente verificare come questa funzione viene chiamata dal codice originale per vedere in quale ordine è necessario spingere argomenti. Non dimenticate che alcuni argomenti potrebbero aver bisogno di essere passato attraverso i registri!

Non sono del tutto sicuro che ho capito bene, ma in ogni caso: penso che la via più semplice per "mano localizzazione" metodi è quello di utilizzare la funzione puntatori

.

C ++ non definisce alcun tipo di interfaccia binaria rendendo praticamente impossibile realizzare qualsiasi tipo di dinamica vincolante per classi C ++.

il meglio che puoi fare è quello di dichiarare due le strutture -. Uno contenente typedef funzione C per ogni metodo, gli altri specchi il layout dei dati di classe

Naturalmente - perché __thiscall su un metodo di classe passa 'questo' tramite il registro ECS, io non belive si può effettivamente fare una dichiarazione di funzione c esplicita che avrà lo stesso effetto in modo potrebbe essere necessario eseguire tutte le chiamate tramite un custom "CallThisCallMethodWithParameters" che si aveva di scrittura in assemblea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top