COM文件起点

逆向工程 x86 反编译 DOS-COM
2021-06-25 10:55:58

我在逆向 90 年代初的一个小的旧 COM 文件时遇到问题。我的理解是代码从 0x100 开始,但是我的代码似乎从 0x90(之前的 0s)开始。然而,一些命令指向程序空间之外的位置,我想知道偏移量是否正确 - 特别是在 c2.x 之后。

使用 onlinedisassembler.com,我在下面有几个示例段...

.data:0x00000090    e612    out    0x12,al  
.data:0x00000092    131c16  adc    ebx,DWORD PTR [esi+edx*1]    
.data:0x00000095    d89ade3b6153    fcomp  DWORD PTR [edx+0x53613bde]   
.data:0x0000009b    3831    cmp    BYTE PTR [ecx],dh    
.data:0x0000009f    d309    ror    DWORD PTR [ecx],cl   
.data:0x000000a1    41  inc    ecx  
.data:0x000000a2    56  push   esi  
.data:0x000000a3    5b  pop    ebx  
.data:0x000000a4    ce  into    

...

任何指导将不胜感激。

1个回答

DOS .COM 文件在偏移 100h 处加载到内存中(前 100h 字节是PSP,由 DOS 加载器分配和填充)。磁盘上的文件当然从字节 0(对应于内存中的地址 100h)开始。

由于 .COM 只是一个没有标题的二进制 blob,您的反汇编程序不知道地址,甚至不知道它使用的处理器模式。这就是为什么你会得到垃圾输出。

要获得正确的结果,您需要确保在 16 位模式下反汇编在 onlinedisassembler.com 上,这是“i8086”选项(实际上来自它显然基于的 binutils)。

但是,即使在 16 位模式下,您引用的字节也没有意义,因此文件可能已被压缩或加密。由于您没有引用文件的开头,我们只能猜测。