Question

Je suis en train de rétro-ingénierie d'un exécutable Windows. J'ai trouvé une classe que je veux utiliser à partir du code que j'injectent dans le fichier exécutable (thread différent, propre pile). Comment pourrais-je aller sur la déclaration d'une telle adresses de classe, méthode donnée et les variables membres la structure?

Par exemple, disons que je trouve une classe appelée foo, avec le constructeur de it @ 0x4012D30 et une fonction doTheMario @ 40125D4. Je sais aussi qu'il détient trois DWORDs de données privées. Étant donné que les deux méthodes sont _thiscalls, je déclare une classe comme si dans mon code:

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

Maintenant, c'est une classe parfaitement dandy, mais est maintenant il possible de faire lier le compilateur / éditeur de liens les méthodes de classe aux deux adresses précédentes, je déclaré? Bien sûr, je peux écrire une enveloppe asm pour convertir un stdcall en thiscall pour chaque méthode que je dois utiliser, puis utiliser struct au lieu de classes, mais il doit y avoir une meilleure façon.

J'utilise gcc / g ++ pour le moment, mais je peux passer à VC ++ (depuis l'assembleur en ligne de gcc me donne des maux de tête de toute façon).

Était-ce utile?

La solution

Si la classe n'a pas vtable, vous pouvez, en principe, créer une telle classe dans votre propre code, où tous les appels de fonction Invoke les implémentations réelles appropriées. Vous pouvez le faire en essorez les fonctions membres comme fonctions nues contenant une instruction de saut d'assemblage pour la mise en œuvre réelle.

Si la classe a une vtable, les choses sont susceptibles d'obtenir beaucoup plus complexe; vous aurez probablement besoin de créer explicitement le vtable comme struct des pointeurs de fonction, et de faire en eux l'appel de votre fonction. Ce moyen de fonctions de calage plus complexes; une simple fonction nue avec un saut peut ne pas être suffisant, et il peut être préférable d'aller avec une fonction réelle. Rappelez-vous, cependant, que les fonctions membres sur win32 utilisent un différents appels convention ; cela signifie qu'un appel de fonction de membre ordinaire ne fonctionnera pas. Vous peut être en mesure de sortir avec des pointeurs à-membres des fonctions de construction, mais gardez à l'esprit qu'ils ont un

Autres conseils

Vous êtes ici ingénierie inverse, donc (presque, probablement) obligé d'obtenir moins quand il s'agit d'interagir avec le code existant.

J'appeler cette fonction à l'aide du code assembleur pur.
Si l'adresse de base de EXE est fixé, il est encore plus facile.
Exemple de code:

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

vérifier simplement comment cette fonction est appelée par le code d'origine pour voir l'ordre dans lequel vous devez pousser des arguments. Ne pas oublier que certains arguments pourraient devoir passer à travers les registres!

Je ne suis pas tout à fait sûr que je vous comprends bien, mais de toute façon: Je pense que la voie la plus facile aux méthodes « de localisation main » est en utilisant la fonction pointeurs

.

C ++ ne définit aucun type d'interface binaire rendant presque impossible de mettre en œuvre toute sorte de liaison dynamique pour des classes C ++.

le mieux que vous pouvez faire est de déclarer deux struct -. Contenant un typedefs fonction c pour chaque méthode, les autres miroirs la mise en page de données de classe

Bien sûr - parce que __thiscall sur une méthode de classe passe « ce » via le ecs inscrivez-vous, je ne crois que vous pouvez réellement faire une déclaration de fonction explicite c qui aura le même effet que vous pourriez avoir besoin d'effectuer tous les appels via une commande « CallThisCallMethodWithParameters » que vous aviez écriture dans l'assemblage.

scroll top