(arm入门)反汇编分析一个arm函数调用的生死因果
arm的资料没有x86丰富,但搞安卓底层又绕不开这个。我作为一个初学者走了不少弯路,那么现在我用一个实际的例子来分析一个最简单的arm函数调用过程,希望能帮到大家,如果有理解不正确之处请高手指出。
注:这里的指令实际上是thumb(thumb2?),每个指令2字节
C源码:------------------------------------------------------------------
#include <stdio.h>#include <dlfcn.h>void (*func)(); void sub() { void *p = dlopen("libxxx.so", RTLD_NOW); if (!p) { return; } else { // myfn是libxxx.so的一个函数,作用是打印"call myfn...!" func = (void (*)())dlsym(p,"myfn"); func(); }}int main(){ printf("RTLD_NOW=%d/n", RTLD_NOW); sub(); return 0;}
运行结果---------------------------------------------------------------
反汇编分析-------------------------------------------------------------
sub:1. 84a0: 4808 ldr r0, [pc, #32] ; (84c4 <printf@plt+0x6c>)2. 84a2: 2100 movs r1, #03. 84a4: b510 push {r4, lr}4. 84a6: 4c08 ldr r4, [pc, #32] ; (84c8 <printf@plt+0x70>)5. 84a8: 4478 add r0, pc6. 84aa: 447c add r4, pc7. 84ac: f7ff efc8 blx 8440 <dlopen@plt>8. 84b0: b138 cbz r0, 84c2 <printf@plt+0x6a>9. 84b2: 4906 ldr r1, [pc, #24] ; (84cc <printf@plt+0x74>)10. 84b4: 4479 add r1, pc11. 84b6: f7ff efca blx 844c <dlsym@plt>12. 84ba: 4905 ldr r1, [pc, #20] ; (84d0 <printf@plt+0x78>)13. 84bc: 5863 ldr r3, [r4, r1]14. 84be: 6018 str r0, [r3, #0]15. 84c0: 4780 blx r016. 84c2: bd10 pop {r4, pc}
// 为5.做准备
1. r0 = [0x84a0+4+32] = [0x84c4] = 0x48
// dlopen的参数2
2. r1 = 0
// lr是sub的返回地址
3. r4,lr 入栈
// 为6.做准备
// 必须对齐到(0,4,8,c),所以0x84ca变成0x84c8
4. r4 = [0x84a6+4+32] = [0x84ca] = [0x84c8] = 0xc26
// dlopen的参数1 -> 0x84f4处存放字符串libxxx.so
5. r0 = 0x48+0x84a8+4 = 0x84f4
// 为13.做准备
6. r4 = 0xc26+0x84aa+4= 0x90D4
// 参数r0&r1,返回值r0
7. call dlopen
// 如果r0为0,则跳转到0x84c2
8. 条件跳转
// 为10.做准备
// ce对齐到cc
9. r1 = [0x84b2+4+24] = [0x84CE] = [0x84cc] = 0x46
// dlsym的参数2 -> 0x84FE处存放字符串myfn
10. r1 = 0x46+0x84b4+4 = 0x84FE
// 参数r0&r1,返回值r0,这个返回值就是myfn的地址
11. call dlsym
// 为13.做准备
// d2对齐到d0
12. r1 = [0x84ba+4+20] = [0x84D2] = [0x84d0] = 0xfffffffc
// r3是用来干嘛的呢,见14.
13. r3 = [0x90D4+0xfffffffc] = [0x90d0] = 0x90f0
// 将myfn的地址保存
14. [0x90f0] = r0
15. call myfn
16. 出栈,将lr放入pc,该sub返回
修改--------------------------------------------------------------------
从以上分析得知,12-14行的作用是将myfn的地址缓存以便加快以后重复的调用(该程序只调用了一次)
如果这个分析是正确的,那么将12-14行去掉应该不会影响程序的正常执行
下面是试验(将12-14行替换成nop,机器码0xc046):
修改后的运行结果:
程序执行正常
>更多相关文章
- 10-28怎样设密码不易被黑客破解
- 10-21不要随便连wifi了 你的手机可能已被黑客监听
- 09-30破解软件基本要求
- 09-30揭密软件加密保护技术
- 12-20使用tea算法对数据进行加密
- 12-17Android(安卓) APK文件反编译详解
- 12-17基于水印与电子签名的公开文档保护方法
- 12-09新手菜刀修改
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御