首页
社区
课程
招聘
[求助]Android中so反汇编后地址定位的问题
发表于: 2014-7-7 23:21 8141

[求助]Android中so反汇编后地址定位的问题

2014-7-7 23:21
8141
如下代码是我自己写的一个函数。在android ndk 9r上编译,在Android4.4.4上调试模式真机运行时的反汇编结果。

我的问题是:
1. 图中第一片红色代码区域通过pc和函数末尾的一部分数据,通过计算后得到的r4的值有什么特性?为什么可以这样计算?
注:因为我发现计算后得出的r4是一个比较特殊的值,可能执行内存中某个固定位置。如,如下小段代码,即可将一个全局的指针放到r2中。
   0x7501942c <+360>:  ldr  r3, [pc, #64]  ; 0x75019474 <verify()+432>
   0x75019430 <+364>:  ldr  r3, [r4, r3]
   0x75019434 <+368>:  ldr  r2, [r3]

2. 作为上一问的附加,函数末尾的那一部分红色代码的作用是什么?

非常感谢。

Dump of assembler code for function verify():
   0x750192c4 <+0>:	push	{r4, r11, lr}
   0x750192c8 <+4>:	add	r11, sp, #8
   0x750192cc <+8>:	sub	sp, sp, #20
   [B][COLOR="red"]0x750192d0 <+12>:	ldr	r4, [pc, #408]	; 0x75019470 <verify()+428>
   0x750192d4 <+16>:	add	r4, pc, r4
   0x750192d8 <+20>:	ldr	r3, [pc, #404]	; 0x75019474 <verify()+432>
   0x750192dc <+24>:	ldr	r3, [r4, r3][/COLOR][/B]
   0x750192e0 <+28>:	ldr	r3, [r3]
   0x750192e4 <+32>:	mov	r0, r3
   0x750192e8 <+36>:	bl	0x75018fc0
   0x750192ec <+40>:	mov	r3, r0
   0x750192f0 <+44>:	str	r3, [r11, #-20]

.....
...

   0x75019400 <+316>:	ldr	r1, [r3]
   0x75019404 <+320>:	ldr	r3, [r11, #-16]
   0x75019408 <+324>:	and	r3, r3, #255	; 0xff
   0x7501940c <+328>:	rsb	r3, r3, #0
   0x75019410 <+332>:	and	r2, r3, #255	; 0xff
   0x75019414 <+336>:	ldr	r3, [r11, #-24]
   0x75019418 <+340>:	add	r3, r1, r3
   0x7501941c <+344>:	strb	r2, [r3]
   0x75019420 <+348>:	ldr	r3, [r11, #-24]
   0x75019424 <+352>:	add	r3, r3, #1
   0x75019428 <+356>:	str	r3, [r11, #-24]
   0x7501942c <+360>:	ldr	r3, [pc, #64]	; 0x75019474 <verify()+432>
   0x75019430 <+364>:	ldr	r3, [r4, r3]
   0x75019434 <+368>:	ldr	r2, [r3]
   0x75019438 <+372>:	ldr	r3, [r11, #-24]
   0x7501943c <+376>:	add	r3, r2, r3
   0x75019440 <+380>:	ldrb	r3, [r3]
   0x75019444 <+384>:	cmp	r3, #0
   0x75019448 <+388>:	moveq	r3, #0
   0x7501944c <+392>:	movne	r3, #1
---Type <return> to continue, or q <return> to quit---
   0x75019450 <+396>:	and	r3, r3, #255	; 0xff
   0x75019454 <+400>:	cmp	r3, #0
   0x75019458 <+404>:	bne	0x750193b8 <verify()+244>
   0x7501945c <+408>:	ldr	r3, [pc, #24]	; 0x7501947c <verify()+440>
   0x75019460 <+412>:	ldr	r3, [r4, r3]
   0x75019464 <+416>:	mov	r0, r3
   0x75019468 <+420>:	mov	r1, #2
   0x7501946c <+424>:	bl	0x75018fa8
[B][COLOR="Red"]   0x75019470 <+428>:	ldrdeq	r2, [r0], -r4
   0x75019474 <+432>:			; <UNDEFINED> instruction: 0xffffffd0
   0x75019478 <+436>:			; <UNDEFINED> instruction: 0xffffffd4
   0x7501947c <+440>:			; <UNDEFINED> instruction: 0xffffffd8[/COLOR][/B]



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感觉像是用来实现对当前函数中用到的变量进行重定位。但是不确定。没找到比较权威的解释。

求解啊
2014-7-8 00:17
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
3
第一段标红代码应该是加载常量数据,这个是编译后自动生成的。水平有限,第二段不懂。
2014-7-8 08:38
0
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
初步发现,第一部分是计算出got( global offset table),存储在r4;
0x750192d0 <+12>:  ldr  r4, [pc, #408]  ; 0x75019470 <verify()+428>
   0x750192d4 <+16>:  add  r4, pc, r4

然后根据offset, 计算出指向全局变量的指针:(在bss段)
0x750192d8 <+20>:  ldr  r3, [pc, #404]  ; 0x75019474 <verify()+432>   //据算出存储全局变量的地址
   0x750192dc <+24>:  ldr  r3, [r4, r3]  //取出全局边变量

函数末尾部分是用来实现重定位
------------
需要好好学习 elf文件的链接与加载了
2014-7-8 08:53
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=chopsticks;1299043]初步发现,第一部分是计算出got( global offset table),存储在r4;
0x750192d0 <+12>:  ldr  r4, [pc, #408]  ; 0x75019470 <verify()+428>
   0x750192d4 <+16>:  add  r4...[/QUOTE]

有函数重定位方面的资料么?
2014-7-8 12:33
0
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这本书吧

http://www.amazon.cn/程序员的自我修养-链接-装载与库-潘爱民/dp/B0027VSA7U
2014-7-9 14:45
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
0x750192d0 <+12>:  ldr  r4, [pc, #408]  ; 0x75019470 <verify()+428>
的意思是把pc当前值偏移408的地址存储的值加载到r4去,就是0x75019470 处的值.
2014-7-10 10:18
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
8
Thx~!
2014-7-10 12:22
0
游客
登录 | 注册 方可回帖
返回
//