xor ebx,ebx
mov eax,DWORD PTR fs:[ebx+0x3]
我知道这段代码的第一行,但是
fs:[ebx+0x3]
是什么意思?为什么在编译时会出错?test.asm:2: error: comma, colon, decorator or end of line expected after operand
xor
操作码将EBX设置为0。因此,mov
操作码访问fs:[3]处的DWORD。这将访问位于从fs:[0]
到fs:[3]
(4字节)的Win32线程信息块的当前结构化异常处理(SEH)帧
的最后一个字节和Stack Base
变量的前三个字节,即ESP的初始值。
除非你遇到了一些复杂构造和混淆的病毒或反调试技术,将这3+1个字节组合成有用的东西,否则这只是一个有点随机的数字。
另一个可能性是,在这些指令之前修改了“段”寄存器FS,以包含合理的基地址。在这种情况下,这可能是像其他许多指令一样有用的指令。根据你提供的代码片段无法确定。
例如:
mov eax, fs
inc eax
mov fs, eax
...
xor ebx,ebx
mov eax,DWORD PTR fs:[ebx+0x3]
会返回EAX中的'Stack Base' - '(FS+1)+(0+3)' = real-FS:[4] = 'Stack Base'位置。
补充:为了完整性:为什么它不能组装已经在评论中被'Ross Ridge'提到了:这是MASM语法,不是NASM语法。
dword [fs:ebx+0x3]
。清零ebx
看起来是为了节省一个字节的代码大小。[fs: 0x3]
需要一个4字节的位移编码的mov
指令。xor
占用2个字节,并允许mov
使用[fs: reg + byte 0x3]
编码。因此,mov
比较短,少了3个字节,代价是多了一个xor
(希望后面需要清零的ebx
,所以实际上可以节省3B)。 - Peter Cordes