`register_kprobe`(kprobes)에 의해 보고된 기호 주소가 /proc/kallsyms의 기호 주소와 일치하지 않는 이유는 무엇입니까?

`register_kprobe`(kprobes)에 의해 보고된 기호 주소가 /proc/kallsyms의 기호 주소와 일치하지 않는 이유는 무엇입니까?

(kprobes)를 사용하여 Linux 커널 기호의 주소를 찾고 싶습니다 kprobes_register.

kprobe를 심은 후 flush_tlb_all다음 명령을 사용하여 주소를 찾았습니다 sudo dmesg.

[1055.285848] Planted kprobe at 000000005b0a34fa

대신 /proc/kallsyms동일한 기호의 다른 주소를 신고하세요.

ffffffff8ea68a80 T flush_tlb_all

두 개의 다른 주소가 표시되는 이유는 무엇입니까 flush_tlb_all?

http://users.telenet.be/pynckels/2020-2-Linux-kernel-unexported-kallsyms-functions.pdf

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>

#define MAX_SYMBOL_LEN  64
static char symbol[MAX_SYMBOL_LEN] = "flush_tlb_all";
module_param_string(symbol, symbol, sizeof(symbol), 0644);

/* For each probe you need to allocate a kprobe structure */
static struct kprobe kp = {
   .symbol_name = symbol,
};

static int __init kprobe_init(void)
{
   int ret;

   ret = register_kprobe(&kp);
   if (ret < 0) {
      pr_err("register_kprobe failed, returned %d\n", ret);
      return ret;
   }
   pr_info("Planted kprobe at %p\n", kp.addr);
   return 0;
}

static void __exit kprobe_exit(void)
{
   unregister_kprobe(&kp);
   pr_info("kprobe at %p unregistered\n", kp.addr);
}

module_init(kprobe_init);
module_exit(kprobe_exit);
MODULE_LICENSE("GPL");

답변1

모듈은 프로브 포인트의 주소를 보고하지 않지만 해당 해시는 보고합니다.%p출력 해시 주소

커널 메모리 레이아웃 정보 유출 방지

실제 주소를 보려면%pK또는%px.

관련 정보