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