vmmap (1) фактически получает список изображений Mach-O, загруженных в процессе, путем проверки таблиц DYLD, оставленных в целевом адресном пространстве.

ользую vm_region_recurse_64, чтобы отобразить память для данного процесса, стиль vmmap.

Однако, пытаясь получить полный список совместно используемых библиотек, загруженных приложением, изучив заголовок Mach-O каждой библиотеки в памяти, vm_region_recurse, похоже, не согласен с инструментом командной строки vmmap относительно того, где конкретно и где заканчиваются некоторые конкретные разделы памяти.

Это становится особенно актуальным для системной подкарты 90000000-a0000000, куда загружается большинство общих библиотек os.

И теперь я немного озадачен. Я могу перечислить сегменты памяти, в общем сказать, какой у них тип, и прочитать их с помощью 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;
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос