首页
社区
课程
招聘
如何找一个Call的上一层Call,,,我这个比较特殊
发表于: 2010-4-8 19:59 6185

如何找一个Call的上一层Call,,,我这个比较特殊

2010-4-8 19:59
6185
比如一个CALL A

我现在断在CALL A的内部的一行代码

我想找这个CALL的上一层CALL

但是我在所有调用这个CALL A的所有地方下了断点,断不下来

在断在CALL A的第一行代码(push epb)的时候,堆栈里没有返回地址

也就是说,不是用CALL转到这里的

CALL A反回的时候又不是在call代码的下面

这怎么办?

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

上传的附件:
  • 1.JPG (94.75kb,136次下载)
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
set up do not down
2010-4-8 20:21
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
难道真没办法吗?
2010-4-9 12:12
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
[ebp+4]指向的内容就是这一次call的返回地址,也就是指向上一层call的下一行代码
2010-4-9 14:16
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
代码经过优化了,走到ret指令时,esp指向返回地址
2010-4-9 14:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=xxxDebug;788546][ebp+4]指向的内容就是这一次call的返回地址,也就是指向上一层call的下一行代码[/QUOTE]

不是啊,我的图片就是断在call的第一行啊

但是这里的esp不是返回地址啊
2010-4-9 15:35
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我上面说了,走到ret时,esp指向的地址是另外用代码push进去的啊

就像

push ebp
move ebp esp
.......
push 0x00123456
ret

这样就ret到0x00123456

所以返回的根本不是调用CALL的下一行代码地址啊
2010-4-9 15:38
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
取得esp的值
取得堆栈的最大地址(在teb中)
在winDbg中用dds命令查看这段地址,如果符号全的话,很容易看出每一层调用栈的
2010-4-9 16:22
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
9
Run trace
2010-4-9 16:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Run跟踪嗯,是个办法,不过
这个CALL 前面有个很大的递归循环。。。。。。。。。。。。。。。
我过不了这个循环才跳到后面的这个CALL再往前分析的
2010-4-9 18:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我说了,代码运行到这里很可能不是用CALL命令的
要不然堆栈里就找出来了
2010-4-9 18:05
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
那你所谓的上一层call是什么意思?

只要是Call,返回地址一定在堆栈里,你从当前esp指向的堆栈位置往上找,第一个call就是了
返回地址所在的函数就是你所谓的上一层call了

我猜测有可能是这样的情况:
           call dword ptr [xxxxxxxx]-----你要找的位置
                ...
xxxxxxxx:yy yy yy yy

yyyyyyyy:jmp zzzzzzzz
               

zzzzzzzz:push ebp ---------你现在的位置
          mov ebp,esp
          sub  esp,mmm
2010-4-9 21:59
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
你这里的ret并不是这次call的结束,这是用ret代替jmp的一个典型用法!
2010-4-9 22:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=xxxDebug;788757]那你所谓的上一层call是什么意思?

只要是Call,返回地址一定在堆栈里,你从当前esp指向的堆栈位置往上找,第一个call就是了
返回地址所在的函数就是你所谓的上一层call了

我猜测有可能是这样的情况:
           call dword ptr [xxxxxx...[/QUOTE]

假如是用JMP到这里的,我只要找JMP这条代码的地址就可以了
2010-4-9 23:17
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
是啊,他这么干,我就没办法知道他是从哪里跳到这个CALL了
2010-4-9 23:19
0
雪    币: 622
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
ida 不就方便了吗 选那个打开函数调用窗口
2010-4-10 09:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
比如 JMP DWORD PTR [EBP+0X132456]
这种方式跳过来的,IDA就找不到啊
2010-4-10 11:02
0
游客
登录 | 注册 方可回帖
返回
//