Помогите собрать ack пакет

Тема в разделе "WASM.NETWORKS", создана пользователем Flasher, 16 янв 2006.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Сначало 2 маленьких вопроса:

    1. В ACK пакете хронятся непосредственно данные, правда?

    2. Можно же зная всю dst\src инфу между соединением, а именно мак, ип, порт, - собрать пакет с этимы данными, отправить адресату, и надеятся на успех?



    Я думаю можно...

    Решил собрать на основе winpcap.

    До уровня IP собрал, проверил, и если снифер не врёт, всё правильно.



    Как собрать сам TCP пакет, и поместить туда какие-нить данные для отправки?



    Знаю что вопрос не нацелен на конкретную проблему, но был бы очень благодарен любым ссылкам или исходничкам.

    Спасибо!

    [​IMG] _705687120__ack.rar
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    А где подсчет контрольных сумм пакетов?


    Код (Text):
    1. chksum(void *dataptr, int len)
    2. {
    3.   ULONG acc;
    4.  
    5.   for(acc = 0; len > 1; len -= 2) {
    6.     acc += *(USHORT *)dataptr;
    7.     dataptr = (void *)((USHORT *)dataptr + 1);
    8.   }
    9.  
    10.   if (len == 1) {
    11.     acc += htons((USHORT)((*(UCHAR *)dataptr) & 0xff) << 8);
    12.   }
    13.   acc = (acc >> 16) + (acc & 0xffffUL);
    14.  
    15.   if ((acc & 0xffff0000) != 0) {
    16.     acc = (acc >> 16) + (acc & 0xffffUL);
    17.   }
    18.  
    19.   return (USHORT)acc;
    20. }
    21.  
    22. USHORT
    23. inet_chksum(void *dataptr, u16_t len)
    24. {
    25.   ULONG acc;
    26.  
    27.   acc = chksum(dataptr, len);
    28.   while (acc >> 16) {
    29.     acc = (acc & 0xffff) + (acc >> 16);
    30.   }
    31.   return (USHORT)~(acc & 0xffff);
    32. }




    Надо с помощью inet_chksum считать контрольные суммы как IP, так и TCP пакетов. (в IP считается только КС заголовка).

    В TCP надо также позаботиться о правильном ACKNO и флагах.

    Заполнение TCP заголовка выглядит примерно так:


    Код (Text):
    1. typedef struct _tcp_hdr {
    2.   USHORT src;
    3.   USHORT dest;
    4.   ULONG  seqno;
    5.   ULONG  ackno;
    6.   USHORT _hdrlen_rsvd_flags;
    7.   USHORT wnd;
    8.   USHORT chksum;
    9.   USHORT urgp;
    10. } tcp_hdr, *ptcp_hdr;
    11.  
    12. #define TCPH_SET_HDRLEN(phdr, len) (phdr)->flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
    13. #define TCPH_SET_FLAGS(phdr, flags) (phdr)->flags = htons((ntohs((phdr)->flags) & ~TCP_FLAGS) | (flags))
    14.  
    15.  
    16. tcphdr->src = htons(pcb->local_port);
    17. tcphdr->dest = htons(pcb->remote_port);
    18. tcphdr->seqno = htonl(pcb->snd_nxt);
    19. tcphdr->ackno = htonl(pcb->rcv_nxt);
    20. TCPH_SET_FLAGS(tcphdr, TCP_SYN | TCP_ACK);
    21. tcphdr->wnd = htons(pcb->rcv_wnd);
    22. tcphdr->urgp = 0;
    23. TCPH_SET_HDRLEN(tcphdr, 5);
    24. tcphdr->chksum = 0;
    25. tcphdr->chksum = inet_chksum(tcphdr, len);
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо, Ms Rem.

    Хоть в С# не силён, но твой пример очень помог.



    Нашёл тож с этого форума исходник отправления syn, изменил кой что, и вроде как работает, и sum праильно собирает.



    Последняя трабла: какому из параметров структуры tcphdr дать указатель данных, которые надо отправить? (наверное не совсем правильно разяснился).



    Вот, например хочу отправить :bot!__@127.0.0.2 PRIVMSG #test :тест..



    [​IMG] _1322763136__ack.asm
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Я тоже в c# не силен, это код на си :)





    Данные будут после структуры tcphdr.





    Для этого придется писать полноценный tcp/ip стек. Тебе нужно поддерживать соединения, следить за последовательностью syn/ack, вести таймауты соединений и перезапрашивать потеряные пакеты. Короче есть такая книга "TCP/IP КРУПНЫМ ПЛАНОМ", (яндекс найдет где скачать), в ней протоколы расписаны довольно подробно.
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Ms Rem, а без поддержки соединения некак ?

    Я думал, например, если чел сидит в мирке..., я отправлю ack пакет всеми данными его соединения, то в канале появится слово "тест.." от его имени..

    Это фантастика? :)



    p.s. Совсем запутался, если c\c++ - это си\си плюс плюс, тода С# что такое ? :))
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Ну это возможно, но только после этого он вылетит с канала из за рассинхронизации syn/ack. Чтобы полноценно врезаться в соединение, нужно иметь позможность фильтровать его трафик, чтобы корректировать рассинхроницацию из за лишних пакетов.

    Я думал ты ирс бота пишешь, тогда действительно тебе понадобился бы полноценный стек.





    Это уе.анский язык такой.
     
  7. netw0rm

    netw0rm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    78
    Почему процедура подсчёта чек сумы такая большая :/ У меня меньеш вышло... Вроде всё правильно но буду благодарен если кто-то сообщит про ошибки

    [​IMG] _973797442__chksum.asm
     
  8. netw0rm

    netw0rm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    78
    Приношу извенения. Ошибка:

    Перед меткой @@ надо поставить

    xor eax, eax

    Тогда чек сума вычисляется правильно (по крайней мере сервер отвечает на мой пинг)