2016-12-12 10 views
2

私は別のプロセスのメモリからデータを読み込もうとするアプリケーションを作成しています。この他のプロセスは、ターゲットデータ(アセンブリ)が存在するはずのlibmono.0.dylibをロードしています。他のプロセスのロードされたdylibからデータフィールドを読み取る

mach-oベースのコードでは、ターゲットプロセスのロードされたdylibを反復し、上記のlibのmachヘッダーのbaseaddressを取得できます。それは

MonoDomain* mono_get_root_domain (void) { return mono_root_domain; } 

のように見えるモノのソースコードで

_mono_get_root_domain symbol

:ここからは私は私に関連するデータと構造体を返す関数のアドレスを与えるシンボルテーブルに取得することができます0x18a934のアドレスが返された構造体を保持しているという私の仮定は正しいですか?はいの場合、このアドレスはdylibヘッダー(= header_addr + addr)からの相対アドレスですか、スライドを追加する必要があるのですか? 私はこのアドレスに従うと私が遭遇するすべての他のアドレスに同じ保持をしますか?

答えて

0

私は別のプロセスのメモリ

各プロセスは、独自の仮想メモリ空​​間を持っており、カーネルによって保護されてからいくつかのデータを読み取ろうとするアプリを書いています。 dylibが共有される可能性があるので、関数がアドレスを返す場合、関数を呼び出したプロセスの仮想メモリマップ(VMMap)に格納されます。

ターゲットプロセスのメモリアドレスを独自のプロセスアドレス空間にマップするには、ターゲットのタスクポートが必要です。以前は、task_for_pidを呼び出してプロセスのタスクをpidから取得することができましたが、OS X 10.10(El Capitan)とシステムインテグリティ保護(SIP)の導入によりこれはもう不可能です。

ロードされたdylib内にデータがある場合は、dlopenで独自のプロセスにdylibをロードし、dlsymを呼び出して関数のアドレスを取得します。

+0

ありがとうございます!私はすでにその部分を持っています、私はロードされたヘッダーアドレスとシンボルへのポインタを持っています。上記のように、逆アセンブルされたコードの "内側"にあるポインタが見つかりました。どうすれば使用できますか?私がdylib_base_address + pointerを読んだ場合、ランダムなものしか得られません。それは何のVM地域ですか? – GooKSL

関連する問題