首页
社区
课程
招聘
[求助]堆栈 汇编的跳转 HOOK
发表于: 2009-3-2 14:02 6924

[求助]堆栈 汇编的跳转 HOOK

2009-3-2 14:02
6924
我对栈平衡不太了解,请大家帮我就这个题目讲解一下:

void Myfun()
{
        MessageBox(NULL,"dddd","DDD",0);
}

void TestFUN()
{
        DWORD dwkk =  (DWORD)Myfun;
       
        __asm
        {               

                push   dwkk            
                ret

       
        }
}

以上运行会出错...什么问题?

void TestFUN()
{
        DWORD dwkk =  (DWORD)Myfun;

        __asm
        {

                call hehe
hehe:
                pop eax
                add eax,9
                push eax
                push  dwkk               
                ret
        }
}
   
  

改成这样就OK为什么????

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
call = push 返回地址+push跳转地址+ret
你1楼只push+ret 那就相当于一个jmp so返回地址出错
   call hehe
hehe:
    pop eax
    add eax,9
经过这个操作后eax就拿到了返回地址 push进去之后 就OK了
2009-3-2 14:13
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能再说详细一点吗?
2009-3-2 14:23
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有没有别的方法..可以不出错???
2009-3-2 14:25
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主想想:
你用
push   dwkk      
ret
这样调用了Myfun,但是你想想这个函数完了往什么地方返回,我这样写你也许就明白了
void TestFUN()
{
  DWORD dwkk =  (DWORD)Myfun;
  
  __asm
  {
        push b1
        push  dwkk      
        ret
b1:        nop
  }
}
2009-3-2 16:44
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
void TestFUN()
{
  DWORD dwkk =  (DWORD)Myfun;

  __asm
  {

    call hehe
hehe:
    pop eax
    add eax,9
    push eax
    push  dwkk   
    ret
  }
}

这不就是传说说 模拟了一个CALL的功能?

楼主看看什么叫CALL
2009-3-2 17:08
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个好象有问题啊 ?
2009-3-2 18:36
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还是没有搞清楚,我知道函数要返回..但是这个返回地址应该是CS:IP说了算啊.
给EAX赋值有什么用呢???
麻烦大家再说说吧,,我还是没有懂
2009-3-2 18:50
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我明白了一点点:知道要返回

就是不知道为什么一定要在push  dwkk  之前压一个值,这个值压入后,是不是作为函数的返回值呢??

改成这样也行:

void TestFUN()
{
        DWORD dwkk =  (DWORD)Myfun;
       
        __asm
        {
       
                    mov eax, offset wenboly
                    push eax
                        push  dwkk      
                        ret
wenboly:
                        nop

        }
}
2009-3-2 19:00
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
401000 call Myfun
401005 xxxxxxxx

===========

push 4010005 //压入CALL的下一行汇编代码
jmp Myfun

压入个地址为了告诉程序运行完了CALL,要去什么地方
2009-3-2 21:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你是用push & retn的方法直接让代码跳转到了Myfun函数头去开始执行,这个操作并不等于call,而是相当于jmp,简单的说就是你在跳转到Myfun函数去执行之前,没有告诉Myfun这个函数执行完之后应该返回到什么地方去执行以后的代码,所以Myfun函数执行完毕后跳转到了一个无效位置,然后出错
2009-3-3 00:37
0
雪    币: 991
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢各位。。。。。。。
2009-3-3 08:34
0
雪    币: 264
活跃值: (11)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
13
call==push eip+5/push offset FUNC/ret
ret ==pop eip...

可以这么理解...
2009-3-3 20:16
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主应该看看栈,函数执行完毕之后是要返回的,你那个mov eax, offset wenboly就是要取wenboly的偏移
2009-3-3 21:42
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
void Myfun()
{
  MessageBox(NULL,"dddd","DDD",0);
}

void TestFUN()
{
  DWORD dwkk =  (DWORD)Myfun;
  
  __asm
  {   
    lea eax,rreett
    push eax
    push   dwkk      
    ret
rreett:
  
  }
}

你没给返回地址,肯定出错
2009-3-4 00:21
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
正解。
2009-3-4 00:22
0
游客
登录 | 注册 方可回帖
返回
//