2012-04-18 11 views
2

私はあなたのための3つの質問、私は基礎としてthis dyld man pageを使用している:)dyldのAPIを - 奇妙な出力

をdyldのために関連するすべてを持っています。私は次のコードをコンパイルし、jailbrokenデバイス上でバイナリを正常に実行しました。

#include <stdio.h> 
#include <mach-o/dyld.h> 

int main(int argc, const char* argv[]) { 
    uint32_t image_count, i; 
    image_count = _dyld_image_count(); 
    for (i = 0; i < image_count; i++) { 
     printf("%s\n", _dyld_get_image_name(i)); 
    } 
    return 0; 
} 

私は、これらの機能は、私は私のプログラムのアドレス空間にロードされているすべての共有ライブラリを見つけてみましょうと思いました。私のMacでは、出力はかなり簡単です:現在メモリにロードされているすべてのライブラリへのパスを示します。私のiPhoneでは、出力はほぼ同じです - ファイルパスも取得しますが、指定された場所にファイルがありません。 (一方、私のMacでは、私は、ファイルを見つけることができます!)

これは出力からサンプルラインです:LSによると、IFILEと

/usr/lib/system/libdyld.dylib私が使った他のすべてのツールは、このディレクトリ(/ usr/lib/system /)は空です。どうして?これらのファイルはどこにありますか?

私が知りたいもう一つのことは、メモリ内のライブラリを見つけることは可能ですか?オフセットからどのオフセットまでライブラリがメモリにマップされていますか?私は始まりを見つける方法を知っていると思うが、私はどのようにライブラリの終わりを見つけるか分からない。先頭を見つけるには、_dyld_get_image_headerから返されたアドレスを使用します - これは正しいですか?

最後の質問:私はDYLD_INSERT_LIBRARIESを使用してこれを行うことができると仮定して、システム全体の動的libをロードしたかったのです。しかし、すべてのバイナリは私のlibのクラッシュを挿入した後に実行しようとすると、バスエラーが生成されます!私は何かを忘れてしまったのですか、クラッシュの原因となるダイナミックライブラリですか?これは、すべて単一のライブラリが一つの大きなものに参加してきたした大きなファイルである /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6(_armv7) :

+0

jailbrokenデバイスで作業していることを追加する必要があります。 jailbrokenデバイスで作業していない場合、それはアプリケーションがサンドボックス化され、小さなサンドボックスの外にアクセスできないため予期しない動作の原因となります。 – Till

+0

ライブラリのサイズがヘッダーに格納されていませんか?その他:指定されたファイルはそこに実際にはないのでそこにはありません!それらはカーネルキャッシュに保存されていますが、パス名はdylibファイルにハードコードされているため、dyldはそれらがどこにあるかを報告します。 –

答えて

2

ライブラリが位置しています。

はいつでも非ジェイルブレイクデバイス上で、メモリにdylibの位置を決定することができるジェイルブレイクデバイス上

をフックするためのhttp://iphonedevwiki.net/index.php/MobileSubstrateを参照してください。 ライブラリのLC_SEGMENT(_ TEXT)-Sectionヘッダー( _text)を解析すると、ライブラリのベースアドレスとTEXT __textセグメントのサイズを取得できます。次に、vmslideを問い合わせます。これをTEXT __textのベースアドレスに追加します。

mach-oファイル形式の詳細は、 https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.htmlです。 "segment_command"構造に特に注意してください。