db 0xxh 将按二进制编码,因此如果发出 db 0cch
只有一个字节 0xcc 将被编码在 db 发出的确切位置
dw 将编码一个词
即 dw 0aa55h 在二进制中将被视为 AA 55
dd = DWORD == 2 WORDS == 4 BYTES 所以 dd 01337BABEh 将被编码为 13 37 ba 二进制
dq = qword == 2 dwords == 4 words == 8 bytes
组装和链接之前的目录内容
:\>dir /b
bootlo.asm
asm文件的内容
:\>type bootlo.asm
.386
.model flat, stdcall
.code
ORG 337h
start:
jmp @F
db 0bh dup (0CCh)
@@:
dw 0AA55h
dd 01337babeh
dq 05D0DDEED1337BABEh
retn
end start
组装文件
:\>ml /coff /nologo bootlo.asm /link /subsystem:windows /nologo
Assembling: bootlo.asm
目录帖子程序集和链接的内容
:\>dir /b
bootlo.asm
bootlo.exe
bootlo.obj
mllink$.lnk
解释如下
org 337 has become default start of code section + 337
ie 0x1000 + 0x337 so during runtime it would be entry point RVA + default base
ie 0x400000 + 0x1000 + 0x337 == 0x401337
at 401337 you have will have a jump encoded
其大小将是下一个标签的地址和当前指令之间的差值
下一个标签紧随其后
db 0bh
我0xcc
在示例中编码但是0xab
or 0xff
or 0x00
orany byte
可以被编码并且汇编器将准确地发出what was asked for
&how many times
它被要求
所以会有一个短跳转即eb 0b
(x86操作码)
按照标签 dw 0AA55h 发出,因此在 400000 + 1000 + 337 + 0x0b
AA 55 or 55 AA should be seen at 401344 (beware endianness)
如果 AA 55 存在,可以转储并检查组装的二进制文件
:\>echo. & dumpbin /ALL bootlo.exe | grep -i entry & echo. & dumpbin /all bootlo
.exe | grep -A 1 -B 1 -i 55
1337 RVA of entry point
00401330: 00 00 00 00 00 00 00 EB 0B CC CC CC CC CC CC CC .......δ.╠╠╠╠╠╠╠
00401340: CC CC CC CC 55 AA BE BA 37 13 BE BA 37 13 ED DE ╠╠╠╠U¬╛║7.╛║7.φ▐
00401350: 0D 5D C3 .]├
:\>