ARM架构kprobe应用及实现分析(6.0 导出堆栈的值)
来源:互联网 发布:老薛主机 知乎 编辑:程序博客网 时间:2024/04/30 14:26
上篇讲过了导出寄存器的值
但是当函数参数多余4个的话(R0 R1 R2 R3 ),其他的值会保存在堆栈中,所以必须导出SP附近的值才能查看其它参数的值
此函数实现如下:
第一个参数为SP的值,第二个是一SP为中心要打印周围栈的数据
static int dump_arm_stack(unsigned int * _addr , unsigned int addrSize){ int i=0; int j=0; int word_per_line=4; unsigned int * addr = _addr; addr = addr + word_per_line*addrSize; for(i=0;i<addrSize*2;i++) { char * middlestack = "---"; if(i==addrSize) { middlestack = "$$$"; } printk(" addr:0x%08x %s 0x%08x 0x%08x 0x%08x 0x%08x \n", \ (addr-(i*word_per_line+0)),\ middlestack, \ *(addr-(i*word_per_line+0)),\ *(addr-(i*word_per_line+1)),\ *(addr-(i*word_per_line+2)),\ *(addr-(i*word_per_line+3)) \ ); } return 0;}
实际调用(regs->uregs[13] 即为stack pointer):
static int handler_pre(struct kprobe *p, struct pt_regs *regs){ printk(" kprobes name is %s pt_regs size is %d \n",p->symbol_name,sizeof(regs->uregs)); dump_arm_regs(regs->uregs); dump_arm_stack((unsigned int *)regs->uregs[13],5);return 0;}
当探测到实际printk输出如下:
//导出当时堆栈的值
<4>[ 9749.267927]-(0)[186:adbd] addr:0xdbe8ff80 --- 0xdbe8ffa4 0x00000000 0xdbe8e000 0xc000e0a4
<4>[ 9749.269044]-(0)[186:adbd] addr:0xdbe8ff70 --- 0x00000002 0x00043d34 0x00042ff4 0x00000035
<4>[ 9749.270161]-(0)[186:adbd] addr:0xdbe8ff60 --- 0x00000035 0x80045430 0x00000000 0xc8131300
<4>[ 9749.271278]-(0)[186:adbd] addr:0xdbe8ff50 --- 0xdbe8ff7c 0x00000000 0x00000001 0x00000000
<4>[ 9749.272395]-(0)[186:adbd] addr:0xdbe8ff40 --- 0x00000001 0xc063bd50 0x00000088 0x00000055
<4>[ 9749.273512]-(0)[186:adbd] addr:0xdbe8ff30 $$$ 0x000000440xc00872a4 0xc00524fc 0xdbe8ff30 //这里是当时堆栈的中心
<4>[ 9749.274629]-(0)[186:adbd] addr:0xdbe8ff20 --- 0xdbe8ff8c 0x00000000 0xdbe8e000 0xdc38f000
<4>[ 9749.275746]-(0)[186:adbd] addr:0xdbe8ff10 --- 0x00001482 0x00000000 0xdbe8e000 0xc4b6b000
<4>[ 9749.276864]-(0)[186:adbd] addr:0xdbe8ff00 --- 0xc06309f4 0x60000013 0xdbe8ff1c 0xc063bd98
<4>[ 9749.277981]-(0)[186:adbd] addr:0xdbe8fef0 --- 0xc00873c8 0xffffffff 0x60000013 0xc0052368
testAddadd5(0x11,0x22,0x33,mytestbuf,0x44,0x55,0x88);
可以看出上面printk输出红色部分与第5,6,7的传入的参数是一致的。
说明导出的stack的值是可信的。
- ARM架构kprobe应用及实现分析(6.0 导出堆栈的值)
- ARM架构kprobe应用及实现分析(5.0 打印寄存器的值)
- ARM架构kprobe应用及实现分析(7.0 自动显示参数的值)
- ARM架构kprobe应用及实现分析(8.0 register_kprobe实现)
- ARM架构kprobe应用及实现分析(1.0 简单示例)
- ARM架构kprobe应用及实现分析(11 原理)
- ARM架构kprobe应用及实现分析(10 trap中断注册及回调)
- ARM架构kprobe应用及实现分析(2.0 register_kprobe error 38)
- ARM架构kprobe应用及实现分析(3.0 被探测函数说明)
- ARM架构kprobe应用及实现分析(9.0 arch_prepare_kprobe平台相关注册)
- 堆栈java实现及应用
- Kprobes源码分析----kprobe的注册
- Kprobes源码分析----kprobe的处理
- ARM及ARM架构的背景
- 堆栈及队列的实现
- Hbase的应用场景、原理及架构分析
- Hbase的应用场景、原理及架构分析
- ARM堆栈及特殊指令
- Roundabout不规则列表效果展示,类似旋转木马效果
- android开发教程(五)——java之包
- Unix网络编程学习笔记——Select函数的返回条件
- 从恒大亚冠夺冠夜看恒大营销
- 优先队列使用基础
- ARM架构kprobe应用及实现分析(6.0 导出堆栈的值)
- 冒泡排序——优化
- ORACLE实现字段自增
- 设计一个计算器类Claculator,它只有一个用于计数的数据成员count。该计算器的有效计数范围是0~65535,实现计数器的前自增、后自增、前自减、后自减、两个计算器相加减运算
- 《编程珠玑(第2版)》笔记——将一个n元一维向量向左旋转i个位置(第2章)
- BLE 包结构及传输速率
- java-位操作符
- oracle常用视图
- vc中release和debug的区别