当前位置: 代码迷 >> 汇编语言 >> 反汇编的有关问题请问
  详细解决方案

反汇编的有关问题请问

热度:8972   发布时间:2013-02-26 00:00:00.0
反汇编的问题请教
我同样一个程序,用DEBUG 和用w32DASM 反汇编出来怎么会不一样的?

但是DEBUG反汇编出来的和 ultraedit打开它显示的是一样的,请问这是为什么?

------解决方案--------------------------------------------------------
debug是16位的反汇编器,w32dasm是32位的,对于不同的程序当然不同。

另外即使都是32位反汇编器来说,有些程序做了反反汇编处理,比如花指令等。而各个反汇编器对于这种伎俩

的发现程度有高有低。
------解决方案--------------------------------------------------------
请上代码。你是指寄存器长度修饰前缀么?

你看一下指令手册就会发现,同一种长度修饰符在32和16位的环境下解释是不同的。


------解决方案--------------------------------------------------------
debug是把程序当作DOS程序来反汇编,用它来反汇编Win32程序得到的结果是错的。
------解决方案--------------------------------------------------------
装载基址不同,指令中地址和数据的大小不同,还有debug和w32DASM显示地址的方式不一样
xp下虚拟了dos地址空间,debug显示 段:偏移 是虚拟出来的"实模式地址", 而w32DASM显示的是32位下的虚拟地址,这个地址经过了分段,分页机制的映射,如何实现32位下的地址到物理地址映射,可以看看win32汇编这本书,讲的相当详细,要是英文好,看看intel手册更好,那里才是根源

你说的不同估计是因为装载基址不一样,比如
009970E9 /75 06 jnz short advapi_1.009970F1
中间的机器码肯定是一样的,顶多是位置不同!也许16位的装载同一条指令就跑到别的地址上了,你比较的是同一个地址,极端一点你在w32DASM可能根本找不到debug中显示的地址


------解决方案--------------------------------------------------------
debug可以加载dos下的2中可执行文件,com和exe,至于com文件,很简单,文件第一个字节就是代码,没有文件头,而且代码和数据必须在一个段内,因此文件大小有限制,最大不超过 64k-2×256,64k是一个段最大大小,第一个256是dos系统的psp,第二个256是默认栈大小,这里不说com,只说exe。

我用debug打开32位程序 notepad.exe,直接u,看到的是
143C:0000 0E PUSH CS
143C:0001 1F POP DS
143C:0002 BA0E00 MOV DX,000E
143C:0005 B409 MOV AH,09
143C:0007 CD21 INT 21
143C:0009 B8014C MOV AX,4C01
143C:000C CD21 INT 21
后面都是数据了
143C:000E 54 PUSH SP
143C:000F 68 DB 68
143C:0010 69 DB 69
143C:0011 7320 JNB 0033
143C:0013 7072 JO 0087
143C:0015 6F DB 6F
143C:0016 67 DB 67
143C:0017 7261 JB 007A
143C:0019 6D DB 6D
143C:001A 206361 AND [BP+DI+61],AH
143C:001D 6E DB 6E

其实这段代码就在dos头里,看来debug把32位下的exe当作dos中的exe来处理
32位文件头分布
DOS_HEADER
DOS_SUB
NT_HEADER
.......

再来看看我用winhex打开的文件内容
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ?........??..
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ?......@.......
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 00 00 ............?..
这段是IMAGE_DOS_HEADER,里面有dos程序的入口,这里给出dos头
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
  相关解决方案