Mon programme redirige une fonction vers une autre fonction en écrivant une instruction jmp sur les premiers octets de la fonction (uniquement i386). Cela fonctionne comme prévu mais cela signifie que je ne peux plus appeler la fonction d'origine, car elle va toujours passer à la nouvelle.rediriger une fonction c à l'exécution et appeler la fonction d'origine
Il existe deux solutions de contournement possibles que je pouvais penser:
créer une nouvelle fonction qui remplace l'instruction jmp de la fonction cible et l'appeler. Ensuite, la fonction réécrit l'instruction jmp. Mais je ne suis pas sûr de savoir comment passer les arguments car il peut y avoir un certain nombre d'entre eux. Et je me demande si la fonction cible peut jmp quelque part ailleurs et sauter l'écriture de l'instruction jmp (comme lancer catch?).
Créez une nouvelle fonction qui exécute le code que j'ai écrasé avec l'instruction jmp. Mais je ne peux pas être sûr que les données écrasées sont une instruction complète. Je devrais savoir combien d'octets je dois copier pour des instructions complètes.
Alors, enfin, mes questions:
Y at-il une autre façon, je ne pensais pas?
Comment trouver la taille d'une instruction? J'ai déjà regardé binutils et trouvé this mais je ne sais pas comment l'interpréter.
Voici un exemple:
mov, 2, 0xa0, None, 1, Cpu64, D|W|CheckRegSize|No_sSuf|No_ldSuf, { Disp64|Unspecified|Byte|Word|Dword|Qword, Acc|Byte|Word|Dword|Qword }
la 2e colonne indique le nombre d'opérandes (2) et la dernière colonne contient des informations sur les opérandes, séparés par une virgule
J'ai aussi trouvé cette question qui est à peu près la même mais je ne peux pas être sûr que les 7 octets contiennent une instruction entière. Writing a Trampoline Function
Toute aide est appréciée! Merci.
Essayez-vous de faire quelque chose qui ne pouvait pas être fait beaucoup plus simple (et plus portable) avec un pointeur de fonction? – MatthewD
Je n'ai pas de conférence sur le code qui appelle la fonction, donc, non. Je ne peux pas le faire avec un pointeur de fonction. –
Peut-être que vous devriez donner plus d'informations à votre problème afin que nous puissions comprendre pourquoi vous avez choisi cette solution. Ensuite, nous pouvons vous aider ou suggérer quelque chose de mieux. – MatthewD