Question

Est-il possible à l'aide des outils GNU (gcc, binutils, etc.) pour modifier toutes les occurrences d'une instruction d'assemblage dans un no-op? Plus précisément, gcc avec l'option -p génère l'ensemble suivant (ARM):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

Je veux enregistrer l'adresse de cette dernière instruction, puis changer à un nop comme dans le code suivant

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Le noyau Linux peut faire quelque chose de similaire à ce lors de l'exécution, mais je suis à la recherche d'une solution à la compilation.

Était-ce utile?

La solution

Ce sera certainement plus facile avec un format d'instruction de longueur fixe RISC-ish que pour exemple x86.

Il devrait être relativement simple à utiliser libelf (nice tutoriel ici: http : //people.freebsd.org/~jkoshy/download/libelf/article.html ) ou libbfd ( http://sourceware.org/binutils/docs-2.19/bfd/index.html ) pour ouvrir le fichier objet, modifier les instructions dans la section .text, et écrire à nouveau en utilisant les API fournies. Que ce soit en vaut la peine ou non dépendra de considérations non techniques (je suis un peu curieux mais ...).

Il convient de mentionner qu'il pourrait y avoir quelques rides avec l'aide libelf ou libbfd si cela doit travailler dans un environnement multi-développement.

Autres conseils

Vous pouvez compiler le code avec gcc -S pour émettre un listing assembleur, au lieu de compiler complètement dans un fichier objet ou exécutable. Ensuite, il suffit de remplacer les instructions voulues sans-ops (par exemple en utilisant sed), et continuer la compilation à partir de là.

Si vous voulez aussi faire pour les fichiers d'objets ou bibliothèques que vous ne disposez pas du code source original pour, vous aurez à la place doivent utiliser un outil tel que objdump(1) pour les démonter et obtenir les adresses des instructions que vous souhaitez remplacer. Ensuite, analyser les en-têtes de fichier objet pour trouver les décalages dans le fichier de ces instructions, puis remplacer les instructions de la machine sans-ops directement dans les fichiers objet. Ceci est un peu plus délicat, mais faisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top