2

私はあなたに3つの質問があります、すべてdyldに関連しています:)

私はこのdyldmanページをベースとして使用しています。次のコードをコンパイルし、ジェイルブレイクされたデバイスでバイナリを正常に実行しました。

#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では、ファイルを見つけることができます!)

これは出力からのサンプル行です:/usr/lib/system/libdyld.dylib

ls、iFile、および私が使用した他のすべてのツールによると、このディレクトリ(/ usr / lib / system /)は空です。なんで?それらのファイルはどこにありますか?

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

最後の質問:システム全体に動的ライブラリをロードしたかったので、DYLD_INSERT_LIBRARIESを使用してそれを実行できると思いました。ただし、libを挿入した後に実行しようとするすべてのバイナリがクラッシュし、バスエラーが発生します。何かを忘れましたか、それともクラッシュの原因となるダイナミックライブラリですか?

4

1 に答える 1

2

ライブラリは次の場所にあります: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6 (_armv7) これは、すべての単一ライブラリが 1 つの大きなライブラリに結合された大きなファイルです。

ジェイルブレイクされたデバイスでのフックについては、 http://iphonedevwiki.net/index.php/MobileSubstrateを参照してください。

はい、ジェイルブレイクされていないデバイスでも、メモリ内のdylibの位置を特定できます。ライブラリの LC_SEGMENT(_ TEXT)-Section Header( _text) を解析すると、ライブラリのベース アドレスと TEXT __text セグメントのサイズを取得できます。次に、vmslide を照会します。これを TEXT __text のベースアドレスに追加します。

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

于 2012-07-04T19:22:21.860 に答える