Я использую 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;
}
}