Сначало 2 маленьких вопроса: 1. В ACK пакете хронятся непосредственно данные, правда? 2. Можно же зная всю dst\src инфу между соединением, а именно мак, ип, порт, - собрать пакет с этимы данными, отправить адресату, и надеятся на успех? Я думаю можно... Решил собрать на основе winpcap. До уровня IP собрал, проверил, и если снифер не врёт, всё правильно. Как собрать сам TCP пакет, и поместить туда какие-нить данные для отправки? Знаю что вопрос не нацелен на конкретную проблему, но был бы очень благодарен любым ссылкам или исходничкам. Спасибо! _705687120__ack.rar
А где подсчет контрольных сумм пакетов? Код (Text): chksum(void *dataptr, int len) { ULONG acc; for(acc = 0; len > 1; len -= 2) { acc += *(USHORT *)dataptr; dataptr = (void *)((USHORT *)dataptr + 1); } if (len == 1) { acc += htons((USHORT)((*(UCHAR *)dataptr) & 0xff) << 8); } acc = (acc >> 16) + (acc & 0xffffUL); if ((acc & 0xffff0000) != 0) { acc = (acc >> 16) + (acc & 0xffffUL); } return (USHORT)acc; } USHORT inet_chksum(void *dataptr, u16_t len) { ULONG acc; acc = chksum(dataptr, len); while (acc >> 16) { acc = (acc & 0xffff) + (acc >> 16); } return (USHORT)~(acc & 0xffff); } Надо с помощью inet_chksum считать контрольные суммы как IP, так и TCP пакетов. (в IP считается только КС заголовка). В TCP надо также позаботиться о правильном ACKNO и флагах. Заполнение TCP заголовка выглядит примерно так: Код (Text): typedef struct _tcp_hdr { USHORT src; USHORT dest; ULONG seqno; ULONG ackno; USHORT _hdrlen_rsvd_flags; USHORT wnd; USHORT chksum; USHORT urgp; } tcp_hdr, *ptcp_hdr; #define TCPH_SET_HDRLEN(phdr, len) (phdr)->flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) #define TCPH_SET_FLAGS(phdr, flags) (phdr)->flags = htons((ntohs((phdr)->flags) & ~TCP_FLAGS) | (flags)) tcphdr->src = htons(pcb->local_port); tcphdr->dest = htons(pcb->remote_port); tcphdr->seqno = htonl(pcb->snd_nxt); tcphdr->ackno = htonl(pcb->rcv_nxt); TCPH_SET_FLAGS(tcphdr, TCP_SYN | TCP_ACK); tcphdr->wnd = htons(pcb->rcv_wnd); tcphdr->urgp = 0; TCPH_SET_HDRLEN(tcphdr, 5); tcphdr->chksum = 0; tcphdr->chksum = inet_chksum(tcphdr, len);
Спасибо, Ms Rem. Хоть в С# не силён, но твой пример очень помог. Нашёл тож с этого форума исходник отправления syn, изменил кой что, и вроде как работает, и sum праильно собирает. Последняя трабла: какому из параметров структуры tcphdr дать указатель данных, которые надо отправить? (наверное не совсем правильно разяснился). Вот, например хочу отправить :bot!__@127.0.0.2 PRIVMSG #test :тест.. _1322763136__ack.asm
Я тоже в c# не силен, это код на си Данные будут после структуры tcphdr. Для этого придется писать полноценный tcp/ip стек. Тебе нужно поддерживать соединения, следить за последовательностью syn/ack, вести таймауты соединений и перезапрашивать потеряные пакеты. Короче есть такая книга "TCP/IP КРУПНЫМ ПЛАНОМ", (яндекс найдет где скачать), в ней протоколы расписаны довольно подробно.
Ms Rem, а без поддержки соединения некак ? Я думал, например, если чел сидит в мирке..., я отправлю ack пакет всеми данными его соединения, то в канале появится слово "тест.." от его имени.. Это фантастика? p.s. Совсем запутался, если c\c++ - это си\си плюс плюс, тода С# что такое ? )
Ну это возможно, но только после этого он вылетит с канала из за рассинхронизации syn/ack. Чтобы полноценно врезаться в соединение, нужно иметь позможность фильтровать его трафик, чтобы корректировать рассинхроницацию из за лишних пакетов. Я думал ты ирс бота пишешь, тогда действительно тебе понадобился бы полноценный стек. Это уе.анский язык такой.
Почему процедура подсчёта чек сумы такая большая :/ У меня меньеш вышло... Вроде всё правильно но буду благодарен если кто-то сообщит про ошибки _973797442__chksum.asm
Приношу извенения. Ошибка: Перед меткой @@ надо поставить xor eax, eax Тогда чек сума вычисляется правильно (по крайней мере сервер отвечает на мой пинг)