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;
}
}