反汇编的有关问题请问
发布时间:2010-06-14 15:49:04 文章来源:www.iduyao.cn 采编人员:星星草
反汇编的问题请教
我同样一个程序,用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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
MSN通讯协议逆向
MSN 进行数据通讯中,据说用了TWN认证,通过SSL/TLS连接到login.passport.com和 loginnet.passportr.com 等服务器。
...
-
win7+64位cpu的exe反汇编问题,多次问人,无果
vs20008写的一个很简单的c++控制台程序
平台是:win7 64位操作系统
用od进行反汇编,...
-
可能很白痴的问题:想给ax赋一个负数怎么做?
比如想要赋一个-5给ax,是不是只有求出这个-5的补码,然后mov进这个补码这一种方法?
------...
-
居然显示不出负数来,悲剧
Assembly code
.386
.model flat,stdcall
include kernel32.inc
includelib kernel32.lib
include ms...
-
call far ptr '标号'的问题[在线等答案]
为什么ax会是1010?不是1006??求详细解答
难道call far ptr不是执行了push cs,push ip,jm...
-
CPU的程序计数器PC和指令指针寄存器IP是一个东西吗?
看上去好像功能完全一样,又觉得不应该是一回事,求教
------解决方案----------...
-
菜鸟问题,高人来帮忙
编程,统计data段中数值为8的字节的个数,用ax保存结果
我的代码
Assembly code
assume cs:code,ds:data
data se...
-
一个死循环问题
什么原因造成内循环才刚循环一次还没完,到了loop s1的时候cx突然变成F?
Assembly code
assume cs:codesg,ds:datas...
-
初学MUL乘法指令,写法求解释下
MUL r8/m8 ;无符号字节乘:AX←AL×r8/m8
MUL r16/m16 ;无符号字乘:DX.AX←AX×r16/...
-
汇编如何 取到8051的P0口的内容呢?
Assembly code
ORG 0000H
AJMP START
ORG 0030H
START: MOV P0,#00H
LOOP: ...