static status_t init_kaslr(vmi_instance_t vmi)
{
/*
* First check whether init_task can be translated as-is.
*/
uint32_t test;
linux_instance_t linux_instance = vmi->os_data;
ACCESS_CONTEXT(ctx,
.translate_mechanism = VMI_TM_PROCESS_DTB,
.pt = vmi->kpgd,
.addr = vmi->init_task);
if ( VMI_SUCCESS == vmi_read_32(vmi, &ctx, &test) ) {
/* Provided init_task works fine, let's calculate kaslr from it if necessary */
addr_t init_task_symbol_addr;
if ( VMI_FAILURE == linux_symbol_to_address(vmi, "init_task", NULL, &init_task_symbol_addr) )
return VMI_FAILURE;
linux_instance->kaslr_offset = vmi->init_task - init_task_symbol_addr;
dbprint(VMI_DEBUG_MISC, "**calculated KASLR offset from pre-defined init_task addr: 0x%"PRIx64"\n", linux_instance->kaslr_offset);
return VMI_SUCCESS;
}
if ( vmi->page_mode == VMI_PM_IA32E ) {
if ( VMI_SUCCESS == get_kaslr_offset_ia32e(vmi) )
return VMI_SUCCESS;
}
status_t ret = VMI_FAILURE;
GSList *loop, *pages = vmi_get_va_pages(vmi, vmi->kpgd);
loop = pages;
while (loop) {
page_info_t *info = loop->data;
if ( !linux_instance->kaslr_offset ) {
switch (vmi->page_mode) {
case VMI_PM_AARCH64:
case VMI_PM_IA32E:
if ( VMI_GET_BIT(info->vaddr, 47) )
ret = init_task_kaslr_test(vmi, info->vaddr);
break;
default:
ret = init_task_kaslr_test(vmi, info->vaddr);
break;
}
if ( VMI_SUCCESS == ret ) {
linux_instance->kaslr_offset = info->vaddr - (vmi->init_task & ~VMI_BIT_MASK(0,11));
vmi->init_task = linux_instance->init_task_fixed + linux_instance->kaslr_offset;
dbprint(VMI_DEBUG_MISC, "**calculated KASLR offset: 0x%"PRIx64"\n", linux_instance->kaslr_offset);
break;
}
}
g_free(info);
loop = loop->next;
}
g_slist_free(pages);
return ret;
}
🌱 Back to Garden