質問:
ARMでの分岐命令のオフセット計算
user2578525
2015-06-08 17:42:17 UTC
view on stackexchange narkive permalink

タイトルにあるように、分岐命令のオフセットを計算する方法は?たとえば、次のアセンブリコードがあります

  0x60ECE B loc_60EE6 ;;; 0x60EE6 LDR.W R2、#0x123  

場所 0x60ECE のHexコードは 0A E0 です。計算方法を知りたいのですが。 https://stackoverflow.com/questions/6744661/understanding-arm-assembler-branch-offset-calculationによると、オフセットは 0Aではなく 04 である必要があります

Androidバイナリに取り組んでいます。

二 答え:
Jason Geffner
2015-06-08 18:52:43 UTC
view on stackexchange narkive permalink

命令フォーマットはリトルエンディアンであるため、バイト 0A E0 はマシンコード 0xE00A または 1110000000001010b としてバイナリで解析されます。

THUMB命令セットのドキュメントによると、最初の5ビット( 11100b )は無条件ブランチオペコードにデコードされます、および最後の11ビット( 00000001010b )は Offset11 にデコードされます:

Unconditional branch

上記のドキュメントに従って、宛先アドレスは、「PC相対+/-オフセット11 << 1」にプリフェッチ操作の4を加えたものとして計算されます。

計算を行うと、すべてがうまくいくことがわかります。

  0x60ECE +(00000001010b << 1)+ 0x4 == 0x60ECE + 10100b + 0x4 == 0x60ECE + 0x14 + 0x4 == 0x60EE6  
Guntram Blohm supports Monica
2015-06-08 18:56:23 UTC
view on stackexchange narkive permalink

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進数をコピーして貼り付けることができます。これは、パッチを適用したバイトを手動で作成するよりもはるかに簡単であることがわかりました。

このトリックを指摘していただきありがとうございます。それは私にとってすべてをずっと簡単にしました。ついに私はcodecaveを作成することができました。


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...