아 진짜 힘드네요.. 커널 함수 한번 써보려고 하는데...
글쓴이: minimax / 작성시간: 토, 2004/05/08 - 2:49오후
커널에 netfilter.c에 있는 nf_dump_skb()함수와 nf_debug_ip_finish_output2() 를 한번 써보려고 합니다.
디버깅을 위해서요... 커널 버전은 2.4.20입니다.
여기저기 뒤져서.
netsyms.c에
#ifdef CONFIG_NETFILTER_DEBUG #include <net/ip.h> #include <net/route.h> #include <net/tcp.h> #include <linux/netfilter_ipv4.h> EXPORT_SIMBOL(nf_dump_skb) EXPORT_SIMBOL(nf_debug_ip_finish_output2) #endif
이렇게 등록하고.
컴파일 옵션에서 CONFIG_NETFILTER_DEBUG=y
시키고
커널 컴파일해서 ksyms를 확인 해봤더니 보이더군요.
그후 이 코드에 적용시켜 보았습니다.
#include <linux/kernel.h> #include <linux/module.h> #include <linux/netfilter.h> #include <linux/ip.h> #include <linux/icmp.h> #include <linux/netdevice.h> #include <linux/netfilter_ipv4.h> static struct nf_hook_ops netfilter_ops_in; /* NF_IP_PRE_ROUTING */ static struct nf_hook_ops netfilter_ops_out; /* NF_IP_POST_ROUTING */ /* Function prototype in <linux/netfilter> */ unsigned int main_out_hook(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) { struct sk_buff *sb; struct iphdr *ip; struct icmphdr *icmp; sb = *skb; icmp = (struct icmphdr*) (sb->data+(sb->nh.iph->ihl*4)); if(!sb) return NF_DROP; // 이 부분입니다. nf_dump_skb(PF_INET,sb); return NF_ACCEPT; } unsigned int main_in_hook(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) { struct sk_buff *sb; struct icmphdr *icmp; struct iphdr *ip; sb = *skb; icmp = (struct icmphdr*) (sb->data+(sb->nh.iph->ihl*4)); if(!sb) return NF_DROP; // 이 부분입니다. nf_dump_skb(PF_INET,sb); return NF_ACCEPT; } int init_module() { netfilter_ops_in.hook = main_in_hook; netfilter_ops_in.pf = PF_INET; netfilter_ops_in.hooknum = NF_IP_LOCAL_IN; netfilter_ops_in.priority = NF_IP_PRI_FIRST; netfilter_ops_out.hook = main_out_hook; netfilter_ops_out.pf = PF_INET; netfilter_ops_out.hooknum = NF_IP_POST_ROUTING; netfilter_ops_out.priority = NF_IP_PRI_FIRST; nf_register_hook(&netfilter_ops_in); /* register NF_IP_PRE_ROUTING hook */ nf_register_hook(&netfilter_ops_out); /* register NF_IP_POST_ROUTING hook */ return 0; } void cleanup_module() { nf_unregister_hook(&netfilter_ops_in); /*unregister NF_IP_PRE_ROUTING hook*/ nf_unregister_hook(&netfilter_ops_out); /*unregister NF_IP_POST_ROUTING hook*/ }
오류 없이 컴파일 하고, 모듈을 올리면
얄짤 없이 unresolved symbol 이 나타납니다.
도대체 뭘 더 해야만 하나요?
아... 넘 어렵고 힘들고 해서.. 참...
잘 해나가시는 분들 정말 존경스럽습니다.
부디 답변 부탁드려요.
질문을 도배를 하는 거 같아 정말 또 죄송스럽습니다.
Forums:
자체 해결 했어요.
익스포트를 잘못했더군요.
printk 함수 참조해서 했더니.. ㅋ
되네요.
읽어주신 분들께 감사입니다.
그럴 땐 바다를 생각해
바다...
봉우리란 그저 넘어가는 고갯마루일 뿐이라구...
댓글 달기