Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 暂停linux内核函数_C_Linux_Linux Kernel - Fatal编程技术网

C 暂停linux内核函数

C 暂停linux内核函数,c,linux,linux-kernel,C,Linux,Linux Kernel,我使用Jprobe监视内核函数,最终目标是在某些情况下暂停函数。我得到了Jprobe没有问题,我有问题暂停功能 目前我尝试暂停pid,但失败了,因为进程确实暂停了,但内核函数没有暂停。它仍然完成了我不想要的工作 我最大的希望是劫持内核函数,这样我就可以用这个函数做任何我喜欢的事情。我找到了一些关于这方面的文章,但是大多数都已经过时了,内核在2.6版本之后发生了很大的变化。我的想法是,我应该找到函数的地址,并更改前几个字节以跳转到我的新函数。我找不到这个地址。有人知道怎么做吗?或者有没有其他更简单

我使用Jprobe监视内核函数,最终目标是在某些情况下暂停函数。我得到了Jprobe没有问题,我有问题暂停功能

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

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


编辑:我试图使用从System.map或/proc/kallsyms中找到的结果相同的地址,但出现了错误。在内核2.6之后这样做似乎不容易,有人知道怎么做吗?

如果目标只是暂停并检查内核函数,用户模式linux可能是合适的。诚然,这是一种较旧的机制,但是使用uml做一些简单的事情是有很好的文档记录的。以下是一些让您开始学习的链接:

此答案还讨论了使用uml以及一些备选方案(包括附加链接):

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\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 }