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.
Pouvez-vous passer au travers d'un désassembleur? –
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