2016-11-02 1 views
0

私のアプリケーションは、ポインタを取得するために他のアプリケーションメモリを読み込んでいます。私は最初にアプリケーション自体で作業を開始するために静的ライブラリからのオフセットを読み取る必要があります。macOS - 他のアプリケーションライブラリコードの一部を読み込み、オフセットを取得するために逆アセンブルする

いくつかのdylibの関数には、ポインタ "0x41b1110"へのオフセットが含まれています。このオフセットは手動で使用すると機能することがわかりますが、メモリから読み込みを単純にすると、 SomeAddressXをuint64_tとしてアドレス指定すると、0x41b1110と等しくないばかばかしいアドレスが得られます。私が得たものは、この命令だけです。次に、私はバイト配列としてこれを読んでみました。このバイト配列は、このアドレスのプレーンバイナリからバイト配列に等しいものでした。私は単純に "0x41b1110"を完全に読んでいないのでしょうか?バイトコードをx64命令に逆アセンブルしてからアドレスを取得するために解析する必要がありますか、それともよりスマートな方法ですか?私はあまり経験がありません。

SomeAddressX - rax, qword [ds:0x41b1110] 

例のバイトコード命令を追加する

48 8D 05 6F D9 99 00 

最初の3 48 8D 05lea rax, qwordように見えますが、他の部分6F D9 99 0001 04 37 40 (0x1043740)のように見ていない与え

lea  rax, qword [ds:0x1043740] 

example

+0

任意のバイナリで固定アドレスにあるものはすべて読み込む必要がありますか?あるいは、そのバイナリ内のシンボルのアドレスを調べたいということですか? –

+0

基本的には任意のバイナリで固定アドレスから値を読み込みますが、簡単に実行できますが、結果は貼り付けられた命令を含むバイト配列です。私はそれから "0x41b1110"を抽出する必要があるが、私はどのように考えている。 – Steven

+0

バイト配列がどのように見えるかを表示できますか? (バイト値)。あなたは命令BTWを貼り付けておらず、一部の引数のみを貼り付けました。 – Ped7g

答えて

1

それは、x64だとPIC(位置独立コード)を施行OSX上のコード(それはASLRを使用しているとして、非PIC実行可能ファイルを許可していません)。

このように分解すると、重要な情報が表示されなくなります。その命令の本質は、(BAのDUMのTS)、ここで明らかにされています

lea rax,[rip+0x99d96f] 

比較的、それのデータに対処するために、現在の命令ポインタripを使用しています。

0x1043740は、addressOfInstruction + 7 + 0x99d96fの結果です。

0x99d96fの部分は、バイトコード自体にはっきりと見えます。

+7は命令のオペコードサイズです。今、私は100%確信しているわけではありませんので、あなたも "addressOfInstruction"を知っているように、あなた自身の数学をしてください。

デバッガオプションをチェックして、アブソリュートアブソリュートメモリ表示とtrue rip+offset逆アセンブリを切り替えることができるかどうかを確認してください。

+0

本当に面白いです、ありがとう、返事ありがとうございます。それを説明する時間を感謝します。 それは99d96f見え、数学も正しい 0x1043740 = addressOfInstruction + 0x99d96f +オペコードサイズ は明らかである。しかし、その場合のオペコードが、有効なオペコードのサイズを取得する方法 0x57 =等しいそれらしいというのは本当ですか? – Steven

+0

オペコードサイズとは、特定の命令をエンコードするバイト配列全体のサイズを意味します。 x86_64で命令のサイズを取得するには - >自分で逆アセンブラを実行したことはありませんでしたが(x86またはx64ではありませんでしたが)、opcodesの設計は非常に痩せていて、基本的にはほとんどの場合逆表が必要ですいくつかの範囲は単純な公式によってカバーされます。逆アセンブラのソースを確認してください。しかし、バイナリの中で特定の命令に興味があるなら、あなたはすでに命令のサイズを知っています(あなたの場合は7バイトです)。 – Ped7g

+0

@スティーブン:それについて考えると、x64マシンコードをチェックするのは面倒だが、もしそれらのオフセットの後ろにいるのなら、通常はオペコードの最後の部分だと思う。したがって、もしアドレス ''の4バイトがオフセットを形成するならば、次の命令がオフセット最後のバイト( +4 == next)の直後に始まる可能性が高いため、ターゲットを ' + 4 + '実行中の命令アドレス== 'rip'値)。 – Ped7g

関連する問題