ASM: Get offset and EIP

  • 1485
  • 0

摘要: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