Показать сообщение отдельно

  #4  
Старый 25.11.2019, 13:39
vikaig
Познающий
Регистрация: 03.07.2019
Сообщений: 50
Провел на форуме:
14443

Репутация: 0
По умолчанию

Цитата:
Сообщение от Seoul  

Вопрос простой. Можно ли до сих пор ставить ложный айпи в заголовках удп пакетов? Пропустит ли их провайдер?
Мой провайдер - билайн
Если кто-нибудь позволит с включенным wireshark попробовать это провернуть, то будет вообще замечательно
Лучше называть это не фальсификацией, а IP-спуфингом или подменой IP-адреса, не когда не слышал чтоб это называли фальсификацией.

На счет провайдера твоего не знаю, если нет NAT, то вполне вероятно, а с NAT - нет(точнее да, он скорее пропустит, но со своим IP, без спуфа).

Сделал простую отправку UDP датаграммы чтоб прочекать у себя, можешь тоже проверить:

Код:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PACKET_SIZE 8192
#define SOURCE_ADDR "1.2.3.4"
#define SOURCE_PORT 12345
#define DST_ADDR "1.1.1.1"
#define DST_PORT 12345

unsigned short csum(unsigned short *buf, int nwords) {
    unsigned long sum;
    for(sum=0; nwords>0; nwords--) {
        sum += *buf++;
    }
    sum = (sum >> 16) + (sum &0xffff);
    sum += (sum >> 16);

    return (unsigned short)(~sum);
}

int main(int argc, char *argv[]) {
    int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    assert(sock != -1);

    const int optval = 1;
    int ret = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(optval));
    assert(ret != -1);

    char packet[PACKET_SIZE] = { 0 };
    struct iphdr *ip = (struct iphdr *)packet;
    struct udphdr *udp = (struct udphdr *)(packet + sizeof(*ip));

    ip->ihl = 5;
    ip->version = 4;
    ip->tos = 16;
    ip->tot_len  = sizeof(*ip) + sizeof(*udp);
    ip->id = htons(12345);
    ip->ttl = 64;
    ip->protocol = 17;
    ip->saddr = inet_addr(SOURCE_ADDR);
    ip->daddr = inet_addr(DST_ADDR);

    udp->source = htons(SOURCE_PORT);
    udp->dest = htons(DST_PORT);
    udp->len = htons(sizeof(*udp));

    ip->check = csum((unsigned short *)packet, sizeof(*ip) + sizeof(*udp));

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(DST_PORT);
    sin.sin_addr.s_addr = inet_addr(DST_ADDR);

    ret = sendto(sock, packet, ip->tot_len, 0, (struct sockaddr *)&sin, sizeof(sin));
    assert(ret != -1);

    close(sock);

    printf("Datagram sent to %s:%d, from %s:%d", DST_ADDR, DST_PORT, SOURCE_ADDR, SOURCE_PORT);

    return EXIT_SUCCESS;
}
 
Ответить с цитированием