用call ret实现花指令和跳转的例子

 

代码
#include <iostream.h>
#include 
<windows.h>
void main()
{
    DWORD p;
    _asm
    {
        call l1
l1:
        pop eax
        mov p,eax
//确定当前程序段的位置
        call f1
        _EMIT 
0xEA//花指令,此处永远不会执行到
        jmp l2//call结束以后执行到这里
f1://这里用F8OD会终止调试,F7跟进的话就正常,why?
        pop ebx
        inc ebx
        push ebx
        mov eax,
0x11111111
        ret
l2:
        call f2
//用ret指令实现跳转
        mov ebx,0x33333333//这里永远不会执行到
        jmp e//这里永远不会执行到
f2:
        mov ebx,
0x11111111
        pop ebx
//弹出压栈的地址
        mov ebx,offset e//要跳转到的地址
        push ebx//压入要跳转到的地址
        ret//跳转
e:
        mov ebx,
0x22222222
    }
    cout
<<hex<<p<<endl;
}

 

 

posted @ 2010-05-04 11:29  认真做人,认真做事  阅读(1131)  评论(0编辑  收藏  举报