我如何弄清楚可执行文件的作用?

时间:2011-12-05 12:06:46

标签: dos assembly machine-code

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

我在Mac上,我在一个GDB dissasembler下运行它,它出来了:

....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个字节。但是我需要参考每个字节的含义。 E.g。

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 个答案:

答案 0 :(得分:3)

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

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

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

有关说明参考,请尝试thisthis

答案 1 :(得分:2)

您可以通过DOS调试器在DOS计算机上运行它。可能会非常神秘,如果它是建立在防范这一点的基础上。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

不要以为你看到的所有内容都是一条指令,它可能只是数据,而它之前的指令就像真正的指令一样可能只是数据。它是一个可变字长指令集,因此无论如何都很难拆卸。模拟可能是最简单的方法,也可能是两者的结合。不要等到开始你的分析,直到你得到一个干净的拆卸,做几个不同的拆卸,尽可能多的你可以轻松获得工具,只是挖掘。无论如何你可能需要手工做一些,它的指挥野兽的性质就像这样。

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

如果此代码最初是用汇编程序以外的其他代码编写的,那么可能很难遵循,尤其是如果您不了解汇编语言。如果你这样做是为了在集会中学习,那么还有许多其他更好的学习方法。为指令集编写一个反汇编程序(或模拟器)是学习指令集的一种很好的方法,可变字长指令虽然是高级的,因为你必须执行顺序而不是线性地通过内存来查找指令,然后再通过线性地和反汇编您检测到的指令并保留其余数据。用msp430更简单的东西弄湿你的脚可能会更好,然后攻击像x86一样痛苦的东西。获得8088/86的反汇编程序的快速而肮脏的方法是采用像pcemu这样的东西并将printfs添加到它中并按执行顺序进行反汇编,无论如何,从分析的角度来看,这是你感兴趣的(我假设)。 p>