能力值:
( LV2,RANK:10 )
|
-
-
2 楼
set up do not down
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
难道真没办法吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
[ebp+4]指向的内容就是这一次call的返回地址,也就是指向上一层call的下一行代码
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
代码经过优化了,走到ret指令时,esp指向返回地址
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=xxxDebug;788546][ebp+4]指向的内容就是这一次call的返回地址,也就是指向上一层call的下一行代码[/QUOTE]
不是啊,我的图片就是断在call的第一行啊
但是这里的esp不是返回地址啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我上面说了,走到ret时,esp指向的地址是另外用代码push进去的啊
就像
push ebp
move ebp esp
.......
push 0x00123456
ret
这样就ret到0x00123456
所以返回的根本不是调用CALL的下一行代码地址啊
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
取得esp的值
取得堆栈的最大地址(在teb中)
在winDbg中用dds命令查看这段地址,如果符号全的话,很容易看出每一层调用栈的
|
能力值:
( LV12,RANK:240 )
|
-
-
9 楼
Run trace
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
Run跟踪嗯,是个办法,不过
这个CALL 前面有个很大的递归循环。。。。。。。。。。。。。。。
我过不了这个循环才跳到后面的这个CALL再往前分析的
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我说了,代码运行到这里很可能不是用CALL命令的
要不然堆栈里就找出来了
|
能力值:
( 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
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
你这里的ret并不是这次call的结束,这是用ret代替jmp的一个典型用法!
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
[QUOTE=xxxDebug;788757]那你所谓的上一层call是什么意思?
只要是Call,返回地址一定在堆栈里,你从当前esp指向的堆栈位置往上找,第一个call就是了
返回地址所在的函数就是你所谓的上一层call了
我猜测有可能是这样的情况:
call dword ptr [xxxxxx...[/QUOTE]
假如是用JMP到这里的,我只要找JMP这条代码的地址就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
是啊,他这么干,我就没办法知道他是从哪里跳到这个CALL了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
ida 不就方便了吗 选那个打开函数调用窗口
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
比如 JMP DWORD PTR [EBP+0X132456]
这种方式跳过来的,IDA就找不到啊
|
|
|