【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

systemtap中的probe功能非常令人着迷。这种类似hook的方法对于我们调试性能和分析问题非常有用,更重要的是它还不需要重新编译,仅仅依靠几个脚本就可以完成你想要的功能,这不得不说是非常神奇。

后来,我自己想了一下,这个功能应该不是很复杂。关键就是要做好probe函数的保护和恢复工作就可以了。想到这,我就在vc 6.0上仿真实现了这么一段代码来说明问题。注意,如果在vs2010上运行,恢复地址那一行代码修改为*(&data +3)=test即可。

#include <stdio.h>
#include <windows.h>#define LEN 8
unsigned char save[LEN];void test();
void stub();// replace function
void stub()
{unsigned int data;unsigned char* p;unsigned int index;p = test;// above is data, ebp and return address// restore return address*(&data + 2) = test;// restore datafor(index = 0; index < LEN; index ++) {p[index] = save[index];}printf("stub ");
}//original functionvoid test()
{printf(" china");
}// content add is as follows
//  __asm {
//      lea eax, stub
//      call eax
//  }void set_stub(unsigned char* p, unsigned int data)
{   *(unsigned short*)p = 0x058d;*(unsigned int*)(p+2) = data;*(unsigned short*)(p+6) = 0xd0ff;
}int main()
{unsigned char* p = (unsigned char*) test;DWORD old;DWORD tmp;unsigned index;// modify attribute of code segmentif(!VirtualProtect(p, LEN, 0x40, &old)){exit(1);}for(index = 0; index < LEN; index ++){save[index] = p[index];}// modify addressset_stub(p, stub);// run test functiontest();// restore attribute of code segmentif(!VirtualProtect(p, LEN, old, &tmp)){exit(1);}return 1;
}

这段代码的内容不复杂,关键就是说强迫运行test函数之前一定要运行一下stub函数。首先,我们需要将test函数开始的代码设置成可读可写的属性;其次就是保存这一段原始代码内容,因为之后还是需要恢复的;接着利用set_stub函数将test一开始的代码设置成一段跳转内容,这样可以直接到stub执行;后面stub执行的时候,恢复ret地址和test开始处的data,这样在stub返回的时候可以继续到test函数执行;当然最后所有工作都完成的时候就可以恢复test数据段的属性了。就是这么简单。

随想录(systemtap中的基本原理)相关推荐

  1. 自动驾驶惯性传感器中的基本原理笔记

    自动驾驶惯性传感器中的基本原理笔记 前言:自动驾驶中常用的传感器有:九轴传感器.六轴传感器.查分GPS RTK.GPS.惯性导航(ins)等,因为在调试机器人过程中,产生一些的坐标系混乱问题,故此将搜 ...

  2. 随想录(kgdb的基本原理)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在linux kernel调试的时候,有一种很方便的调试方法,那就是kgdb.kgdb的本质,就 ...

  3. 计算机网络中隧道基本原理,隧道技术-高级计算机网络.ppt课件

    .,隧道技术,基本原理网状隧道机制主机间隧道机制星形隧道机制两次翻译和隧道技术隧道机制总结,.,隧道技术基本原理,隧道技术是通过对报文的封装/解封装,使得两个同构网络能在一个异构网络的两边桥接起来,实 ...

  4. Linux中使用Systemtap调试SLUB

    <Linux指令:SystemTap内核跟踪和探测工具> 之前的文章曾利用systemtap的"watchpoint"功能来监测变量数值的变化,但systemtap在内 ...

  5. SystemTap工具的使用基础

    systemtap工具的安装 准备工作 uname -a 查看当前内核版本是哪一个,然后使用 yum install kernel-devel 安装kernel debuginfo包 rpm -qi ...

  6. C#中的多线程 - 并行编程 z

    原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...

  7. Linux下性能测量和调试诊断工具Systemtap

    一.简介 SystemTap是一个诊断Linux系统性能或功能问题的开源软件.它使得对运行时的Linux系统进行诊断调式变得更容易.更简单.有了它,开发者或调试人员不再需要重编译.安装新内核.重启动等 ...

  8. Linux 自检和 SystemTap

    2009 年 12 月 03 日 现代的操作系统内核提供自检 功能,即动态地检查内核以理解其行为的能力.这些行为可以反映内核问题和性能瓶颈.拥有这些信息时候,您就可以调优或修改内核以避免出现故障.本文 ...

  9. LSM-tree基本原理及应用

    LSM-tree基本原理及应用 LSM-tree是什么 log-structed merge-tree 日志结构的:系统日志是不会出错的,只需要在后面追加.所以日志结构就代指追加型结构. 原理:把磁盘 ...

最新文章

  1. Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)
  2. 深度学习笔记第一门课第一周:深度学习引言
  3. 22为什么有些人更愿意帮助别人
  4. python常用函数的用法_python中常用函数整理
  5. cloudflare 利用API将域名批量解析到cloudflare
  6. python内置对象是什么_Python的内置对象类型——元组、文件,python
  7. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
  8. 浅拷贝直接赋值_Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)?...
  9. AD20软件安装详细教程
  10. oracle系统的物料编码,关于标准form 物料编码查询 不通过lov
  11. PLSQL使用常用技巧
  12. 第四讲 系统建模方法
  13. Linux内核学习路线 学习linux内核的建议
  14. 二极管、稳压二极管、发光二极管电路测试
  15. CentOS 7 下安装五笔输入法
  16. 用友U8V10.1软件安装教程
  17. c语言绝对值大小并输出原值,c语言中绝对值大小的比较
  18. mvp的全称_打游戏抢了这么久的MVP,你竟不知道MVP的全称和由来?
  19. 【有效】最新爬取音乐,纯接口访问实现。Python3、requests、美丽汤、tqdm实战
  20. 手机是如何泄密个人隐私的

热门文章

  1. 实现基于最近邻内插和双线性内插的图像缩放C++实现
  2. [转]easyui 全部图标
  3. hibernate联合主键
  4. HTML 5 中的新元素
  5. iphone iPhone开发中为UINavigationBar设置背景图片方法
  6. element 时间选择器——年
  7. Kafka监控KafkaOffsetMonitor【转】
  8. HDU 2639(01背包求第K大值)
  9. IOS Window窗口使用
  10. memcached 内存管理 分析(转)