Der Versuch, no-op eine Anweisung
-
16-09-2019 - |
Frage
Ist es möglich, mit GNU-Tools (gcc, binutils, usw.) alle Vorkommen einer Montageanleitung in eine no-op ändern? Insbesondere gcc mit der Option -pg generiert die folgende Anordnung (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>
Ich mag die Adresse dieser letzten Anweisung erfassen und sie dann wie im folgenden Code zu einer nop ändern
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)
Der Linux-Kernel kann zur Laufzeit etwas ähnliches wie dies tun, aber ich bin für eine Build-time Lösung suchen.
Lösung
Dies wird sicherlich einfacher, mit einem RISC-ish mit fester Länge Befehlsformat als für z.B. x86.
Es sollte relativ einfach zu bedienen sein libelf (nettes Tutorial hier: http : //people.freebsd.org/~jkoshy/download/libelf/article.html ) oder libbfd (
Andere Tipps
Sie können den Code mit gcc -S
zur Ausgabe eines Assemblerlisting kompilieren, statt vollständig in eine Objektdatei oder ausführbare Datei zu kompilieren. Dann ersetzen Sie einfach die gewünschten Befehle ohne-ops (z sed
verwendet wird), und weiterhin Kompilierung von dort aus.
Wenn Sie auch diese Dateien für Objekt machen wollen oder Bibliotheken, die Sie den ursprünglichen Quellcode nicht für haben, werden Sie stattdessen ein Tool wie objdump(1)
sie auseinander zu nehmen und erhalten die Adressen der Anweisungen, die Sie ersetzen wollen. Dann analysieren die Objekt Datei-Header die Offsets in der Datei dieser Befehle zu finden, und ersetzen Sie dann die Maschinenbefehle ohne-ops direkt in den Objektdateien. Dies ist ein wenig komplizierter, aber machbar.