我正在写一个Linux模块(内核编程),我得到了:
"无法处理内核NULL指针取消引用"
这是什么意思?
我正在修改Linux内核以向Linux虚拟服务器(LVS)添加一些功能.
我开发了一个模块(我称之为net/netfilter/ipvs/ip_vs_utils.c),其中包含一些在负载平衡时使用的函数.这里的所有功能都是使用导出的EXPORT_SYMBOL().
此模块在逻辑上不会一直加载.我的目的是允许用户决定是否要使用此附加功能(加载或卸载模块).
我的问题是如何从现有(当然还有修改过的)模块(net/netfilter/ipvs/ip_vs_core.c)中选择性地调用这些函数(取决于模块是否正在运行).像这样的东西:
if(ip_vs_utils_IsLoaded)
{
function1(arg1, arg2, arg3); // being function1 defined on ip_vs_utils.c
}
Run Code Online (Sandbox Code Playgroud) 我试图在内核空间的数据包上附加一些数据.我有一个echo客户端和服务器.我输入命令行,如:./client"message",服务器只是回复它.服务器使用./server运行.
现在,客户端和服务器位于两台不同的计算机上(可能是VM).我正在编写一个在客户机上运行的内核模块.它的工作是在数据包离开机器时在"消息"之后附加"12345".我将在下面介绍代码.
/*
* This is ibss_obsf_cat.c
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/udp.h>
#include <linux/ip.h>
#undef __KERNEL__
#include <linux/netfilter_ipv4.h>
#define __KERNEL__
/*
* Function prototypes ...
*/
static unsigned int cat_obsf_begin (unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *));
static void hex_dump (char str[], int len)
{
}
/*
* struct nf_hook_ops instance initialization
*/
static struct nf_hook_ops cat_obsf_ops __read_mostly = …Run Code Online (Sandbox Code Playgroud) 我是编程Linux内核模块的新手,许多关于该主题的入门指南包含很少有关如何构建内核模块的信息,该内核模块将在Linux的许多版本和CPU平台上运行.我见过的大多数指南都只是说"Linux不能确保版本之间的任何 ABI/API兼容性".但是,其他操作系统确实为主要版本提供了这些保证,并且指南主要针对2.7(现在有点旧).
我想知道现在是否有任何类型的ABI/API兼容性,或者是否有任何标准方法来处理版本控制,而不是将我的代码的内核相关位隔离到具有大量预处理器指令的文件中.(另外,在第二种情况下我应该使用任何标准的预处理器符号吗?)
我使用getnstimeofday的console_unlock功能,它被初始化过程中很早就叫.如此早,即使计时也不会被初始化以便使用getnstimeofday.
有没有办法确定开始使用的精确时刻getnstimeofday.我的意思是,是否有任何全局变量或任何宏来检查计时是否已初始化,以便我可以开始使用getnstimeofday.
我目前正在为学术目的修补Ext4(只有linux/fs/ext4/*,如file.c,ioctl.c,ext4.h).我正在研究QEMU虚拟机,为了加快整个过程,我选择Ext4作为内核模块进行编译.在测试新的更改时会出现问题,因为即使我运行make modules ARCH=x86 && make modules_install ARCH=x86并重新启动计算机(/是Ext4),除非我重新编译整个内核,否则它们不可见.这有点奇怪,因为我有各种迹象表明Ext4已被编译为模块:
它被配置为:
$ grep EXT4 .config
CONFIG_EXT4_FS=m
Run Code Online (Sandbox Code Playgroud)它确实编译为一个模块:
$ make modules ARCH=x86
(...)
CC [M] fs/ext4/ioctl.o
LD [M] fs/ext4/ext4.o
Building modules, stage 2.
MODPOST 3 modules
LD [M] fs/ext4/ext4.ko
Run Code Online (Sandbox Code Playgroud)后$ make modules_install ARCH=x86在/lib/modules/3.13.3/kernel/fs/文件有适当的时间戳.
最后:
$ lsmod
Module Size Used by
ext4 340817 1
(...)
Run Code Online (Sandbox Code Playgroud)出于某种原因,我必须这样做$ make all ARCH=x86才能看到我的更改出现在运行时中.我错过了什么?谢谢!
我是内核编码的新手,目前正在使用ELF文件,出于安全性目的已对其进行了一些修改,为此,我需要查看其中的一些自定义节头,并从中提取唯一的代码加密密钥以用于安全性。 CPU解密修改后的ELF的内容。
目前,以上逻辑已在内核源代码树load_elf_binary的fs/binfmt_elf.c文件中的函数内实现,但是我只需要大约250行代码更改即可重新编译整个内核,因此我希望通过实现来临时实现此功能它作为可加载的内核模块(LKM),以便每次加载ELF时都会检查其是否为修改后的ELF,如果是,则从相应的部分中提取密钥。
编辑:总而言之,我正在寻找一个可加载的内核模块,以通读ELF的各个部分,并获取包含加密密钥和相关元数据的自定义部分的内容,并在CPU寄存器中设置这些值。
我想签一些内核模块(VirtualBox的)的解释在这里。
如此处所述,我创建了新密钥:
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
Run Code Online (Sandbox Code Playgroud)
我签署了所有模块:
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetadp)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxnetflt)
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxpci)
Run Code Online (Sandbox Code Playgroud)
但是,在导入密钥时,失败了
$ sudo mokutil --import MOK.der
input password:
input password again:
Failed to enroll new keys
Run Code Online (Sandbox Code Playgroud)
是什么原因造成的?
编辑:实际上,我只是注意到我真的不能对mokutil做太多事情。例如:
$ sudo mokutil …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个内核模块,它将数据包有效负载修改为学习体验.我已完成数据包修改,但现在我想在原始后发送这个新修改的数据包(我不想丢弃原始数据包).我似乎无法找到发送SKB进行传输的内核函数.我已经尝试了,dev_queue_xmit(nskb)但这导致内核恐慌,我也尝试过,skb->next = nskb但没有做任何事情.我是否必须实施SKB列表处理?我不确定如何做到这一点,因为这篇文章似乎已经过时了.
编辑:
所以我在调用dev_queue_xmit(nskb)时能够修复内核恐慌,我不小心做了dev_queue_xmit(skb),它会删除skb并导致网络过滤器出现恐慌.问题是现在一切正常,但我没有看到重复的数据包被发送,没有第二个数据包的踪迹被发送.机器上的TCPDump看不到任何东西,目标上的TPCDump也看不到任何东西,以下是我的代码.
unsigned int in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
struct sk_buff *nskb = skb_copy(skb, GFP_KERNEL);
/* Various other variables not relevant to the problem */
__u32 saddr, daddr;
saddr = ntohl(iph->saddr);
if (saddr == ipToInt(10,0,2,12) || saddr == ipToInt(10,0,2,13)) {
/*For loop that saves the payload contents into a variable */
/* Here is where the problem is,
I have this if statement to prevent a …Run Code Online (Sandbox Code Playgroud) 我想在内核模块中使用do_mmap()。根据这个问题,这应该是可能的。
这是一个最小的无效示例:
hp_km.c:
#include <linux/module.h>
#include <linux/mm.h>
MODULE_LICENSE("GPL");
static int __init hp_km_init(void) {
do_mmap(0, 0, 0, 0, 0, 0, 0, 0, 0);
return 0;
}
static void __exit hp_km_exit(void) {
}
module_init(hp_km_init);
module_exit(hp_km_exit);
Run Code Online (Sandbox Code Playgroud)
Makefile:
obj-m += hp_km.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
运行make结果WARNING: "do_mmap" [...] undefined!
我需要进行哪些更改hp_km.c或Makefile使其生效?