Strona 1 z 1

[+] Podczas konwersji struktury na char* ucina dane

: 09 października 2008, 18:04
autor: killanonimx
Cześć.

Podczas konwersji struktury na char* ucina mi dane.

Kod: Zaznacz cały

struct ethhdr {
char dst[6];
char src[6];
short type;
} header;

char* charhdr=(char*)malloc(14);

char dst[6] ={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
char src[6] ={0x00, 0x19, 0xe0, 0xa0, 0x00, 0x02};

memcpy(header.dst, dst, 6);
memcpy(header.src, src, 6); <----- to w tym miejscu
header.type = htons(0x0800);
memcpy(charhdr, &header, sizeof(eth_hdr));

cout<<strlen(charhdr)<<endl; //zwraca 6 zamiast 14
Jest to spowodowane tym że src[0]==0, gdyby 0 było dalej to by ucięło dalej.

I teraz pytanko jak to zrobić żeby zadziałało, i jakby ktoś mógł mi wytłumaczyć dlaczego tak się dzieje to byłbym bardzo wdzięczny.

Re: Konwersja i ucięcie

: 09 października 2008, 18:28
autor: Teh
Nic ci nie obcina, po prostu funkcja strlen szuka znaku końca ciągu (0x00), i zwraca ilość bajtów przed 0x00.

Pozdr.,

: 10 października 2008, 16:00
autor: killanonimx
Możliwe ale jak np: wpiszę write(rawsocket, header, 14); to wyśle tylko 6 znaków.

: 10 października 2008, 16:40
autor: Teh
A skąd wiesz, że wysyła tylko 6 znaków?

Pozdr.,

: 10 października 2008, 16:54
autor: killanonimx
rawsocket to jest sobie:

Kod: Zaznacz cały

socket (PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
A wireshark'iem przechwytuję i wyświetla mi:

Kod: Zaznacz cały

ff ff ff ff ff ff
i dalej nic.

: 10 października 2008, 19:03
autor: Teh
Nie wiem, czy taka ramka (tylko nagłówek jest prawidłowa). W wiresharku oglądasz ramkę z nagłówkiem? Gdzieś powinien być widoczny mac "źródłowy".

http://aschauf.landshut.org/fh/linux/ud ... 01s03.html

: 11 października 2008, 17:33
autor: killanonimx
Tak chodzi o ethernet, ale musi być funkcja write a nie sendto. W wiresharku pisze że pakiet jest uszkodzony i pisze tylko adres docelowy, czyli:

Kod: Zaznacz cały

ff:ff:ff:ff:ff:ff
a dalej nic. Chyba że nie można użyć funkcji write to postaram się użyć sendto.

: 11 października 2008, 21:45
autor: Teh
Myślę, że chodzi o to, że chcesz wysłać ramkę ethernet, ale konstruujesz i wysyłasz tylko jej nagłówek, czego "standard nie przewiduje". Normalnie ramka ethernetowa "opakowuje" ramkę/pakiet protokołu wyższego poziomu. Zrób body ramki jak w podlinkowanym przykładzie albo podejrzyj wiresharkiem jakąś prawidłową ramkę i wtedy wysyłaj.

: 12 października 2008, 10:47
autor: killanonimx
Dzięki Teh nie wiedziałem, że w c++ można łączyć różne zmienne ze sobą.
Ale tu chyba chodzi o unsigned char*, bo w moim programie było char*.
A gdy zrobiłem

Kod: Zaznacz cały

char* packet=(char*)malloc(1546);
unsigned char* packetuchar=(unsigned char*)malloc(1546);
packetuchar=nagłówki_z_0x00;
memcpy(packet, packetuchar, 1546);
to packet był pusty.
Dziękuję Ci bardzo za pomoc.