注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

hook系统函数实现故障模拟  

来自何佳龙   2013-09-11 20:03:13|  分类: 功能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前段时间在微博上了解到一种故障测试的好方法:hook,由于之前项目比较忙一直没有时间研究,今天抽空简单的试了下,发现果然是个靠谱的好方法。由于研究不深,今天先简单的记录下,展示下hook的效果,以后做深入研究后再写篇详细点的博文。
hook实现故障模拟的基本原理简单来说是这样的:任何应用程序运行时与操作系统的交互都是通过调用底层的系统调用来实现的,比如读写文件是通过系统的read、write调用,进行网络通信是通过系统的connect、recv等调用。因此如果用自己实现的函数来替换系统调用中特定的函数,让应用程序与操作系统交互时调用我们自己写的函数,就能够在操作系统级别模拟任何故障。这样做,不需要改变被测系统的代码,模拟故障简单快捷。
    下面说一下我实验的内容,我写了一个read的hook函数,让应用在调用read函数时有50%的概率出错,hook函数代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <dlfcn.h>
ssize_t read(int fd, void *buf, size_t count)
{
srand(time(NULL));
int r = rand() % 100;
if (r > 50) {
return -1;
} else {
ssize_t (*_read)(int fd, void *buf, size_t count) = NULL;
_read = (ssize_t (*)(int fd, void *buf, size_t count)) dlsym(RTLD_NEXT, "read");
//调用原函数
return _read(fd, buf, count);
       然后将其编译成动态链接库文件:
    g++ -shared -rdynamic -o hook.so -fPIC hook.c -ldl
    接下来进行偷梁换柱工作,在程序执行前设置LD_REPLOAD环境变量:
    export LD_PRELOAD="./hook.so"
    最后验证下效果,写了个小程序,程序逐行读取一个日志文件:

#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
char buf[1024];
string message;
ifstream infile;
infile.open("test.txt");
if(infile.is_open())
{
while(infile.good() && !infile.eof())
{
memset(buf,0,1024);
infile.getline(buf,1204);
message = buf;
cout<<message<<endl;
}
infile.close();
}
}

     编译成可执行文件,g++ hooktest.cpp -o hooktest
     运行之:qatest@qa10:~/hejl$ ./hooktest
     发现,运行hooktest多次,有时shell没有打印任何内容,而有时能打印出文件内容。这说明hook函数生效了。其实不需要这么麻烦自己写程序来验证,只要设置了LD_REPLOAD环境变量后,用vi打开任意一个文件,就能发现有时成功有时会这样:
   

qatest@qa10:~/hejl$ vi test.txt
Vim: Error reading input, exiting...

Vim: Finished.

 这也间接的说明,hook函数对任何在当前环境下运行的应用都是起作用的,因为hook的是操作系统级别的调用。


  评论这张
 
阅读(441)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016