2010-03-23 33 views
6

J'utilise Detours pour me connecter à la fonction de message d'un exécutable, mais j'ai besoin d'exécuter mon propre code et ensuite d'appeler le code original. D'après ce que j'ai vu dans les docs de Detours, il semble vraiment que cela devrait se faire automatiquement. La fonction d'origine imprime un message à l'écran, mais dès que j'attache un détour, il commence à exécuter mon code et arrête l'impression.Nécessité d'appeler la fonction d'origine à partir de la fonction déviée

Le code de fonction d'origine est à peu près:

void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB); 

Ma fonction est:

void CGuiObject_AppendMsgToBuffer([same params, with names]); 

Je sais la position de mémoire de la fonction d'origine réside, donc en utilisant:

DWORD OrigPos = 0x0040592C; 
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer); 

me fait entrer dans la fonction. Ce code fonctionne presque parfaitement: ma fonction est appelée avec les paramètres appropriés. Cependant, l'exécution quitte ma fonction et le code d'origine n'est pas appelé. J'ai jmping essayé, mais cela bloque le programme (je suppose que le code Detours déplacé pour adapter le crochet est responsable de l'accident).

Modifier: J'ai réussi à résoudre le premier problème, sans retourner à l'exécution du programme. En appelant la valeur OrigPos en tant que fonction, je peux aller à la fonction "trampoline" et à partir de là sur le code original. Cependant, quelque part le long des lignes les registres sont en train de changer et cela provoque le crash du programme avec un segfault dès que je reviens dans le code d'origine.

Edit2: Code de travail final:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

et en utilisant TrueAddr pour la première à DetourAttach param.

+0

Pouvez-vous passer au travers d'un désassembleur? –

+0

Oui, j'ai construit dans le débogage et mis un point de rupture au début de ma fonction. Le code frappe cela, je pushad, faire un peu de journalisation (envoyer le message à un fstream en utilisant l '"opérateur"), popad, et jmp à l'adresse Detours retourné. L'exécution passe par les éléments copiés et revient dans l'exécutable d'origine. Il fonctionne pour quelques lignes, mais autant que je puisse voir, ECX est réinitialisé à 0 et est utilisé comme un pointeur, d'où le segfault. Si cela ne vous aide pas, je peux poster du code complet avec asm. – ssube

Répondre

1

Étant donné que vous essayez d'intercepter un appel de méthode C++, vous avez probablement un problème de convention d'appel lorsque vous appelez la fonction d'origine.

Je n'ai pas essayé de le faire personnellement avec des détours, mais cet article montre quelque chose qui pourrait vous aider. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods Voir le lien dans la deuxième réponse.

+0

Cela a fonctionné, d'une manière ronde. Au final, j'ai créé une classe de squelette qui fonctionne parfaitement. Il peut même s'appeler pour insérer des messages dans la file d'attente ou ignorer les parties finales pour empêcher un message. Merci pour le lien! :) – ssube