我正在使用Jprobe监视内核函数,最终目标是在某些条件下暂停该函数。我没有问题Jprobe,我在暂停功能时遇到问题。
目前我已经尝试暂停pid,因为进程暂停但内核函数没有暂停,因此失败了。它仍然完成了我想要的工作。
我最大的希望是劫持内核函数,这样我就能用函数做任何我喜欢的事情。我发现了一些关于这个的文章,但是大多数都已经过时了,内核在2.6之后发生了很大变化。我知道我应该找到函数的地址并更改前几个字节以跳转到我的新函数。我在找到这个地址时遇到了问题。有人知道怎么做吗?或者还有另一种更简单的方法来暂停该功能吗?
编辑:我试图使用我从System.map或/ proc / kallsyms找到的地址,结果是相同的,但错误出现了。似乎在内核2.6之后这样做并不容易,任何人都知道如何做到这一点?
答案 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