如何访问内核模块中的任何内核符号?

如何访问内核模块中的任何内核符号?,第1张

概述我想在我的内核模块中使用函数getname.它不会导出.由于我现在遇到这个问题,我想知道如何访问和使用任何未导出的内核符号.我认为使用一个步骤所需的步骤将根据符号的不同而有所不同,所以我想看看如何对类型(例如,结构),变量,指针表(如系统)进行 *** 作调用表)和一个函数.如何在以下任何一种情况下完成: >当我知道System.map或/ proc / kallsyms中符号的地址时. >当我知道符号的 我想在我的内核模块中使用函数getname.它不会导出.由于我现在遇到这个问题,我想知道如何访问和使用任何未导出的内核符号.我认为使用一个步骤所需的步骤将根据符号的不同而有所不同,所以我想看看如何对类型(例如,结构),变量,指针表(如系统)进行 *** 作调用表)和一个函数.如何在以下任何一种情况下完成:

>当我知道System.map或/ proc / kallsyms中符号的地址时.
>当我知道符号的名称并想要在检索它时使用kallsyms_lookup_name.

我目前知道如何劫持系统调用,这需要声明类似的东西

asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>);

是否会使用这样的东西?在https://stackoverflow.com/a/32968387/1953537回答另一个问题,海报提供的例子是

#include <linux/kallsyms.h>static voID (*machine_power_off_p)(voID);machine_power_off = (voID*) kallsyms_lookup_name("machine_power_off");

但是如果符号返回指针怎么办?我会在(* machine_power_off_p)的左边放一个星号吗?

解决方法 #include< linux / fs.h>声明extern struct filename * getname(const char __user *);.指向此函数的指针的类型为struct filename *(*)(const char __user *).如果声明该类型的变量,则变量名称位于* in(*)之后.因此,您可以声明该类型的变量,并将kallsyms_lookup_name(“getname”)的返回值分配给它,如下所示:

static struct filename *(*getname_p)(const char __user *);getname_p = (struct filename *(*)(const char __user *))            kallsyms_lookup_name("getname");

对于您想要使用数字地址的其他情况,只需将kallsyms_lookup_name函数调用替换为实际数字(kallsyms_lookup_name无论如何都将符号值作为数字返回).

总结

以上是内存溢出为你收集整理的如何访问内核模块中的任何内核符号?全部内容,希望文章能够帮你解决如何访问内核模块中的任何内核符号?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1228431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存