微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将流程执行记录为汇编指令?

如何解决如何将流程执行记录为汇编指令?

我正在编写x86-64解释器,并且作为调试和测试程序的一种方式,我需要将过程记录为汇编指令列表,最好使用at&t语法,并且还要忽略动态库函数调用。并记录cpu寄存器

您知道有什么工具可以帮助您吗?

我尝试使用gdb record save ...命令,但是与源程序相比输出文件很大

int main() {
  return 42;
}

反汇编文件后,指令地址错误

我想要的输出格式是上述程序(与tcc一起编译)的类似格式

  400300: 31 ed                    xor    %ebp,%ebp
  400302: 49 89 d1                 mov    %rdx,%r9
  400305: 5e                       pop    %rsi
  400306: 48 89 e2                 mov    %rsp,%rdx
  400309: 48 83 e4 f0              and    $0xfffffffffffffff0,%rsp
  40030d: 50                       push   %rax
  40030e: 54                       push   %rsp
  40030f: 4c 8b 05 62 02 20 00     mov    0x200262(%rip),%r8        # 600578
  400316: 48 8b 0d 63 02 20 00     mov    0x200263(%rip),%rcx           # 600580
  40031d: 48 8b 3d 64 02 20 00     mov    0x200264(%rip),%rdi        # 600588
  400324: ff 15 66 02 20 00        callq  *0x200266(%rip)        # 600590
__libc_start_main
  400331: 55                       push   %rbp
  400332: 48 89 e5                 mov    %rsp,%rbp
  400335: 48 81 ec 00 00 00 00     sub    $0x0,%rsp
  40033c: b8 2a 00 00 00           mov    $0x2a,%eax
  400341: c9                       leaveq
  400342: c3                       retq
  40032a: f4                       hlt
42

解决方法

我使用qemu找到了部分解决方案。

qemu-x86_64 -singlestep -d in_asm,cpu,fpu -dfilter beg..end myProgram 2>&1 | vim -

begend替换为程序的第一个和最后一个指令地址,您可以使用

objdump -d yourProgram | vim -

请注意,我绘制矩形的非常简单的程序的输出文件为55MB。而且运行起来很慢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。