我尝试创建一个用于加密网络数据包的模块,但是当尝试从 sk_buff 获取数据并在Hexa中打印时,无法获得正确的数据包。 我使用这种方法在Hexa中打印数据:
void pkt_hex_dump(struct sk_buff *skb)
{
size_t len;
int rowsize = 16;
int i,l,linelen,remaining;
int li = 0;
uint8_t *data,ch;
printk("Packet hex dump:\n");
data = (uint8_t *) skb_mac_header(skb);
if (skb_is_nonlinear(skb)) {
len = skb->data_len;
} else {
len = skb->len;
}
remaining = len;
for (i = 0; i < len; i += rowsize) {
printk("%06d\t",li);
linelen = min(remaining,rowsize);
remaining -= rowsize;
for (l = 0; l < linelen; l++) {
ch = data[l];
//data[l] = '1';
printk(KERN_CONT "%02X ",(uint32_t) ch);
}
data += linelen;
li += 10;
printk(KERN_CONT "\n");
}
}
我用这个sample创建了一个聊天应用程序。
当我从客户端向服务器发送output
消息时,hello world
是:
[ 3981.963124] Packet hex dump:
[ 3981.963125] 000000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00
[ 3981.963128] 000010 00 34 6A 1F 40 00 40 06 D1 A2 7F 00 01 01 7F 00
[ 3981.963130] 000020 00 01 07 E4 BD 36 A2 52 E9 62 6D 40 3D FE 80 10
[ 3981.963133] 000030 02 00 FF 28
我尝试遵循此solution,但无法获得任何输出。
我的挂钩函数
static unsigned int hfunc( void *priv,struct sk_buff *skb,const struct nf_hook_state *state){
struct iphdr *iph; /* IPv4 header */
struct tcphdr *tcph; /* TCP header */
uint16_t sport;
uint16_t dport;
struct ethhdr *ether = eth_hdr(skb);
iph = ip_hdr(skb); /* get IP header */
tcph = tcp_hdr(skb); /* get TCP header */
sport = ntohs(tcph->source);
dport = ntohs(tcph->dest);
/* Watch only port of interest */
if (dport == PTCP_WATCH_PORT || sport == PTCP_WATCH_PORT){
printk(KERN_INFO "UDP packet is received: {'sport': %d; 'dport': %d}\n",sport,dport);
printk("Source: %x:%x:%x:%x:%x:%x\n",ether->h_source[0],ether->h_source[1],ether->h_source[2],ether->h_source[3],ether->h_source[4],ether->h_source[5]);
printk("Destination: %x:%x:%x:%x:%x:%x\n",ether->h_dest[0],ether->h_dest[1],ether->h_dest[2],ether->h_dest[3],ether->h_dest[4],ether->h_dest[5]);
printk("Protocol: %d\n",ether->h_proto);
pkt_hex_dump(skb);
}
return NF_accEPT;
}