![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите подсчитать контрольную сумму TCP-заголовка
SPACE © (2005-08-01 22:45:00)Народ помогите подсчитать контрольную сумму TCP-заголовка
вот захваченный SYN-пакет :
TCP - заголовок
\|/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[0]___________[7]_____________[15|_______________________________
Src Port : 2886 | Dst Port: 80
-----------------------------------------------------------------
Sequence Number: 35214831
-----------------------------------------------------------------
ASK Number : 0
-----------------------------------------------------------------
Off_Rsvd: 0x70 | Rsvd_Flag: 2 | Window : 8192
-----------------------------------------------------------------
CheckSum : 0xAC96 | Urgent Pointer: 0
-----------------------------------------------------------------
Заметьте что все значение WORD и DWORD уже инвертированы.
Псевдо - заголовок
\|/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+--------+--------+--------+--------+
| SrcIP : 62.183.70.31 |
+--------+--------+--------+--------+
| DstIp : 217.73.250.40 |
+--------+--------+--------+--------+
| нули | 6 | 20 |
+--------+--------+--------+--------+
SPACE (2005-08-02 18:42:00) [21]Нифига не работает. Я смотрю никто этим не занимался вот код
которы я намуливал за 20 минут. Чек-сумма неверна.
Алгоритм стандартный я его в интенете повсюду видел ну или подобный. Внизу в закоментированом состоянии выложен еще один
алгоритм он более изящен и понятен,но помоему неправилен так-как
у автора кода была такая-же проблема как у меня. Да и сумму он
выдает отличающеся от алгоритма Sha.
В коде применяется функция htons и htonl которая находится в модуле winsock,winsock2. Вместо htons можете использовать функцию SWAP :
Function SWAP(word) //меняет байты местами
Кстате Sha а что это у тебя за функция Sha_htons() ? :)
Sha (2005-08-02 16:45:00) [22]Тебе в пору присуждать приз за волю к победе. Держи и не мучайся:
//(c) Sha 2004
//CheckSum function calculates the 16-bit one's complement sum
//for the supplied buffer. Initial value of sum may be non-zero.
function CheckSum(pBuf: pointer; Size: integer; Initial: cardinal= 0): word;
var
p, q: pchar;
begin;
if (pBuf<>nil) and (Size>0) then begin;
q:=@pchar(pBuf)[Size-1];
p:=pBuf;
while p<q do begin;
inc(Initial,pword(p)^);
inc(pword(p));
end;
if p=q then inc(Initial,pbyte(p)^);
end;
Initial:=(Initial shr 16) + (Initial and $FFFF);
Initial:=(Initial shr 16) + Initial;
Initial:=(not Initial) and $FFFF;
Result:=Initial;
end;
Пример вычисления суммы TCP-заголовка:
//Calculate the TCP checksum including the TCP pseudo-header,
//TCP header itself and data (padded with a 0 if the data is odd length).
//The pseudo-header consists of the 32-bit source IP address,
//the 32-bit destination IP address, a zero byte, the 8-bit
//IP protocol field, the 16-bit TCP length.
with pIp^, pTcp^ do
tcp_checksum:=checksum(pTcp, TcpTotalSize,
//Summing pseudo-header
ip_srcaddr shr 16 + ip_srcaddr and $FFFF
+ ip_dstaddr shr 16 + ip_dstaddr and $FFFF
+ ip_protocol shl 8 + Sha_htons(TcpTotalSize));
SPACE (2005-08-02 15:47:00) [23]Ээ sorry небольшая ошибочка в подсчете TCP пакета :
2886+80+537+21549+28674+8192 = 0xF1DE//Сумма TCP
F3A0+25E5B = 0x35039// Общая сумма
5039+3 = 503C // Складываем лишний байт с Словом.
FFFF - 503C = 0xAFC3// Дополнение до FFFF.
Может алгоритм неправильный ?
SPACE (2005-08-02 14:57:00) [24]to tesseract
Ну тыб сразуб ссылку киндал на RFC 1071 корочеб вышло,
меня интересует ваш результат расчета относительнно вышеупомянутых данных
Вот мой расчет :
2886+80+537+21999+28674+8192 = 0xF3A0//Сумма TCP
16055+17951+55625+64040+1556 = 0x25E5B// Сумма Псевдо-аголовка.
Длину TCP я указал = 20 так-как поле опций и поле данных пусты.
F3A0+25E5B = 0x351FB// Общая сумма
51FB+3 = 51FE // Складываем лишний байт с Словом.
FFFF - 51FE = 0xAE01// Дополнение до FFFF.
0xAE01 Это не есть 0xAC96.
tesseract (2005-08-02 11:49:00) [25]В обратном коде просуммировать все слова(16 бит) данных. если количество байт нечётное - добавляются нулевые байты( не передаются а только для CRC). И имей ввиду при расчёте CRC Дополнительно рассчитывается псевдозаголовок (12 байт)- IP приёмника + IP источника + 8 нулевых бит + протокол (8 бит) + Длина TCP 16 бит.
SPACE (2005-08-02 10:48:00) [26]Эх Sorry на самом деле Sequence Number : 35214381. Видно у вас веб сервер глючит :)
Вопрос не отменял.
SPACE (2005-08-02 10:40:00) [27]Да наверное забыл :)
Sha не впадлу подсчитай чексумму этого пакета и покажи как считал, а то у меня чего-то не получается.
Sha (2005-08-02 00:38:00) [28]Арифметику забыл? В чем проблема-то?