QEMU KVM转储来自地址的格式字符串



对于一个大学项目,我必须扩展一个经过模糊化修改的QEMU版本。我想打印更多的调试消息。这个QEMU版本将Linux内核函数对kasan_reportpanic的调用替换为超级调用,这样QEMU就可以处理该事件。

超级调用发生时执行的函数如下所示。

static void handle_hypercall_panic(struct kvm_run *run, CPUState*cpu){
/*
*/ 
}

现在我想读出QEMU中的内存,目前我可以访问CPUState结构中的所有寄存器,并拥有函数的所有参数,包括指向格式字符串所在的内存区域的指针。现在,我如何从QEMU源代码访问内存区域并转储格式字符串?

我知道有一些文档,如果没有人回答我,我会阅读它们,但为了节省一些时间,提前询问是很好的。

使用cpu_memory_rw_debug读取来宾内存,例如so:

uint8_t str[10];
if( cpu_memory_rw_debug( cpu, virtualAddressOfString, (uint8_t *)str, sizeof( str ), 0 ) )
{
printf( "Failed to read str!n" );
}

如果字符串所在的页面不在内存中,例如在页面文件中,则此函数将失败。处理此问题的最简单方法是访问来宾超级调用代码中的字符串,以强制将其加载到内存中。如果字符串位于一个页面中,则只访问第一个符号就足够了。如果有多个页面,您应该在每个页面中至少访问一个符号。

最新更新