Цель: - Написание модуля ядра, когда он вставлен, выполняет следующие действия.
1. Если пользователь хочет открыть веб-сайт с именем «abcde.in» в любом браузере, он должен получить веб-страницу «google.co.in» вместо веб-страницы «abcde.in».
Обычно при доступе к google.in я получаю: -
Наблюдение..(в заголовке http)
302 Перемещено
Документ перемещен
:-) затем я отправляю подтверждение и получаю домашнюю страницу Google:-
С модификацией: -
Шаги, которые я предпринял
а. отредактировал /etc/hosts
(google.in IP ) abcde.in
Так что он получает IP-адрес "google.in" для "abcde.in"
b.Далее вставьте следующий фрагмент модуля в реализацию nf_hook POST_ROUTING.
Наблюдение.. я могу правильно изменить, и wireshark показывает, что в ответ я могу получить 302 Moved, но я отправляю повторные передачи Tcp GET / HTTP/1.1. опять и опять.
Я чувствую, что мне не хватает подтверждения, которое мне нужно отправить, как в исходном случае. почему я не могу отправить подтверждение вместо этого, почему я повторно передаю tcp-пакеты на «GET / HTTP/1.1»
if(skb){
liph=(struct iphdr *)skb_network_header(skb);
if(liph->protocol == 6) {
ltcph = (struct tcphdr *)skb_transport_header(skb);
data=skb->data+(liph->ihl*4) + (ltcph->doff*4);
datalen=skb->len - ((liph->ihl*4)+(ltcph->doff*4));
replace_n=strstr(data,"abcde.in");
if(replace_n) {
temp = kmalloc(512 * sizeof(char), GFP_KERNEL);
memcpy(temp, data, datalen);
replace_n=strstr(temp,"abcde.in");
replace_size=strlen("google.in");
site_diff=replace_size - strlen("abcde.in");
memmove(replace_n+strlen("abcde.in")+site_diff,replace_n+strlen("abcde.in"),strlen(replace_n)-strlen("abcde.in"));
memcpy(replace_n,"google.in",strlen("google.in"));
skb_put(skb,site_diff);
memcpy(data,temp,datalen+site_diff);
liph->tot_len=htons(datalen+site_diff+20+(ltcph->doff*4)); /*modifing necessary fields*/
liph->check=0;
liph->check=ip_fast_csum((unsigned char *)liph,liph->ihl);
int ipl=liph->ihl * 4;
int ihl=ntohs(liph->tot_len);
ltcph->check = 0;
skb->csum = csum_partial(ltcph, ihl - ipl, 0);
ltcph->check = tcp_v4_check(ihl - ipl,liph->saddr, liph->daddr, skb->csum);
skb->ip_summed = CHECKSUM_NONE;