THUMBモードで作業しているという事実を見逃しています。THUMBモードでは、命令ごとに2バイトがあり(少なくともほとんどの命令で)、そのリンクは、すべての命令が4バイトであるARMモードについて説明しています。
(THUMBモードになっていることをどのように確認できますか?最後の質問とは別に、 0x60ECE B loc_60EE6
は4バイトに揃えられていないため、THUMBである必要があります)。
loc_60ECE
の命令に4バイトを追加すると、 0x60ED2
が得られます。これを 60EE6
から引くと、 14
、つまり10進数で20になります。 2で除算(THUMBモードでは2バイト命令)して、10進数の 10
、または16進数の 0A
を取得します。
オフセットの計算は難しい場合があり、エラーが発生します。 -傾向があります、私はgnuアームアセンブラーにそれを処理させます。まず、次のようなアセンブリファイルを記述します(qsという名前、任意の名前を選択してください):
.thumb.arch armv7a.syntax Unified.org 0x60ECE B codecaveoriginal:.org 0x60EE6codecave:movw R2、 #0x123Bオリジナル
次にアセンブルして結果を確認します:
arm-linux-gnueabi-as q.sarm-linux-gnueabi-objdump -s a.out | grep -v "00000000 00000000 00000000 00000000"セクションの内容.text:60ec0 00000000 00000000 00000000 00000ae0 ................ 60ee0 00000000 000040f2 2312f1e7 ...... @。#。 ..
0ae0
は 60ece
に、 40f22312f1e7
は 60ee6 に表示されます。コード>。これをIDAで直接パッチするか、 idapatcherプラグインを使用して16進数をコピーして貼り付けることができます。これは、パッチを適用したバイトを手動で作成するよりもはるかに簡単であることがわかりました。