- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的目标是编写一个 LKM(Linux 内核模块)来拦截所有 TCP 数据包、查找 tcp_sock 结构并根据某些条件从 tcp_sock 结构(例如:tcpsock->snd_una)记录一些信息。
这就是我试图实现这一目标的方式:我在 ubunutu 上使用 netfilter 进行拦截(下面的代码)但是有没有办法访问 tcp_sock 结构(在代码中查找 NOTE)?
我对 netfilter 并不挑剔。请建议是否有任何其他编写 LKM 的方法来实现这一点。它必须是 LKM。
unsigned int ip_packets_hook_func(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct iphdr *ipp = (struct iphdr *)skb_network_header(skb);
struct tcphdr *tcp_hdr;
struct tcp_sock *tcpsock;
if (!skb) {
return NF_ACCEPT;
}
if (ipp->protocol == IPPROTO_TCP ) { // Incomming packet is TCP
tcp_hdr = (struct tcphdr *) ((__u32 *)ipp + ipp->ihl);
tcpsock = (struct tcp_sock *) skb->sk;
if(ntohs(tcp_hdr->dest) != INTERESTED_PORT) {
return NF_ACCEPT;
}
printk("TCP ports: source: %d, dest: %d \n", ntohs(tcp_hdr->source),
ntohs(tcp_hdr->dest));
if(tcp_hdr->syn || tcp_hdr->fin || tcp_hdr->rst) {
printk("Flag: %s %s %s\n", tcp_hdr->syn? "SYN" : "",
tcp_hdr->fin? "FIN" : "",
tcp_hdr->rst? "RST" : "");
return NF_ACCEPT;
}
// **NOTE**
// skb->sk is NULL at this point.
// Get tcp_sock for this connection.
} else {
printk("Its not TCP\n");
}
return NF_ACCEPT;
}
最佳答案
我能够通过查找 inet 哈希表(下面的代码片段)来实现它。我是这个例子中的服务器。确保在 3 次握手完成后查找。
const struct iphdr *iph;
const struct tcphdr *th;
struct sock *sk = NULL;
struct tcp_sock *tp;
.
.
.
.
sk = __inet_lookup_established(dev_net(skb->dev), &tcp_hashinfo,
iph->saddr, th->source,
iph->daddr, ntohs(th->dest),
skb->skb_iif);
// Sanity checks here.
tp = tcp_sk(sk);
关于sockets - LKM 从数据包中查找 tcp_sock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20862967/
我写了一个LKM(loadable kernel module),需要调用/linux/driver下的另一个内核驱动模块中的函数。我不知道如何将这些功能导入 LKM。由于/lib/modules/l
我知道内核使用 vmalloc() 加载可加载内核模块 (LKM) 假设整个 LKM 都驻留在堆中是否安全? 最佳答案 更准确地说,内核模块的内存是使用 vmalloc_exec() 分配的。 Is
我有一个简单的可加载内核模块,它通过提供闪烁周期、开/关功能等来控制 LED... 设备位于/sys/led ,并且运行正常。 我已经为命令行提供了一个输入参数,它接受 LED 连接到哪个 GPIO。
我的 LKM 劫持了 stdin/sshd 输入:https://pastebin.com/RChpbt9G # uname -a Linux kali 4.19.0-kali4-amd64 #1 S
所以我一直在尝试在运行 4.15.0-43-generic 并安装了 linux-headers-4.15.0-43 的 Ubuntu 18.04 上编译一个简单的“Hello world”LKM。
假设我在 linux-kernel 中插入了 Loadable-Kernel-Module 并且 Hook 了读、写、打开和关闭函数。所以现在我可以停止对任何文件的访问,但我想阻止文件被复制到设备外部
这个问题在这里已经有了答案: Implementing Linux System Call using LKM (1 个回答) 关闭 6 年前。 所以我看到了一堆关于添加系统调用的问题,但我找不到任
我制作了简单的 LKM(Linux 内核模块)以在用户级别与内核级别信息交互我的 MPI 应用程序(每个计算节点的多进程)。我需要在运行时从内核中提取一些数据到用户级应用程序。我的 MPI 应用程序使
我写了下面的代码: #include #include #include #include #include void **sys_call_table; int __init kaslr_
作为练习(安全研究),我正在尝试实现一个包装的系统调用。根据 getdents 文档 - 您必须实现自己的 linux_dirent 结构(https://linux.die.net/man/2/ge
我开始学习一个非常基本的“hello world”LKM,另外我已经向内核添加了功能并成功重新编译并且它可以工作。我现在喜欢做的是将一个变量添加到已编译的内核代码中,然后在加载和卸载模块时从我的 LK
我是内核新手,在使用内核模块的导出符号编译 Linux 内核时需要一些帮助。 我尝试了以下 - LKM 源代码中的 EXPORT_SYMBOL(func_name),LKM 编译并在其 Module.
我正在开发一个 Linux 内核模块 (LKM),它分析我笔记本电脑的电池参数并在每个给定时间间隔内写入内核日志文件 (/var/log/kern.log)。使用日志文件中的数据,我将绘制实时图表。
是否有可能在版本为 3.0.31- 的内核中使用为 3.0.8+ mod_unload ARMv5(我自制的内核)编译的可加载内核模块gd5a18e0 SMP 抢占 mod_unload ARMv7(
我在内核树之外使用 LKM,我想为我的模块使用一些编译选项,例如 MYLKM_CONFIG_{something}。我知道这可以使用 C 预处理 (#define//#ifdef//#endif) 来
我是内核开发技术的新手。我想知道一旦动态加载内核模块,是否有办法在内核和内核模块 (LKM) 之间建立通信。我想要做的是从内核的特定部分调用一个函数来发送一些数据,而内核模块正在等待它。如果模块还没有
我有一个生成数据的 Linux 内核模块,我想将该数据发送到用户空间应用程序。有哪些选择,它们有哪些优点/缺点? 比方说,数据可能是每秒几个 char[] 和几个 int[] 的 100 个结构。 此
我最近一直在研究这个问题,并查看了各种文章和 stackoverflow 帖子,但我似乎无法找到直接的答案。在创建内核模块时,我看到大多数代码如下所示: #include static int te
我的目标是编写一个 LKM(Linux 内核模块)来拦截所有 TCP 数据包、查找 tcp_sock 结构并根据某些条件从 tcp_sock 结构(例如:tcpsock->snd_una)记录一些信息
我正在从 Linux (3.x) 的系统调用表中覆盖 SYS_READ,但在卸载模块本身时遇到了一些麻烦。我首先加载找到系统调用表的模块,然后启用 RW,用我自己的 SYS_READ 函数覆盖 SYS
我是一名优秀的程序员,十分优秀!