Arama butonu
Bu konudaki kullanıcılar: 1 misafir
1
Cevap
267
Tıklama
0
Öne Çıkarma
WinPcap TCP Checksum sorunu
P
10 yıl
Er
Konu Sahibi

Merhabalar, winpcap ile karşı sunucuya tcp syn paketi göndermek istiyorum fakat şuana kadar denediğim her yöntemde checksum yanlış çıkıyor

Bu gönderdiğim paket
unsigned char* vnPSon; 

vnPSon = new unsigned char[54];
memset((void*)vnPSon, '\0', 54);

//ETHERNET II
memcpy((void*)vnPSon, (void*)"\xFF\xFF\xFF\xFF\xFF\xFF", 6); //Broadcast
memcpy((void*)(vnPSon+6), (void*)srcMac, 6); //Source MAC
memcpy((void*)(vnPSon+12), (void*)"\x08", 2); //IP Header

//IP HEADER
memcpy((void*)(vnPSon+14), (void*)"\x45", 1); //IPV4
memcpy((void*)(vnPSon+15), (void*)"\x00", 1); //Differnatied Services
unsigned short kpr = htons(46);
memcpy((void*)(vnPSon+16), (void*)&kpr , 2); //Header boyutu
memcpy((void*)(vnPSon+18), (void*)"\x0000", 2); //Id
memcpy((void*)(vnPSon+20), (void*)"\x40", 1); //IP Header flag
memcpy((void*)(vnPSon+21), (void*)"\x00", 1); //Offset
memcpy((void*)(vnPSon+22), (void*)"\x5F", 1); //TTL 255 saniye
memcpy((void*)(vnPSon+23), (void*)"\x06", 1); //Protokol
memcpy((void*)(vnPSon+24), (void*)"\x00\x00", 2); //Checksum
memcpy((void*)(vnPSon+26), (void*)&srcIp, 4); //Yerel ip
memcpy((void*)(vnPSon+30), (void*)&dstIp, 4); //Hedef ip

//TCP HEADER
memcpy((void*)(vnPSon+34), (void*)"\x0020", 2); //Kaynak port
unsigned short test = htons(dstPort);
memcpy((void*)(vnPSon+36), (void*)&test, 2); //Hedef port
memcpy((void*)(vnPSon+38), (void*)"\x00\x00\x00\x00", 4); //Sequence number
memcpy((void*)(vnPSon+42), (void*)"\x00\x00\x00\x00", 4); //Ack number
memcpy((void*)(vnPSon+46), (void*)"\x50", 1); //TCP Offset
memcpy((void*)(vnPSon+47), (void*)"\x02", 1); //Flag syn
memcpy((void*)(vnPSon+48), (void*)"\xFF", 2); //Window
memcpy((void*)(vnPSon+50), (void*)"\x0000", 2); //Checksum
memcpy((void*)(vnPSon+52), (void*)"\x0000", 2); //Urgent point

Pakete wireshark ile baktığımda tcp checksum hariç hiçbir sorunu yok

Bu tcp checksum için kullandığım en son yöntem
unsigned short *tempTcp = (unsigned short*)malloc(32); 

memcpy((void*)tempTcp, (void*)(vnPSon+26), 8);//Kaynak ve hedef ip
memcpy((void*)(tempTcp+8), (void*)"\x00", 1);//Reserved
memcpy((void*)(tempTcp+9), (void*)"\x06", 1);//Protokol
memcpy((void*)(tempTcp+10), (void*)"\x0014", 2);//TCP Length
memcpy((void*)(tempTcp+12), (void*)(vnPSon+34), 20);

register unsigned long csum=0;
unsigned short *buffer=(unsigned short*)tempTcp;
unsigned short size=32;
while(size>1)
{
csum += *buffer++;
size -= 2;
}
if(size>1) csum += *(unsigned char*)buffer;

csum = (csum>>16) + (csum & 0xFFFF);
csum += (csum>>16);
return htons(~csum);


Başka yöntemler için bolca araştırdım bulduğum her yöntemi denedim fakat hepsi yanlış çıkıyor şimdiden teşekkürler

Ek olarak paket
< Resime gitmek için tıklayın >





< Bu mesaj bu kişi tarafından değiştirildi Polkakorowakurwa -- 6 Temmuz 2015; 17:54:50 >

G
10 yıl
Onbaşı

Aynı sorunla bende 2 yıl önce karşılaşmıştım bende çözümü bulamadım şuan c++yı bırakalı çok oldu aklımda kalan bilgi hesap makinesi yapacak düzeyde bile değil yinede bilen biri arkadaşa cevap verebilir mi?




Bu mesajda bahsedilenler: @Polkakorowakurwa
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.