2016-03-04 150 views
0
xor ebx,ebx 
mov eax,DWORD PTR fs:[ebx+0x3] 

我知道這段代碼的第一行,但是什麼是fs:[ebx+0x3]? 爲什麼它在編譯時給我一個錯誤?fs:[register + value]是什麼意思彙編?

test.asm:2: error: comma, colon, decorator or end of line expected after operand 
+0

在x86中,冒號表示「連接」。所以,它會將fs與[ebx + 0x3]連接起來。但是在這方面什麼是fs?看起來很奇怪,我們肯定錯過了一些東西。 –

+2

它是爲MASM編寫的代碼,不是NASM。這也是代碼,它不會像在Windows下執行任何有用的代碼一樣。你爲什麼試圖組裝這些代碼? –

+0

IIRC,NASM語法是'dword [fs:ebx + 0x3]'。清零'ebx'看起來像是爲了節省一個字節的代碼大小。 '[fs:0x3]'將需要'mov'指令的4字節位移編碼。 'xor'需要2個字節,並允許'mov'使用'[fs:reg + byte 0x3]'編碼。所以'mov'的長度縮短了3個字節,代價是額外的一個'xor'(希望後面需要調零的'ebx',所以它實際上是一個3B的節省。) –

回答

4

xor操作碼設置EBX爲0所以mov操作碼訪問位於fs一個DWORD:[3]。這將訪問位於fs:[0]fs:[3](4字節)的Win32 Thread Information Block'sCurrent Structured Exception Handling (SEH) frame的最後一個字節,以及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 - '(FS + 1)+(0 + 3)'=真實-FS:[4] = '棧基' 位置。

此外:爲了完整性:爲什麼它沒有組裝在'Ross Ridge'的評論中已經提到:它是MASM語法,而不是NASM語法。