以下是我遵循的步骤。
1)我从Kip Irvine的“汇编语言x86处理器”一书中获取了三个不同小程序的汇编语言代码。
2)我组装,链接以生成有效的可执行文件,并且每种情况都没有错误。
3)对于每个可执行文件,我使用NASM生成反汇编
ndisasm -u -p intel add3.exe > add3_ndisasm.txt
4)在每种情况下,我都使用dumpbin.exe获取反汇编输出
dumpbin /disasm add3.exe > add3_dumpbin_disasm.txt
令人惊讶的是,我在步骤4中得到的反汇编与第3步完全不同。
这是我使用的汇编代码(在3个案例中的一个案例中)。
; This program adds and subtracts 32-bit integers.
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO
.code
main PROC
mov eax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 30000h
call DumpRegs
INVOKE ExitProcess,0
main ENDP
END main
以下是步骤3(NDISASM)的反汇编样本
00000000 4D dec ebp
00000001 5A pop edx
00000002 90 nop
00000003 0003 add [ebx],al
00000005 0000 add [eax],al
00000007 000400 add [eax+eax],al
0000000A 0000 add [eax],al
0000000C FF db 0xff
0000000D FF00 inc dword [eax]
,这是从第4步(dumpbin.exe)
Microsoft (R) COFF/PE Dumper Version 14.11.25508.2
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file add3.exe
File Type: EXECUTABLE IMAGE
00401000: 50 push eax
00401001: E8 EF 0F 00 00 call 00401FF5
00401006: C3 ret
00401007: 55 push ebp
00401008: 8B EC mov ebp,esp
0040100A: 83 C4 E8 add esp,0FFFFFFE8h
0040100D: 60 pushad
0040100E: 80 3D 00 40 40 00 cmp byte ptr ds:[00404000h],0
00
00401015: 75 05 jne 0040101C
我从步骤3的输出中获取了一些指令代码,并尝试在步骤4的反汇编列表中搜索它们,但找不到它们。
5)然后,我接受了可执行文件的十六进制转储(使用frhed),并将其中的字节值与两个步骤中的输出进行比较。
0000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 b8 00 00 00 00 00 00 00 40 00 00 MZ..........ÿÿ..¸.......@..
001b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...........................
0036 00 00 00 00 00 00 d8 00 00 00 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 73 ......Ø.....º..´.Í!¸.LÍ!Ths
0051 69 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f 74 20 62 65 20 72 75 6e 20 69 6e 20 i program cannot be run in
006c 44 4f 53 20 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 5b 39 0b f3 1f 58 65 DOS mode....$.......[9.ó.Xe
我在步骤5中看到的字节值与步骤3中的字节值匹配,但不匹配第4步。
解释这些差异的原因是什么? 我必须在某个地方遗漏一些简单的小细节,它是什么?
答案 0 :(得分:3)
简答: <div class="modal-content" style="height:100vh;width:100%;">
<div class="top-section">
<div class="content-section">
<div class="title-section">
</div>
<div class="beer-section">
<div class="image-section">
<div class="image-container">
</div>
</div>
<div class="text-section">
</div>
</div>
</div>
<div class="panel-section">
<div class="thumbnail-holder">
</div>
<div class="thumbnail-holder">
</div>
<div class="thumbnail-holder">
</div>
<div class="thumbnail-holder">
</div>
<div class="thumbnail-holder">
</div>
</div>
</div>
<div class="bottom-section">
</div>
</div>
≠getCollections()
提示:注意.exe
签名为步骤5输出中的两个第一个字节:-P
答案很长:
Microsoft的可执行.com
格式不仅仅是代码。首先,它以特殊签名(格式创建者的首字母)开头,后面跟着相当多的信息来描述代码的组织。
相比之下,MZ
文件只是一个代码,这意味着它的第一个字节是文件加载到内存后执行的内容。
你得到的第一个反汇编是错误的(是的,第一个是错的,不是第二个!)因为它试图用第一个字节开始解析而不是跳到实际代码。
.exe
足够智能,可以正确解析该.com
文件的标头,并开始反汇编实际代码。
<强>解决方案强>
如果您想要比较反汇编输出,您必须确保您的NASM知道文件类型并正确解析其标题或...简化您的生活并转换{{1}进入dumpbin
,在这种情况下,两个反汇编操作都应该产生相同的输出(当然,除非存在潜在的错误)
我多年前使用名为.exe
的实用程序将.exe
文件转换为.com
的最后一次。在线快速搜索显示,这是在Windows XP时代,不再附带操作系统。虽然如果从某个地方下载它,我认为没有理由不起作用。
答案 1 :(得分:0)
一个普遍的答案是您的期望不合理。
只有经过特殊设计的协作汇编程序和反汇编程序以及经过特殊设计的助记符设备才能处理此问题。一个简单的例子可以说明这一点。 假设你有
MOV RCX, RBX ; Intel destination then source.
此指令可能有两种机器代码。 汇编器选择任意一个。因此,如果您拆卸 并重新汇编包含此指令的工作代码,则可能无法找回原始代码。 这是一个简单的例子。一旦您遇到了用于AX的较短的特殊代码,缩放的索引字节,偏移量选择等等,情况就会变得更加糟糕。
http://home.hccnet.nl/a.w.m.van.der.horst/ciasdis.html 提供了这样的汇编器。
在上面的此汇编器/反汇编器组合示例中,您有两条明确定义的指令
MOV,X | F | CX'| R | BX |
和
MOV,X | T | BX'| R | CX |
因此,您可以测试打算使用的汇编程序。如果它仅包含一条将BX寄存器复制到CX寄存器的指令,则所有投注均已关闭。 (剧透警报,众所周知的汇编程序都不会这样做。)