5

vm_region_recurse_64を使用して、特定のプロセスのメモリをvmmapスタイルでマップします。

ただし、メモリ内の各ライブラリのMach-Oヘッダーを調べて、アプリケーションによってロードされた共有ライブラリの完全なリストを取得しようとすると、vm_region_recurseは、特定のメモリセクションの一部が開始および終了する場所についてvmmapコマンドラインツールと一致しないようです。

これは、ほとんどのos共有ライブラリがロードされる90000000-a0000000システムサブマップで特に当てはまります。

そして今、私はちょっと困惑しています。メモリセグメントを一覧表示し、それらがどのタイプであるかを一般的に伝え、vm_readを使用してそれらから読み取ることができます。しかし、それらをリストし、正確で特定の地域情報を取得することは困難であることが証明されています。

vmmapは、ライブラリがロードされている特定の場所のリストをどのように取得しますか?私の方法は効果がないようです。

編集:これが私が使用している基本的なコードです。vmmapと類似しているが同一ではないメモリマップを返します。特定のライブラリのメモリ領域がありません。

kern_return_t krc = KERN_SUCCESS;
vm_address_t address = 0;
vm_size_t size = 0;
uint32_t depth = 1;
while (1) {
    struct vm_region_submap_info_64 info;
    mach_msg_type_number_t count = VM_REGION_SUBMAP_INFO_COUNT_64;
    krc = vm_region_recurse_64(port, &address, &size, &depth, (vm_region_info_64_t)&info, &count);
    if (krc == KERN_INVALID_ADDRESS){
        break;
    }
    if (info.is_submap){
        depth++;
    }
    else {
        //do stuff
        printf ("Found region: %08x to %08x\n", (uint32_t)address, (uint32_t)address+size);
        address += size;
    }
}
4

2 に答える 2

5

vmmap は mach_vm_region_recurse() を呼び出してメモリ領域を一覧表示します。

0x90000000..0xa0000000 にある dyld 共有キャッシュのようなサブマップの内容を表示するには、is_submap が設定された領域を探してから、同じアドレスとより深いネスト深度で mach_vm_region_recurse() を再度呼び出す必要があります。

于 2011-08-05T23:47:28.663 に答える
2

vmmap(1) は、ターゲット アドレス空間に残された DYLD テーブルを検査することにより、プロセスでロードされた Mach-O イメージのリストを実際に取得します。

于 2013-03-30T01:53:38.643 に答える