首页
社区
课程
招聘
[求助]这里为什么有两个 push ecx?
发表于: 2011-3-5 00:20 6509

[求助]这里为什么有两个 push ecx?

2011-3-5 00:20
6509
用WinDbg查了一下ObReferenceObjectByHandle这个函数
发现竟然有两个push    ecx
也就是红色的那块
但是,在最后没有相应的pop
这是为什么?
谢谢大家

ObReferenceObjectByHandle:
805b1b70 8bff            mov     edi,edi
805b1b72 55              push    ebp
805b1b73 8bec            mov     ebp,esp
805b1b75 51              push    ecx
805b1b76 51              push    ecx

805b1b77 53              push    ebx
805b1b78 56              push    esi
805b1b79 57              push    edi
805b1b7a 64a124010000    mov     eax,dword ptr fs:[00000124h]
805b1b80 8b7d18          mov     edi,dword ptr [ebp+18h]
805b1b83 33db            xor     ebx,ebx
805b1b85 395d08          cmp     dword ptr [ebp+8],ebx
805b1b88 8bf0            mov     esi,eax
805b1b8a 891f            mov     dword ptr [edi],ebx
805b1b8c 0f8dee000000    jge     nt!ObReferenceObjectByHandle+0x110 (805b1c80) [br=0]
805b1b92 837d08ff        cmp     dword ptr [ebp+8],0FFFFFFFFh
805b1b96 755c            jne     nt!ObReferenceObjectByHandle+0x84 (805b1bf4)
805b1b98 8b4510          mov     eax,dword ptr [ebp+10h]
805b1b9b 3b05d8b25580    cmp     eax,dword ptr [nt!PsProcessType (8055b2d8)]
805b1ba1 7404            je      nt!ObReferenceObjectByHandle+0x37 (805b1ba7)
805b1ba3 3bc3            cmp     eax,ebx
805b1ba5 7562            jne     nt!ObReferenceObjectByHandle+0x99 (805b1c09)
805b1ba7 8b7644          mov     esi,dword ptr [esi+44h]
805b1baa 8b8ea4010000    mov     ecx,dword ptr [esi+1A4h]
805b1bb0 8bc1            mov     eax,ecx

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
PUSH ECX不是为了保存ECX,而是为了在栈中申请空间,如果用sub esp,8申请空间,编码会更长。根据函数调用约定,ECX也不是受保护的寄存器。
2011-3-5 08:25
0
雪    币: 143
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上正解,我昨天刚好在加解3上面看过这一段.
2011-3-5 08:49
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢两位的解答
但是有一个问题还是困扰着我:
下面是这个函数的结尾部分:
805b1e05 5f              pop     edi
805b1e06 5e              pop     esi
805b1e07 5b              pop     ebx
805b1e08 c9              leave
805b1e09 c21800      ret     18h

这三句代码:
805b1e05 5f              pop     edi
805b1e06 5e              pop     esi
805b1e07 5b              pop     ebx
与前面的这三句
805b1b77 53              push    ebx
805b1b78 56              push    esi
805b1b79 57              push    edi
对应,恢复了堆栈
而这句:
805b1e08 c9              leave
相当于pop ebp
是不是把ecx的内容弹到了ebx里去了?
就这里很疑惑,希望大家帮我,谢谢~~
2011-3-5 09:25
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
看手册吧,leave大概相当于:
    mov esp,ebp
    pop ebp
2011-3-5 09:39
0
游客
登录 | 注册 方可回帖
返回
//