C 暂停linux内核函数
我使用Jprobe监视内核函数,最终目标是在某些情况下暂停函数。我得到了Jprobe没有问题,我有问题暂停功能 目前我尝试暂停pid,但失败了,因为进程确实暂停了,但内核函数没有暂停。它仍然完成了我不想要的工作 我最大的希望是劫持内核函数,这样我就可以用这个函数做任何我喜欢的事情。我找到了一些关于这方面的文章,但是大多数都已经过时了,内核在2.6版本之后发生了很大的变化。我的想法是,我应该找到函数的地址,并更改前几个字节以跳转到我的新函数。我找不到这个地址。有人知道怎么做吗?或者有没有其他更简单的暂停功能的方法C 暂停linux内核函数,c,linux,linux-kernel,C,Linux,Linux Kernel,我使用Jprobe监视内核函数,最终目标是在某些情况下暂停函数。我得到了Jprobe没有问题,我有问题暂停功能 目前我尝试暂停pid,但失败了,因为进程确实暂停了,但内核函数没有暂停。它仍然完成了我不想要的工作 我最大的希望是劫持内核函数,这样我就可以用这个函数做任何我喜欢的事情。我找到了一些关于这方面的文章,但是大多数都已经过时了,内核在2.6版本之后发生了很大的变化。我的想法是,我应该找到函数的地址,并更改前几个字节以跳转到我的新函数。我找不到这个地址。有人知道怎么做吗?或者有没有其他更简单
编辑:我试图使用从System.map或/proc/kallsyms中找到的结果相同的地址,但出现了错误。在内核2.6之后这样做似乎不容易,有人知道怎么做吗?如果目标只是暂停并检查内核函数,用户模式linux可能是合适的。诚然,这是一种较旧的机制,但是使用uml做一些简单的事情是有很好的文档记录的。以下是一些让您开始学习的链接:
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\u name
将与内核符号一起传递。例如,p->symbol\u name=“kmalloc”
此函数kprobe_addr()将给出相应的地址
为什么不使用System.map???System.map和/proc/kallsyms是一回事吗?抱歉,我是内核新手。我强烈建议通过虚拟化设置或硬件支持的远程调试(如JTag)来实现这一点。我希望通过普通linux实现这一目标。“这里有一些UML的用途:虚拟服务器的托管、内核开发、新内核和发行版的试验、教育、沙箱。”
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 }