摘要:ASM: Get offset and EIP
在某些极端情况下,在汇编模式下需获取当前指令位置或下条执行位置。之前记住了,很久了又忘记了,因此单独再发一下。
DWORD Addr;
__asm{
fldz
fstenv[esp-0x0C]
pop ebx
mov Addr, ebx
}
此代码可用在VC模式下,若高版本VS需关闭运行时检查。
但是,其实这个代码也是有点问题的,缺点是在于,会出异常,当然,一般情况下无伤大雅,不过作为完美的人怎么可以这样?
因此有了这段代码:
call $+5
mov eax,[esp]
00401000 > $ E8 00000000 call SC.00401005
00401005 $ 8B0424 mov eax,dword ptr ss:[esp] ;after EAX=00401005
这样就可以获取当前代码行在内存中的位置。
不过....如果想要下一行呢?(非特指实际执行位置)
在MASM下可以这样写:
jmp short tostart
getoffset:
pop eax
tostart:
call getoffset
实际效果如下:
00401000 > $ /EB 02 jmp short SC.00401004
00401002 $ |58 pop eax
00401003 . |90 nop ; now EAX=00401009
00401004 > \E8 F9FFFFFF call SC.00401002
------------------------------
文章的授權使用CC BY-ND2.5協議。凡是標示“轉載”的文章,均來源於網絡並儘可能標註作者。如果有侵犯您的權益,請及時聯繫刪除或者署名、授權。
Gtalk/Email: cmd4shell [at] gmail.com