首页
社区
课程
招聘
[求助]ida动态调试apk如何回溯callback
发表于: 2016-12-30 13:23 6061

[求助]ida动态调试apk如何回溯callback

2016-12-30 13:23
6061
如题,
windows程序的每次调用call时函数返回自动压栈,然后通过ebp回溯,
arm的callStack怎么回溯?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
windows是esp,ebp只是没优化的
arm是 LR
2016-12-30 13:58
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
LR只能回溯上一层,怎么回溯到前面的sp?
2016-12-30 14:29
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LR和esp不是一样吗
都是push 然后 pop
2016-12-30 17:16
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
美女他是想看到LR的LR的LR的LR呢,上层的上层的上上上层函数呢
2016-12-30 18:23
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
arm参数传递超过4个也是通过push来传递参数,还有局部变量也需要push来申请空间,怎么判断ps寄存器里的哪个地址是上一层的LR
2016-12-30 20:48
0
雪    币: 9479
活跃值: (757)
能力值: ( 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
2016-12-30 21:03
0
雪    币: 101
活跃值: (200)
能力值: ( 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
2016-12-30 21:18
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
push=STR
LOAD:000063EC 000                 STR             LR, [SP,#var_4]!
这个push的LR就是,也可以看之前的SP-4
2016-12-30 21:23
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
后面还要SUB    SP, SP, #xxx 之类的呢?
2016-12-30 21:31
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
BX LR
LR就在SP-4
2016-12-30 22:39
0
雪    币: 101
活跃值: (200)
能力值: ( 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?
2016-12-31 17:53
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
静态分析做回溯,你要成大神了
2016-12-31 21:39
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
标题不是说了动态调试吗,静态分析哪里有SP值
2016-12-31 21:39
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
是动态分析,不然哪里有sp的值
上面的反汇编只是比如
2016-12-31 21:41
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
LR是单独的寄存器
2016-12-31 21:43
0
雪    币: 101
活跃值: (200)
能力值: ( 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();
2016-12-31 22:10
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
pc优化编译后是没有ebp的,只有esp的,你用vc测试一下就知道了
2017-1-1 10:50
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
没有添加framepointer的话,是比较难的,需要逐条解析arm/thumb*指令,判断是否是栈操作指令,然后根据指令做反向调整sp,可以看看开源的stack unwind实现
2017-1-3 11:33
0
雪    币: 101
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢。
是的,没有frame pointer确实没找到有效的方法,我去研究一下stack unwind。
2017-1-3 11:56
0
游客
登录 | 注册 方可回帖
返回
//