[+] Podczas konwersji struktury na char* ucina dane

Potrzebujesz pomocy z C, C++, perl, python, itp.
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

[+] Podczas konwersji struktury na char* ucina dane

Post 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.
Teh
Posty: 9
Rejestracja: 25 września 2008, 19:57
Lokalizacja: Olsztyn

Re: Konwersja i ucięcie

Post 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.,
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post autor: killanonimx »

Możliwe ale jak np: wpiszę write(rawsocket, header, 14); to wyśle tylko 6 znaków.
Teh
Posty: 9
Rejestracja: 25 września 2008, 19:57
Lokalizacja: Olsztyn

Post autor: Teh »

A skąd wiesz, że wysyła tylko 6 znaków?

Pozdr.,
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post 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.
Teh
Posty: 9
Rejestracja: 25 września 2008, 19:57
Lokalizacja: Olsztyn

Post 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
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post 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.
Teh
Posty: 9
Rejestracja: 25 września 2008, 19:57
Lokalizacja: Olsztyn

Post 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.
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post 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.
ODPOWIEDZ