暂停linux内核函数

时间:2013-12-18 01:55:15

标签: c linux linux-kernel

我正在使用Jprobe监视内核函数,最终目标是在某些条件下暂停该函数。我没有问题Jprobe,我在暂停功能时遇到问题。

目前我已经尝试暂停pid,因为进程暂停但内核函数没有暂停,因此失败了。它仍然完成了我想要的工作。

我最大的希望是劫持内核函数,这样我就能用函数做任何我喜欢的事情。我发现了一些关于这个的文章,但是大多数都已经过时了,内核在2.6之后发生了很大变化。我知道我应该找到函数的地址并更改前几个字节以跳转到我的新函数。我在找到这个地址时遇到了问题。有人知道怎么做吗?或者还有另一种更简单的方法来暂停该功能吗?

编辑:我试图使用我从System.map或/ proc / kallsyms找到的地址,结果是相同的,但错误出现了。似乎在内核2.6之后这样做并不容易,任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:0)

如果目标是简单地暂停和检查内核函数,那么用户模式linux可能是合适的。它无疑是一种较旧的机制,但使用uml做这样简单的事情已有详细记载。这里有几个链接可以帮助您入门:

这个答案还讨论了使用uml以及一些替代方法(包括其他链接):

答案 1 :(得分:0)

I am having problem finding this address. Anyone know how to do this?

来自 kprobes 实施,

static kprobe_opcode_t __kprobes *kprobe_addr(struct kprobe *p)
1355 {
1356         kprobe_opcode_t *addr = p->addr;
1357 
1358         if ((p->symbol_name && p->addr) ||
1359             (!p->symbol_name && !p->addr))
1360                 goto invalid;
1361 
1362         if (p->symbol_name) {
1363                 kprobe_lookup_name(p->symbol_name, addr);
1364                 if (!addr)
1365                         return ERR_PTR(-ENOENT);
1366         }
1367 
1368         addr = (kprobe_opcode_t *)(((char *)addr) + p->offset);
1369         if (addr)
1370                 return addr;
1371 
1372 invalid:
1373         return ERR_PTR(-EINVAL);
1374 }

这肯定会对你有所帮助。

通常p->symbol_name将与内核符号一起传递。例如,p->symbol_name = "kmalloc"

此函数kprobe_addr()将给出相应的地址。

http://lxr.free-electrons.com/source/kernel/kprobes.c?a=arm#L1354