1

我有一组简短的机器指令(160 字节),但我不知道它的作用。

我在 Mac 上,我在 GDB 反汇编程序下运行它,结果如下:

....f3c0:   jmp    0x7fff5fbff3c6
....f3c2:   scas   %es:(%rdi),%eax
....f3c3:   retq   $0xa3bf
....f3c6:   sub    $0x100,%esp
....f3cc:   xor    %ecx,%ecx
....f3ce:   mov    %cl,(%rsp,%rcx,1)
 + 50 more lines....

我对汇编程序知之甚少,但有些命令看起来很有趣(比如rex.RXB, rex.WB, rex.B)。所以经过一番谷歌搜索后,我发现这个命令告诉我它是一个 DOS 可执行文件:

   $ file program
   program: DOS executable (COM)
  • 有没有可以反汇编DOS可执行文件的程序?

如果没有,我会尝试手动反汇编,因为只有 160 个字节。但是,我需要参考每个字节的含义。例如

90 = NOP
8a = MOV
....
  • DOS机器代码指令是否有这样的参考?

  • 我还能如何找出程序的作用?


更新:

在 IGOR 的一个很好的建议之后,我使用不同的程序反汇编了代码。但是,仍然有一些不好的说明:

 e:  88 0c                  mov    BYTE PTR [si],cl
10:  0c fe                  or     al,0xfe
12:  c1                     (bad)  
13:  75 f9                  jne    0xe
......
......
96:  90                     nop
97:  e8 9d ff               call   0x37
9a:  ff                     (bad)  
9b:  ff 41 41               inc    WORD PTR [bx+di+0x41]
  • 任何想法为什么它说(bad)
4

4 回答 4

3

如果它是一个 COM 文件,那么它只是原始的实模式 x86 代码。您可以告诉 objdump 使用 8086 模式,例如:

objdump -b binary -D -m i8086 file.com

要查看 Intel 风格的助记符(大多数 Intel 和 DOS 文档使用),请添加“ -M intel”。

有关说明参考,请尝试thisthis

于 2011-12-05T12:49:24.023 回答
2

您可以通过 DOS 调试器在 DOS 机器上运行它。不过,如果它的构建考虑到了这一点,那么它可能会非常神秘。

于 2011-12-05T12:09:08.473 回答
1

如果你够勇敢,你可以尝试安装DOSBox并运行它!

于 2011-12-05T12:12:08.973 回答
1

不要假设您看到的所有内容都是指令,它可能只是数据,而之前看起来像真实指令的指令可能只是数据。它是一个可变字长指令集,因此无论如何反汇编都很困难。模拟可能是最简单的方法或两者的结合。不要等到完全拆卸后才开始分析,进行几次不同的拆卸,尽可能多地获得工具并进行深入研究。无论如何,您可能必须手动进行一些操作,这是野兽的本性像这样的一套。

谷歌 pcemu 找到一个 8086/88 的模拟器,支持 dos 调用等。Pcemu 本身很容易挖掘,并在执行时转储指令等。然后按照你必须的反汇编转储,看看它是否有意义。如果不是,也许你需要做你自己的反汇编程序。

如果这段代码最初是用汇编程序以外的东西编写的,那么可能很难理解,尤其是如果你不懂汇编语言。如果您将此作为组装中的学习练习,还有许多其他更好的学习方法。授予为指令集编写反汇编器(或仿真器)是学习指令集的好方法,可变字长指令虽然是先进的,因为您必须按执行顺序而不是线性地通过内存来查找指令,然后再通过线性并分解您检测到的指令并留下其余数据。最好用像 msp430 这样更简单的东西弄湿你的脚,然后攻击像 x86 这样痛苦的东西。

于 2011-12-05T23:32:41.143 回答