能力值:
( LV2,RANK:10 )
|
-
-
2 楼
windows是esp,ebp只是没优化的
arm是 LR
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
LR只能回溯上一层,怎么回溯到前面的sp?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
LR和esp不是一样吗
都是push 然后 pop
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
美女他是想看到LR的LR的LR的LR呢,上层的上层的上上上层函数呢
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
arm参数传递超过4个也是通过push来传递参数,还有局部变量也需要push来申请空间,怎么判断ps寄存器里的哪个地址是上一层的LR
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
pc的函数入口:
push esp
出口:
pop esp
arm的函数入口:
push {R11,LR} //有可能不一样,但肯定都有LR
出口:
pop {R11,LR}
arm的push也可能用STR代替
所以arm的堆栈比pc多压了几个数据而已,实际差不太多
而且LR不会有其他用途,不像esp一个寄存器多种用途
esp和LR都是-4
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
关键不是每个函数都是push {R11,LR}
如果遇到SUB SP, SP, #xxx 之类的,怎么知道堆栈增减了?难道还要解析汇编?
还有下面的函数怎么获取callback:
LOAD:000063EC sub_63EC ; CODE XREF:
LOAD:000063EC
LOAD:000063EC 000 STR LR, [SP,#var_4]!
LOAD:000063F0 004 LDR R3, [R0,#0xF0]
LOAD:000063F4 004 MOV R2, #1
LOAD:000063F8 004 SUB SP, SP, #0x14
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
push=STR
LOAD:000063EC 000 STR LR, [SP,#var_4]!
这个push的LR就是,也可以看之前的SP-4
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
后面还要SUB SP, SP, #xxx 之类的呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
BX LR
LR就在SP-4
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
下面的函数,比如我断点在000069A8位置,不人工分析反汇编的话,怎么通过SP计算出LR在SP的位置?
LOAD:00006964 000 STMFD SP!, {R4-R11,LR}
LOAD:00006968 024 CMP R2, #0
LOAD:0000696C 024 SUB SP, SP, #0x3C
LOAD:00006970 060 STR R2, [SP,#0x60+var_5C]
LOAD:00006974 060 MOV R11, R0
LOAD:00006978 060 STR R3, [SP,#0x60+var_4C]
LOAD:0000697C 060 BEQ loc_6A68
LOAD:00006980 060 LDR R4, =(aDlopen - 0x6994)
LOAD:00006984 060 MOV R8, #0
LOAD:00006988 060 ADD R9, R1, #8
LOAD:0000698C 060 ADD R4, PC, R4 ; "dlopen"
LOAD:00006990 060 STR R4, [SP,#0x60+s2]
LOAD:00006994 060 LDR R4, =(aDlsym - 0x69A0)
LOAD:00006998 060 ADD R4, PC, R4 ; "dlsym"
LOAD:0000699C 060 STR R4, [SP,#0x60+var_48]
LOAD:000069A0 060 LDR R4, =(aDlclose - 0x69AC)
LOAD:000069A4 060 ADD R4, PC, R4 ; "dlclose"
LOAD:000069A8 060 STR R4, [SP,#0x60+var_44]
我是想写一个ida脚本,通过sp自动回溯前面的所有callback?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
静态分析做回溯,你要成大神了
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
标题不是说了动态调试吗,静态分析哪里有SP值
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
是动态分析,不然哪里有sp的值
上面的反汇编只是比如
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
LR是单独的寄存器
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
你说的LR是单独寄存器,也就只能知道上一个函数返回,而我想回溯上上层的函数返回
下面这个是win32的堆栈
通过call指令进入函数后,函数地址入栈后,EBP入栈,然后把当前ESP的值给EBP,对应的汇编指令:
push ebp
mov ebp esp
此时栈顶和栈底指向同一位置,栈内分布如下:
也就说在函数任何地方,可以通过ebp来获取esp进入函数之前的地址,然后再回溯又可以获取上上次进入函数之前esp的地址,这样可以一直回溯每个函数返回地址
现在我就想知道arm下的sp如何回溯
然后arm并不像x86那样,有ebp保存进入函数时esp的值,而arm的sp通过什么公式可以知道进入函数之前时的sp值和lr。android提供下面的方法可以回溯CallStack,也就说有算法可以回溯的,谁知道这个公式
CallStack stack;
stack.update();
stack.dump();
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
pc优化编译后是没有ebp的,只有esp的,你用vc测试一下就知道了
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
没有添加framepointer的话,是比较难的,需要逐条解析arm/thumb*指令,判断是否是栈操作指令,然后根据指令做反向调整sp,可以看看开源的stack unwind实现
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
谢谢。
是的,没有frame pointer确实没找到有效的方法,我去研究一下stack unwind。
|