命令を no-op しようとしています
-
16-09-2019 - |
質問
GNU ツール (gcc、binutils など) を使用して、アセンブリ命令のすべての出現を no-op に変更することは可能ですか?具体的には、-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>
この最後の命令のアドレスを記録し、次のコードのように nop に変更したいと考えています。
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)
Linux カーネルは実行時にこれと同様のことを実行できますが、私はビルド時のソリューションを探しています。
解決
これは、RISC 風の固定長命令フォーマットを使用した方が、例えば命令フォーマットよりも確実に簡単になります。×86。
libelf を使用するのは比較的簡単です (ここに素晴らしいチュートリアルがあります: http://people.freebsd.org/~jkoshy/download/libelf/article.html) または libbfd (http://sourceware.org/binutils/docs-2.19/bfd/index.html) オブジェクト ファイルを開き、.text セクション内の命令を変更し、提供された API を使用して再度書き込みます。努力する価値があるかどうかは、技術的以外の考慮事項によって決まります (ちょっと興味がありますが...)。
libelf または libbfd をクロス開発環境で動作させる必要がある場合、これを使用すると多少の問題が発生する可能性があることに注意してください。
他のヒント
あなたは代わりに、オブジェクトファイルまたは実行可能ファイルに完全にコンパイルするので、出力にgcc -S
アセンブラリストでコードをコンパイルすることができます。その後、ちょうどノーオペレーション(例えばsed
を使用)で所望の命令を置き換え、そこからコンパイルを続けます。
、あなたの代わりに、このような<のhref = "HTTPなどのツールを使用する必要があります.NET /男性/ 1 / objdumpの」REL = 『nofollowをnoreferrer』>それらを分解し、あなたが交換したい命令のアドレスを取得するobjdump(1)
する。次に、これらの命令のファイル内のオフセットを見つけるために、オブジェクトファイルのヘッダを解析して、オブジェクト・ファイルに直接空命令でマシン命令を交換してください。これは少しトリッキーが、なんとかです。