static event_response_t objattr_read(vmi_instance_t vmi, addr_t attr)
{
access_context_t ctx;
ctx.translate_mechanism = VMI_TM_PROCESS_DTB;
ctx.dtb = cr3;
if ( !attr )
{
return 0;
}
ctx.addr = attr + 16; // Why 16? Shouldn't it be 4 bytes Length(ULONG) + 4 bytes RootDirectory(Handle)
if ( VMI_FAILURE == vmi_read_addr(vmi, &ctx, &ctx.addr) )
{
return 0;
}
unicode_string_t* us = vmi_read_unicode_str(vmi, &ctx);
if ( !us )
{
printf("unicde read error for addr + %d\n", i);
return 0;
}
unicode_string_t str2 = { .contents = NULL };
if (VMI_SUCCESS == vmi_convert_str_encoding(us, &str2, "UTF-8"))
{
printf("file name = %s\n", str2.contents);
}
vmi_free_unicode_str(us);
return VMI_EVENT_RESPONSE_TOGGLE_SINGLESTEP;
}
event_response_t syscall_trap_callback(vmi_instance_t vmi, vmi_event_t *event) {
vmi_pause_vm(vmi);
addr_t r8 = event->x86_regs->r8;
page_mode_t page_mode = vmi_get_page_mode(vmi, 0);
if (page_mode == VMI_PM_IA32E) {
uint64_t object_attributes = r8;
objattr_read(vmi, object_attributes);
}
else {
// Not handled now.
}
vmi_write_8_va(vmi, NtOpenFileAddress, 0, &saved_trap_byte);
vmi_resume_vm(vmi);
event->interrupt_event.reinject = 0;
return VMI_EVENT_RESPONSE_TOGGLE_SINGLESTEP;
}