【问题标题】:How to add a hook in memcpy function of linux kernel?如何在 linux 内核的 memcpy 函数中添加钩子?
【发布时间】:2014-08-20 16:19:34
【问题描述】:

以下是我的步骤,但没有按预期工作。

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

变了

ENTRY(__memcpy)
ENTRY(memcpy)
...
CFI_ENDPROC
ENDPROC(memcpy)
ENDPROC(__memcpy)

到:

ENTRY(__memcpy)
ENTRY(x86_memcpy)
...
CFI_ENDPROC
ENDPROC(x86_memcpy)
ENDPROC(__memcpy)

linux-3.16-rc2\lib\string.c:

改变了

#ifndef __HAVE_ARCH_MEMCPY
void *memcpy(void *dest, const void *src, size_t count)
{
    char *tmp = dest;
    const char *s = src;

    while (count--)
        *tmp++ = *s++;
    return dest;
}
#endif

到:

//#ifndef __HAVE_ARCH_MEMCPY
void *memcpy(void *dest, const void *src, size_t count)
{
    char *tmp = dest;
    const char *s = src;
    my_hook();
    while (count--)
            *tmp++ = *s++;
    return dest;
}
//#endif

删除arch/x86/kernel/x8664_ksyms_64.c中的EXPORT_SYMBOL(memcpy)

在linux-3.16-rc2\mm\memcpy_test.c中添加测试代码:

#include <linux/mm.h>
#include <linux/kallsyms.h>
#include <linux/module.h>
int hook_value = -1;
int test_begin = 0;
void  my_test_begin(void)
{
    char src[128] = {0};
    char dst[128] = {1};
    test_begin = 1;
    mb();
    memcpy((char*)dst,(char*)src,50);
    test_begin = 0;
    mb();
    printk("hook value:%d\n",hook_value);
}

void  my_hook(void)
{
    if(test_begin)
            hook_value=1;
}

调用my_test_begin后,发现hook_value一直保持-1,看来my_test_begin中的memcpy一直没有达到hook_value=1 谁能帮忙?谢谢!

【问题讨论】:

  • 有时,编译器会将memcpy优化为__builtin_memcpy
  • 谢谢巴西尔!在 Makefile 中添加 KBUILD_CFLAGS += -fno-builtin 后,一切顺利。
  • @user3368448:您可能希望将此添加为您自己问题的答案。你甚至可以接受这个答案来告诉 SO 你的问题已经解决了。
  • 对不起,如何接受这个答案作为解决方案?

标签: c linux kernel hook memcpy


【解决方案1】:

感谢@Basile Starynkevitch 我解决了问题,是的,'有时,编译器正在将 memcpy 优化为 __builtin_memcpy'

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 2021-05-20
    • 2015-02-26
    • 1970-01-01
    • 2016-11-24
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多