Primero use task_for_pid() para obtener un puerto de tarea.
luego encontrar el "dyld todas las direcciones de imágenes información" utilizando task_info:
struct task_dyld_info dyld_info;
mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
if (task_info(task, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS)
{
// retrieve dyld_info.all_image_info_addr;
}
Esta dirección redireccionen a un dyld_all_image_infos struct en la memoria:
struct dyld_all_image_infos {
uint32_t version;
uint32_t infoArrayCount;
const struct dyld_image_info* infoArray;
// ...
}
Las entradas infoArrayCount y infoArray son importantes aquí . Debe recuperar estos valores (use mach_vm_read) e iterar a través de infoArray. Cada entrada es un dyld_image_info estructura:
struct dyld_image_info {
const struct mach_header* imageLoadAddress;
const char* imageFilePath;
uintptr_t imageFileModDate;
};
En esta estructura, que está interesado en la recuperación de los valores a imageLoadAddress (una dirección a la biblioteca en la memoria) y imageFilePath (una dirección a la terminación nula ruta de archivo en la memoria) .
Nota importante: los campos que están marcados como un puntero o como uintptr_t en las estructuras anteriores tienen un tamaño de bytes diferente según si el proceso en ejecución es de 32 o 64 bits. Puede determinar el tamaño del puntero al ver si dyld_info.all_image_info_format es TASK_DYLD_ALL_IMAGE_INFO_32 o TASK_DYLD_ALL_IMAGE_INFO_64 (debería funcionar, pero yo no lo he probado).
Por último, esto todavía no incluirá una entrada en el vinculador dinámico en sí. Para recuperar eso, una manera que he encontrado es recorrer las regiones vm (es decir, mach_vm_region), y encontrar la primera región que parece que es un dylinker mach (verifique MH_DYLINKER como el tipo de archivo; consulte el formato de archivo mach-o para más información). La última vez que recuerdo, check, gdb y/o lldb tienen una función para hacer esto también. Analizar el encabezado mach también es una forma posible de saber si el proceso es de 32 o 64 bits.
Después de recuperar todas las entradas de información de imagen Dyld, es posible que también desee ordenarlas por dirección.
Recomiendo no mirar el código de newosxbook para su implementación de vmmap. Está desactualizado (ya que todavía usa DYLD_ALL_IMAGE_INFOS_OFFSET_OFFSET), y hace un forzado bruto innecesario.
¿Está interesado únicamente en hacer esto para OS X? – Karmastan