Autor
|
Tema: Pasar de const u_char* a char* en c++ (Leído 7,132 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Modifico el post, la anterior duda fue solucionada. La nueva duda esta en mi siguiente post.
Saludos.
|
|
« Última modificación: 5 Julio 2015, 15:15 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Pon los errores. Sin errores, hay que intuir muchas cosas.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Esa es la gracia, que no había errores. Bueno gracias ivancea por esta aquí para ayudarme, odio esto de los tipos. La verdad que lo conseguí solucionar de esta manera finalmente: mac_adaptador = (u_char*)malloc(sizeof(u_char)* 6); for (int i = 0; i < 6; i++) mac_adaptador[i] = (u_char)(*adaptador)->Address[i];
Aunque tengo otra duda ahora, que es ¿como pasar de const u_char* a char*? he probado con prácticamente de todo, y he buscado lo que he podido y sigue sin dar resultado. He probado con: pkt_data es un const char*, quiero pasarlo a cadena o mostrarlo caracter a caracter: 1: printf("%c", (char)(const_cast<u_char*>(pkt_data)[i])); 2: long a = (long)pkt_data[i]; //printf("%c", (char)a); 3: char* cadena=reinterpret_cast<char*>(const_cast<u_char*>(pkt_data)) Todas muestran basura, se supone que la tercera debería funcionar, pues const_cast pasa las variables de "const X" a "X", y luego una vez la tengo en u_char* sería pasarla a char* pero muestra basura y no funciona, eso sí todas las opciones compilan. Edito: Aquí en una respuesta explica lo de el const_cast: http://stackoverflow.com/questions/658913/c-style-cast-from-unsigned-char-to-const-charEdito: Más intentos fallidos: printf("%s", (char*)const_cast<u_char*>(pkt_data)); //printf("%s", reinterpret_cast<char*>(const_cast<u_char*>(pkt_data))); Salida: p↑ï├'♠
Esto creo que funciona pero no obtengo en ASCII: u_long MacAddr = (u_long)pkt_data; BYTE *bMacAddr = (BYTE*)&MacAddr; string res; stringstream ss; for (int i = 0; i < header->caplen; i++) { ss << hex << (int)bMacAddr[i]; res += ss.str(); ss.str(""); } cout << res; Reutilicé código del mismo proyecto XD, lo que pasa obtengo salidas como esta: TAMAÐO : 1283 c2ee2cccccccccccccccc1000ccccccccccccccccc2ee2cccccccccccccccc6c12461ccccccccea4 745c10e4fd0b9881b010006cdffd0d07b1905810461c82ee16ce0fd034e2fd0060e77ecccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccacd1d1cccccccc6ce0 fd03551190000000004ce1fd034e2fd0060e77ecccccccccccccc0cccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccac d1d1cccccccc4ce1fd025c1902ce2fd034e2fd0060e77ecccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccacd1d1cccccccc2ce2fd02e701a0ce3fd034e2fd00 60e77ecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccca8 d1d1ccccccccce3fd0809f170ce4fd0c4e6fd0060e77eccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccc1072f1cccccccc1ce4fd0a84c1a0727d45cfce4fd0c 4e6fd0060e77eccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc Ese mismo paquete, un HTTP con el wireshark (comprobe tamaños y los recogí a la vez) me sale en hexadecimal y en ASCII, yo aquí ¿estoy mostrando bytes? No entiendo, ¿como puedo hacer para obtenerlo en cadena decimal? Saludos.
|
|
« Última modificación: 5 Julio 2015, 12:27 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Si es una MAC, no es basura. Son los bytes. Es lo mismo del otro post.
Y errores tiene que haber. Ya sea un error al compilar, una excepción en tiempo de ejecución, un error lógico, ...
En primer lugar, tienes que tener claro como convertir tipos. No se si tu problema es de convertir tipos, de interpretar la MAC, o cual es. El otro post también hablabas de la MAC.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
No hay ninguna mac, como he puesto solo he reutilizado el codigo del anterior post, que ya fue solucionado. Como ya he dicho pkt_data es un const u_char* y quiero mostrar su contenido en texto plano, como una cadena. El paquete capturado era un HTTP, debetia aparecer en texto plano algo como "GET /forum.php ..." sin embargo la salida no es esa, quiero saber que debo hacer para obtenerlo en texto plano, y ahi esta todo lo que he probado sin exito.
Por el tema de errores no hay ninguno en la compilacion y el programa no casca en ningun momento, si lo hace ya lo se corregir. Simplemente no estoy obteniendo los datos en el formato que busco.
Saludos.
|
|
« Última modificación: 5 Julio 2015, 15:05 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
¿Comprobaste que no fuera HTTPS?
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Así es además la página que utilicé no lo soporta, era un simple HTTP GET.
Quiero hacer como wireshark, prueba a abrirlo y filtra los HTTP. Verás que te aparece abajo a la izquierda en hexadecimal los valores del paquete y a su derecha aparecen esos valores en texto plano, pasa de hexadecimal a texto plano el contenido del paquete ¿como?
Lo que busco es hacer eso, tengo el contenido del paquete en const u_char* (pkt_data), y quiero pasarlo a texto plano, o al menos unas subcadenas para poder mostrar las IPs del paquete.
Ya te he dicho todo lo que he probado y no lo conseguí, ¿propones alguna idea para pasar a texto plano ese const u_char*?
Saludos.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Mi código es parecido a el de ese link, obtengo los datos del paquete con pcap_next_ex(). Mira esto es la salida que quiero conseguir: DATA Dump IP Header 45 00 01 a2 2e 22 40 00 80 06 05 5a c0 a8 00 65 E...."@.€..Z...e 60 11 a4 bb `...
TCP Header 04 bb 00 50 27 39 09 9e df e8 1c 7b 50 18 44 70 ...P'9.....{P.Dp c7 6e 00 00 .n..
Data Payload 47 45 54 20 2f 31 2f 3f 42 57 31 33 6a 67 25 32 GET /1/?BW13jg%2 42 56 52 48 35 6c 52 6c 55 25 32 42 37 71 63 4a BVRH5lRlU%2B7qcJ 30 44 78 6d 53 62 45 44 32 46 4d 43 76 59 74 43 0DxmSbED2FMCvYtC 6b 58 6c 48 25 32 46 59 38 4a 41 41 41 41 41 41 kXlH%2FY8JAAAAAA 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 41 41 41 47 4e 74 5a 43 35 6c 65 47 55 41 56 32 AAAGNtZC5leGUAV2 6c 75 5a 47 39 33 63 79 42 44 62 32 31 74 59 57 luZG93cyBDb21tYW 35 6b 49 46 42 79 62 32 4e 6c 63 33 4e 76 63 67 5kIFByb2Nlc3Nvcg 41 31 4c 6a 45 75 4d 6a 59 77 4d 43 34 31 4e 54 A1LjEuMjYwMC41NT 45 79 41 45 31 70 59 33 4a 76 63 32 39 6d 64 43 EyAE1pY3Jvc29mdC 42 44 62 33 4a 77 62 33 4a 68 64 47 6c 76 62 67 BDb3Jwb3JhdGlvbg 41 41 41 41 25 33 44 25 33 44 20 48 54 54 50 2f AAAA%3D%3D HTTP/ 31 2e 31 0d 0a 48 6f 73 74 3a 20 70 61 32 2e 7a 1.1..Host: pa2.z 6f 6e 65 6c 61 62 73 2e 63 6f 6d 0d 0a 41 63 63 onelabs.com..Acc 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a ept-Encoding: gz 69 70 0d 0a 41 63 63 65 70 74 3a 20 2a 2f 2a 0d ip..Accept: */*. 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content-Type: t 65 78 74 2f 70 6c 61 69 6e 0d 0a 55 73 65 72 2d ext/plain..User- 41 67 65 6e 74 3a 20 5a 6f 6e 65 41 6c 61 72 6d Agent: ZoneAlarm 2f 39 2e 31 2e 30 30 38 2e 30 30 30 20 28 6f 65 /9.1.008.000 (oe 6d 2d 31 30 34 33 3b 20 65 6e 2d 55 53 29 20 5a m-1043; en-US) Z 53 50 2f 32 2e 32 0d 0a 0d 0a SP/2.2.... Yo lo que tengo ahora mismo es lo de la izquierda, los valores en hexadecimal. Quiero pasarlo a texto plano como en la derecha, ¿como? Esto lo he sacado de aquí: http://www.binarytides.com/code-packet-sniffer-c-winpcap/Vamos que son pktdata como ya dije es un const u_char*, luego sería pasarlo a char*, ¿o no? Saludos. Edito: Bueno bueno bueno, me estuve estudiando la página del link y he conseguido mostrarlo: Ejemplo que muestro: 00 1c 25 e5 bd 8b 70 18 8b c3 27 db 08 00 45 00 ..%...p...'...E. 00 46 61 bd 00 00 80 11 12 52 ac 1a 0a 6e 08 08 .Fa...Ç..R...n.. 08 08 e9 28 00 35 00 32 b4 d8 e9 33 01 00 00 01 ...(.5.2...3.... 00 00 00 00 00 00 03 77 77 77 10 67 6f 6f 67 6c .......www.googl 65 2d 61 6e 61 6c 79 74 69 63 73 03 63 6f 6d 00 e-analytics.com. 00 01 00 01 .... Aunque se corta, pero creo que es debido al strlen que en cpp no acepta u_char como hace C. El código es este: void PrintData(u_char* data, int Size) { unsigned char a, line[17], c; int j; //loop over each character and print for (int i = 0; i < Size; i++) { c = data[i]; //Print the hex value for every character , with a space printf( " %.2x", (unsigned int)c); //Add the character to data line a = (c >= 32 && c <= 128) ? (unsigned char)c : '.'; line[i % 16] = a; //if last character of a line , then print the line - 16 characters in 1 line if ((i != 0 && (i + 1) % 16 == 0) || i == Size - 1) { line[i % 16 + 1] = '\0'; //print a big gap of 10 characters between hex and characters printf(" "); //Print additional spaces for last lines which might be less than 16 characters in length for (j = strlen(reinterpret_cast<char*>(line)); j < 16; j++) { printf(" "); } printf("%s \n", line); } } printf("\n"); }
Aun así tiene que mejorar mucho. Edito: Bueno yo creo que el tema está solucionado, aunque no entiendo la solucion que ya intentaré ver como funciona, pues quiero la salida del paquete HTTP en texto plano, de esta manera tendré un sniffercillo XDD. Gracias ivancea como siempre , pues fuiste la llave a mi solución gracias a el link de wireshark. Saludos.
|
|
« Última modificación: 5 Julio 2015, 22:30 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
En vez de utilizar ese código, puedes escribir en pantalla como quieras el u_char*. Conviertelo a char* si te es más cómodo, pero es lo mismo. printf() y listo.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[?] cambiar una comparacion de const char * a metodo string.compare
Programación C/C++
|
Drakomorh
|
2
|
3,909
|
25 Mayo 2011, 18:58 pm
por Littlehorse
|
|
|
Pasar de const char* a int
Programación C/C++
|
eleon
|
4
|
5,421
|
15 Junio 2012, 16:09 pm
por durasno
|
|
|
Pasar tipo const char* a char
« 1 2 »
Programación C/C++
|
jorge_hura
|
15
|
11,596
|
25 Julio 2013, 09:50 am
por Eternal Idol
|
|
|
Error const char no es compatible con LPCWSTR.
« 1 2 »
Programación C/C++
|
NikNitro!
|
12
|
14,825
|
30 Abril 2014, 22:43 pm
por Eternal Idol
|
|
|
(Ayuda) Error al modificar el valor de un char en una cadena const char *
Programación C/C++
|
Seyro97
|
4
|
8,381
|
2 Julio 2015, 15:17 pm
por Seyro97
|
|