静态编译qemu_使用QEMU chroot进行固件本地调试

阅读:

2,905

QEMU是开发者在调试一些不同架构的程序时经常使用的虚拟机软件。它有两种运行模式,全系统模拟(System mode)和单程序运行(User mode)。System mode和开发者平常用的VMWare一样,模拟整个系统从加载器开始的启动和运行。在设备逆向过程中,如果仅仅是为了运行开发者提取出文件系统中的某一个程序,那就可以使用QEMU的user mode来简化整个操作流程,同时能够方便的利用 QEMU 自带的GDB服务来进行调试,免去搭建环境的烦恼。

但是,单单在命令行中调用“qemu-arm myprogram”往往没有那么简单,因为动态链接的程序都会依赖几个动态链接库。虽然可以传入 -L 参数,或者通过指定环境变量QEMU_LD_PREFIX解决,但这种方式不但不优雅,还会造成重复性的工作——每个程序依赖的库不同,因此每次都要选择不同的目录。而且使用这种方式启动的程序,所运行的程序文件夹(CWD)与原来不同,很可能访问不了程序中硬编码的一些文件的绝对路径,造成程序出错。

因此最简单直接的方法还是使用chroot配合QEMU,来完全模拟程序的文件系统环境,以固件的根目录作为chroot的根目录,程序也能够自动加载到它所需要的libc与其他各种函数库。绿盟的小伙伴在看雪上做过一次分享,我听过后以为很容易上手,但是操作时踩到了一些坑。这里总结一下整个流程,顺便讲解一下其中的原理。

编译安装

Ubuntu自带的 QEMU 版本有点老(我的18.04 LTS 附带的 QEMU 2.11),在调试时会遇到类似下面的报错:~ # ./gdbserver tcp:2333 /usr/bin/messagingagent

qemu:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在EMU开发中,可以使用`qemu_monitor_printf`函数向QEMU监视器发送命令。以下是一个示例代码,展示如何使用该函数向QEMU监视器发送`info network`命令,并将结果输出到控制台: ```c #include <qemu-monitor.h> int main(int argc, char *argv[]) { const char *cmd = "info network"; char buf[1024]; ssize_t len; // 连接到QEMU监视器 QemuOpts *opts = qemu_opts_create(NULL); QemuOptsList *list = qemu_find_opts("chardev", NULL, NULL); qemu_opts_parse(opts, "chardev", "-chardev", "stdio,id=mon", NULL); qemu_chr_parse(QEMU_CHR_EVENT, "mon", opts, list, NULL); // 向QEMU监视器发送命令并读取结果 len = qemu_monitor_printf("mon", "%s\n", cmd); if (len < 0) { fprintf(stderr, "Failed to send command to QEMU monitor\n"); return 1; } len = qemu_chr_fe_read_line(qemu_chr_find("mon"), buf, sizeof(buf)); if (len < 0) { fprintf(stderr, "Failed to read QEMU monitor output\n"); return 1; } // 输出结果到控制台 printf("%s\n", buf); // 断开与QEMU监视器的连接 qemu_chr_close(qemu_chr_find("mon")); qemu_opts_del(opts); return 0; } ``` 这个示例代码使用`qemu_monitor_printf`函数向QEMU监视器发送`info network`命令,并使用`qemu_chr_fe_read_line`函数读取结果。然后,它将结果输出到控制台。 需要注意的是,使用`qemu_monitor_printf`函数向QEMU监视器发送命令时,命令字符串必须以换行符结尾。另外,该函数返回值表示成功发送的字节数,如果返回值小于0,则表示发送失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值