免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2191 | 回复: 3

[内存管理] 如何给内核的memcpy里加钩子? [复制链接]

论坛徽章:
0
发表于 2014-08-20 22:43 |显示全部楼层
linux 3.16-rc2   X86_64架构

下面是我的修改步骤,发现有些问题:

1. 将内核自带的汇编实现memcpy注释掉

linux-3.16-rc2\arch\x86\lib\memcpy_64.S

  1. ENTRY(__memcpy)
  2. ENTRY(memcpy)
  3. ...
  4.         CFI_ENDPROC
  5. ENDPROC(memcpy)
  6. ENDPROC(__memcpy)
复制代码
改为

  1. ENTRY(__memcpy)
  2. ENTRY(x86_memcpy)
  3. ...
  4.         CFI_ENDPROC
  5. ENDPROC(x86_memcpy)
  6. ENDPROC(__memcpy)
复制代码
2. 在内核通用memcpy实现函数中加钩子

linux-3.16-rc2\lib\string.c

  1. #ifndef __HAVE_ARCH_MEMCPY
  2. void *memcpy(void *dest, const void *src, size_t count)
  3. {
  4.         char *tmp = dest;
  5.         const char *s = src;

  6.         while (count--)
  7.                 *tmp++ = *s++;
  8.         return dest;
  9. }
  10. #endif
复制代码
改为

  1. //#ifndef __HAVE_ARCH_MEMCPY
  2. void *memcpy(void *dest, const void *src, size_t count)
  3. {
  4.         char *tmp = dest;
  5.         const char *s = src;
  6.         my_hook();
  7.         while (count--)
  8.                 *tmp++ = *s++;
  9.         return dest;
  10. }
  11. //#endif
复制代码
在mm目录新加一个文件,测试memcpy的回调是否生效:
linux-3.16-rc2\mm\memcpy_test.c

  1. #include        <linux/mm.h>
  2. #include        <linux/kallsyms.h>
  3. #include        <linux/module.h>
  4. int hook_value = -1;
  5. int test_begin = 0;
  6. void  my_test_begin(void)
  7. {
  8.         char src[128] = {0};
  9.         char dst[128] = {1};
  10.         test_begin = 1;
  11.         mb();
  12.         memcpy((char*)dst,(char*)src,50);
  13.         test_begin = 0;
  14.         mb();
  15.         printk("hook value:%d\n",hook_value);
  16. }

  17. void  my_hook(void)
  18. {
  19.         if(test_begin)
  20.                 hook_value=1;
  21. }
复制代码
打印发现hook_value仍然是-1,my_hook赋值没有生效,大家帮看看哪里有问题不?thx

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-08-20 23:19 |显示全部楼层
呵呵,这么晚还在辛苦工作~
你确认走到这几个接口中了么?加打印看看呢?

论坛徽章:
0
发表于 2014-08-20 23:33 |显示全部楼层
回复 2# humjb_1983

只要把if(test_begin)去掉,hook_value就能设置成1。
hook应该是走到了的。 关键是我加的这个memcpy_test.c 里的memcpy,为啥没有走到hook_value=1,这个实在想不通。
另外memcpy里不好加printk调试,因为后者里面好像就有memcpy,这样搞重入了不好整。

void  my_hook(void)
{        
        if(test_begin)  //判断去掉
                hook_value=1;
}
手工调用检测越界接口OK了, 就剩在memcpy里加越界检测接口了,这临门一脚出不来憋啊。

论坛徽章:
0
发表于 2014-08-21 18:31 |显示全部楼层
解决了。
gcc会根据memcpy的长度来决定替换memcpy的实现,在内核主Makefile里加一句
KBUILD_CFLAGS += -fno-builtin
就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP