GNUツール(gcc、binutilsなど)を使用して、アセンブリ命令のすべての出現をノーオペレーションに変更することは可能ですか?具体的には、-pgオプションを使用してgccのは、以下のアセンブリ(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>
私はこの最後の命令のアドレスを記録したいし、次のコード
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)
のようにNOPに変更します
Linuxカーネルは実行時にこれと同様のことをすることができますが、私はビルド時の解決策を探しています。
ポイントは有効ですが、x86では 'nop'は1バイト命令ですので、削除する可変長命令で必要なだけ多く書くことができます。 –
可変長命令の場合に問題になる部分は、命令パターンをノーオペレーションにすることを探しています。なぜなら、指定されたバイトオフセットがそのオフセットの前の命令。バイナリのリバースエンジニアリングを克服する(または少なくとも妨げる)ために時々使用される命令の途中で分岐するような賢い手書きのアセンブラトリックを考えると、さらに悪いことです。 –
True;私はその方向から考えていませんでした。いい視点ね。 –