【问题标题】:Disassemble opcode snippets directly in a shell?直接在外壳中反汇编操作码片段?
【发布时间】:2019-07-21 18:51:06
【问题描述】:

我得到了一个小字节串,其十六进制表示形式如下:

6631C08A2500000000

是否有一个反汇编程序,它接受操作码作为直接输入参数,而不需要编译文件?

例如:

$ disassembler -directOpcode 6631C08A2500000000      

0:  66 31 c0                xor    ax,ax
3:  8a 25 00 00 00 00       mov    ah,BYTE PTR ds:0x0 

【问题讨论】:

  • 如果您可以将其转换为实际的二进制文件(如 hex undump),您可以将其提供给 ndisasm -b 64 或其他任何内容。或者objdump 具有反汇编平面二进制文件的选项。您当然可以制作一个采用 cmd 行 arg 并使用 tmp 文件的包装脚本。 PS:您不需要也不应该以 root 身份运行它。
  • 很好的提示!谢谢!将其制定为答案,我会接受!我用ndisasm -b64 <(python -c "print '\x66\x31\xC0\x8A\x25\x00\x00\x00\x00'" ) 做到了,这很容易编写脚本!非常感谢!
  • 您可以自己编写一个完整的答案,使用一个工作脚本将6631C0... 转换为'\x66\x31\xC0...',或者您真正想要的任何内容。
  • 似乎我的问题表述得不够好。我基本上只是想通过将它作为字符串传递给程序来反汇编 shell 中的一个小操作码片段。我不知道ndisasm 并且无法让objdump 在没有文件的情况下执行此操作。
  • 哦,我没有意识到objdump -b binary 不会从标准输入或像<( something ) 这样的命名管道中读取。 (Disassembling A Flat Binary File Using objdump)。无论如何,仍然可以自己写一个答案。

标签: linux debugging x86 x86-64 disassembly


【解决方案1】:

由于 Peter 的有用评论,我找到了一个利用 python2 和一些 shell 管道的解决方案:

$ python -c "print '6631C08A2500000000'.decode('hex')" | head -c -1 | ndisasm -b32 -

00000000  6631C0            xor ax,ax
00000003  8A2500000000      mov ah,[dword 0x0]

我用head -c -1 去掉了尾随的换行符,否则我得到:

00000000  6631C0            xor ax,ax
00000003  8A2500000000      mov ah,[dword 0x0]
00000009  0A                db 0x0a

【讨论】:

  • How to print without newline or space? 可能比使用 head -c -1 更容易/更好
  • IDK 如果python -c "import sys; sys.stdout.write('6631C08A2500000000'.decode('hex'))"| ndisasm -b32 - 真的好很多,那么使用head?;我猜print "x", 不起作用,因为如果终端刷新。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2021-07-08
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多