Linux 커널 프로그래밍: 첫 번째 Linux 커널 코드
모듈을 추가하면 TCP 프로토콜의 경우 소스 포트가 81이면 RST 패키지로 변경됩니다.
코드
1.1 파일:testtcpmain.c
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/inetdevice.h>
#include <linux/string.h>
#include <net/route.h>
#include <linux/inet.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <net/checksum.h>
#include <net/tcp.h>
#include <net/ip.h>
unsigned int hook_mark1(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
struct iphdr *iph;
struct tcphdr *tcph;
struct sk_buff *sk = skb;
u16 src_port,dst_port;
u16 datalen;
iph = ip_hdr(sk);
tcph = (struct udphdr*)((u_int8_t*)iph + (iph->ihl << 2));
src_port = ntohs(tcph->source);
dst_port = ntohs(tcph->dest);
if(src_port == 81 || dst_port == 81)
printk("<0>""src_port:%d, dst_port:%d, protocol:%d, rst:%d
",src_port, dst_port, iph->protocol, tcph->rst);
if (iph->protocol == 6 && src_port == 81)
{
printk("<0>""---000---src_port:%d, dst_port:%d, protocol:%d, rst:%d
",src_port, dst_port, iph->protocol, tcph->rst);
tcph->rst = 1;
iph->check = 0;
iph->check = ip_fast_csum((unsigned char*)iph, iph->ihl);
datalen = ntohs(iph->tot_len) - (iph->ihl << 2);
tcph->check = 0;
tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, datalen,
iph->protocol, csum_partial((unsigned char*)tcph, datalen, 0));
skb->ip_summed = CHECKSUM_NONE;
return NF_ACCEPT;
}
return NF_ACCEPT;
}
static struct nf_hook_ops nfho_marker1;
static int init_marker(void)
{
nfho_marker1.hook=hook_mark1;
nfho_marker1.hooknum=NF_INET_LOCAL_OUT;
nfho_marker1.pf=PF_INET;
nfho_marker1.priority=NF_IP_PRI_LAST;
nf_register_hook(&nfho_marker1);
return 0;
}
static void exit_marker(void)
{
nf_unregister_hook(&nfho_marker1);
}
module_init(init_marker);
module_exit(exit_marker);
1.2 파일Makefile:
obj-m := testtcp.o testtcp-objs := testtcp_main.o KERNELDIR =/lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C/lib/modules/$(shell uname -r)/build M=$(PWD) clean install: cp inerdns.ko ../
참고 사항:
1. 첫 줄의testtcp.o와 두 번째 줄의testtcpmain.o 중복할 수 없습니다.
2.첫 줄의testtcp.o 두 번째 줄의testtcp-objs 접두사는 같아야 합니다.
3. "default:", "clean:", "install:"다음 줄의 내용은 줄 앞에tab키가 있어야 합니다.
2. 모듈을 컴파일하고 핵에 추가
2.1 컴파일
make를 실행하면 코드를 컴파일하고 생산 모듈testtcp.ko.
2.2 커널에 모듈 추가
lsmodlinux 내장 모듈을 보십시오.
insmod testtcp.ko장testtcp.ko 모듈을 핵에 추가합니다.
(rmmod testtcp는 커널에서testtcp.ko 모듈을 삭제합니다.)
3. 모듈 기능 테스트
3.1 테스트 코드
다음 기사 코드를 참조하여 수정할 수 있습니다.http://blog.csdn.net/guowenyan001/article/details/11742621
3.2 linux에서 URL 액세스
curl 192.168.9.200:81
3.3 클러치 보기
관련 패키지가 RST 패키지로 수정되었는지 tcpdump 캡처로 확인하십시오.
주의사항
내부 핵 모듈 코드는 시스템 붕괴를 초래할 수 있으므로 다시 시작해야 하기 때문에 테스트기에서 내부 핵 코드를 테스트하는 것이 가장 좋다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.