簡體   English   中英

如何在linux內核的memcpy函數中添加一個鈎子?

[英]How to add a hook in memcpy function of linux kernel?

以下是我的步驟,但它沒有按預期工作。

Linux的3.16 RC2 \\弓\\ 86 \\ 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,任何人都可以幫忙嗎? 謝謝!

感謝@Basile Starynkevitch我解決了這個問題,是的,'有時候,編譯器正在優化memcpy到__builtin_memcpy'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM