首页
社区
课程
招聘
[旧帖] [求助]奇怪的call调用 0.00雪花
发表于: 2008-10-4 00:44 3460

[旧帖] [求助]奇怪的call调用 0.00雪花

2008-10-4 00:44
3460
我在跟踪一网游时,汇编为
01131DA0 >  53              push    ebx    ;此处设断点
01131DA1    55              push    ebp
停在01131DA0这一句。
此时堆栈为
0012FBF4   011329D7  返回到 xxxxx.011329D7 来自 xxxxx.FSocket::OnTimer
0012FBF8   0976CF48

011329D7这里的代码为
011329D0    8BCE            mov     ecx, esi
011329D2    E8 A9F4FFFF     call    FSocket::OnTimer
011329D7    8B46 28         mov     eax, dword ptr [esi+28]
然后我在011329D2这个call下断,F7跟进,结果却到了别的代码:
01131E80 >  56              push    esi
01131E81    8BF1            mov     esi, ecx
它的堆栈为
0012FC50   011329D7  返回到 xxxxx.011329D7 来自 xxxxx.FSocket::OnTimer
0012FC54   03FDD6C8

如果把011329D2这个call的断点取消,会停在01131DA0的断点处,这时OD底部有提示“断点位于xxxxx.FSocket::OnWrite”。
这个call是怎么回事啊?
我弄不懂,诚心请教。

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
一般是在函数FSocket::OnTimer中没有直接ret,有JMP到另外的地址,然后又到了01131DA0```
2008-10-4 07:31
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
void OnTimer()
{
       do_some_thing1();
       do_base_thing();
}

void OnWrite()
{
       do_some_thing2();
       do_base_thing();
}

如果a调用一个无参数的函数b, b里面最后调用一个无参的函数c
本来应该是是
b
{
   call  c
     ret
}
编译器优化后
b
{
   jmp c
}
这样another_func ret的时候就直接到a里面了

显然
01131DA0 >  53         是在c里面, 就不知道经过了谁call过来的。。
你看到的是a, 你跟进去的是b, 所以a和b不是同一函数, 代码间隔很远也是正常的。
2008-10-4 08:54
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢2位的回答,尤其是jjnet说得很清楚,明白了。

Thanks very much!
2008-10-4 09:09
0
游客
登录 | 注册 方可回帖
返回
//