ARMアーキテクチャkprobe応用及び実装分析(1.0簡単例)


ネットワークはkrpobeの実現メカニズムと拡張に対して特に詳細ではない.
仕事の需要と個人の趣味のため、ちょうどこのモジュールをよく勉強して実際に応用する機会があります
全体の応用拡張と当時の分析状況を詳しく記録し、興味のある人に少し助けてほしい.
最初は具体的な栗をあげます.
参考:kernel/samplesの下には多くの例があります
/* For each probe you need to allocate a kprobe structure */
static struct kprobe kp = {
	//.symbol_name	= "do_fork",
        .symbol_name	= "testAddadd5",
};

この関数は、モニタリングのポイントに実行されると呼び出されます.
static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
        printk(" kprobes name is %s pt_regs size is %d 
",p->symbol_name,sizeof(regs->uregs)); return 0; }

初期には、kprobeを登録し、関数名やメモリの絶対アドレス(system.map)を入力できます.
static int __init kprobe_init(void)
{
	int ret;
	kp.pre_handler = handler_pre;
        ret = register_kprobe(&kp);
        printk(KERN_INFO " Planted kprobe at %p
", kp.addr); if (ret < 0) { printk(KERN_INFO " register_kprobe failed, returned %d
", ret); return ret; } return 0; }

kprobeプローブポイントのログアウト
static void __exit kprobe_exit(void)
{
	unregister_kprobe(&kp);
	printk(KERN_INFO " kprobe at %p unregistered
", kp.addr); } module_init(kprobe_init) module_exit(kprobe_exit) MODULE_LICENSE("GPL");

 
system.map//今はdo_だけが気になるfork testAddadd 5の2つの関数は、メモリのアドレスが以下の通りです.c 0052368 T testAddadd 5 c 00523 c 0 T do_fork
static struct kprobe kp = {         //.symbol_name = "do_fork",         .symbol_name = "testAddadd5", }; register_kprobe(&kp) printk(KERN_INFO "Planted kprobe at %p", kp.addr); insmod<6>[9749.442971](0)[52251:insmod]Planted kprobe at c 0052368は、ここで印刷するアドレスとシステムを発見する.mapは一致している.