在汇编语言中,"fs:[register+value]"是什么意思?

5
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

在x86中,冒号表示“连接”。因此,它将fs与[ebx+0x3]连接起来。但是,在这种情况下,fs是什么?看起来很奇怪,我们肯定漏掉了什么。 - Ricky Mutschlechner
3
这是为MASM编写的代码,不是NASM。这也是一段在Windows下看起来不像会有任何有用功能的代码。你为什么要尝试汇编这段代码呢? - Ross Ridge
如果我没记错的话,这个的NASM语法是dword [fs:ebx+0x3]。清零ebx看起来是为了节省一个字节的代码大小。[fs: 0x3]需要一个4字节的位移编码的mov指令。xor占用2个字节,并允许mov使用[fs: reg + byte 0x3]编码。因此,mov比较短,少了3个字节,代价是多了一个xor(希望后面需要清零的ebx,所以实际上可以节省3B)。 - Peter Cordes
1个回答

8
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语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接