elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


  Mostrar Mensajes
Páginas: 1 ... 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [62] 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
611  Programación / Programación C/C++ / Duda pasar de LPWSTR a char * en: 13 Noviembre 2014, 14:26 pm
Tema muy muy frustrante, érase un keylogger:

Código:
HWND ventana;
LPWSTR cadena;
char ventanika[500];
while(1)
{
GetWindowText(ventana, cadena, 500);
//metemos en ventanika lo de cadena
fprintf(log, "[-] [ Ventana: %s ]", ventanika);
}

He probado todo, todo.

Luego como se inicializa ese demonio, ni un ejemplo.
Vale si pones: LPWSTR cadena=L"***** de cadena";
Luego usas GETWINDOWTEXT y sigue teniendo ***** de cadena XD

Luego me hizo gracia el visual studio hice un programa fuí a ejecutarlo en otro ordenador y me dió eror que faltaba una dll me decía MVS... .dll wtf?

Edito: LOL no se puede escribir mir..a en el foro.

Edito: No se trata de convertir el tema realmente sino de porque no funciona GETWINDOWTEXT y no me carga la cadena.

Otra prueba más:

Código:
HWND ventana;
char ventanika[500];
while(1)
{
GetWindowText(ventana, (LPWSTR)ventanika, 500);
for (int i = 0; ventanika[i] != '\0'; i++)
{
printf("%c", ventanika[i]);
}
system("pause");
}

Creo que por aquí avanzamos más pero así solo me muestra el primer caracter, debe de ser un puntero pero aun así debería de sacar todos los caracteres no? x`p
xD
612  Seguridad Informática / Hacking / Ayuda para crackear router en: 13 Noviembre 2014, 14:11 pm
Hola a todos compañeros, miren tengo una red "pública" y he probado a acceder a su router para tratar de configurar puertos, prohibir MAC, cambiar contraseñas... todas las cosas que se podrían hacer.

Uso IPCONFIG para ver la dirección de la puerta de enlace en este caso es XXX.XX.XX.X, me dirijo a la dirección con el navegador me dice que es un ubuntu (squid/2.7.STABLE9) y me sale un error:

The system returned: (111) Connection refused

¿Cómo podría entrar? ¿Es posible usar algún exploit?, supongo que habrán bloqueado la entrada a los ordenadores de la misma red o no sé, si pueden darme ideas quizás pueda hacer algo para entrar, saludos.
613  Seguridad Informática / Seguridad / Re: Como detectar wireshark en red en: 13 Noviembre 2014, 13:33 pm
Vamos que si alguien abre el wireshark en la red puede ver las peticiones que hacen los equipos de dentro de ella sin necesidad de un MITM, el tráfico cifrado no lo podrá descifrar si no sabe como, y el texto plano enviado podrá verlo, luego hay que tener cuidado en redes compartidas y mucho.

Gracias, algún día tendré que probar eso de inyectar js por la red, aunque no sé que js debería de meter quizás alguno que redireccione a otra página no sé xD
614  Seguridad Informática / Seguridad / Re: Como detectar wireshark en red en: 12 Noviembre 2014, 18:58 pm
Pero entonces ¿si no hace ningún MITM no puede ver mi tráfico? o de otra forma ¿l única manera para que pueda ver mi tráfico cifrado y sin cifrar me refiero, es haciendo un MITM?

¿Ustedes abren el wireshark ahora mismo sin nada previo, y pueden ver el tráfico de los demás ordenadores de la red o hacen un MITM antes para poder verlo?.

Si tienen que hacer un MITM para ver mi tráfico sé que con arp lo puedo evitar y defenderme si no, no se me ocurre manera alguna.

PD: eso del js parece muy interesante.

Saludos.
615  Seguridad Informática / Seguridad / Como detectar wireshark en red en: 12 Noviembre 2014, 16:09 pm
Hola a todos tengo unas dudas acerca de wireshark:

¿El wireshark para capturar paquetes de otros ordenadores de la red necesita para ello que se haya realizado un MITM? Es decir imaginemos que entro en foro.elhacker.net y hay alguien que abre wireshark podría ver mi tráfico solo con abrirlo o necesitaría realizar un MITM a la red y sniffar de nuevo para poder captar la página a la que accedo.

Si usa un MITM sería fácil de detectar con ARP, pero si no usa un MITM ¿cómo podría proteger mi privacidad?

Saludos y gracias.
616  Programación / Desarrollo Web / Re: Recoger cookie de javascript con cliente en: 12 Noviembre 2014, 10:10 am
No uso curl, uso cpp al natural. De lo que se trata es de iniciar una sesión en una página web, conseguirme loguear dentro de ella. Para ello debo usar HTPP y realizar varias peticiones hasta conseguir la cookie que dentifica mi sesión, una cookie llamada JESESSID: 89u328fi3hf...

Pero no se a qué páginas debo de hacer la petición (por ejemplo voy al /login) y hago un POST con las variables usuario y contraseña, de ahí me redirige a la página principal mando las cookiesde la anterior y no pasa nada, en LIVE HEADERS ocurría lo mismo pero luego firefox empezaba a descargar cosas y mandaba peticiones que no sabía de dónde salían.

Mi código actual para intentar iniciar la sesión:

Código
  1. #include "Peticiones.h"
  2.  
  3. int inicia_sesion(char* usuario, char *contraseña)
  4. {
  5. WSADATA wsa;
  6. SOCKET sock;
  7. unsigned short tamaño;
  8. struct sockaddr_in directorio;
  9. char datos[20000], variables[500];
  10. char cookie[1000], auxiliar[50];
  11.  
  12. WSAStartup(MAKEWORD(2, 0), &wsa);
  13. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  14. {
  15. printf("Se ha producido un error al inicializar el socket.");
  16. exit(0);
  17. }
  18. else
  19. {
  20. directorio.sin_family = AF_INET;
  21. directorio.sin_port = htons(PUERTO);
  22. directorio.sin_addr.s_addr = inet_addr(IP);
  23. connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
  24.  
  25. strcpy_s(variables, "email=");
  26. strcat_s(variables, usuario);
  27. strcat_s(variables, "&password=");
  28. strcat_s(variables, contraseña);
  29.  
  30. tamaño = strlen(variables);
  31. _itoa_s(tamaño, auxiliar, 10);
  32.  
  33. strcpy_s(datos, "POST / HTTP/1.1\r\n");
  34. strcat_s(datos, "Host: dominio.com\r\n");
  35. strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
  36. strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  37. strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
  38. strcat_s(datos, "Referer: http://dominio.com/\r\n");
  39. strcat_s(datos, "Connection: keep-alive\r\n");
  40. strcat_s(datos, "Cache-Control: max-age=0\r\n");
  41. strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
  42. strcat_s(datos, "Content-length: ");
  43. strcat_s(datos, auxiliar);
  44. strcat_s(datos, "\r\n\r\n");
  45. strcat_s(datos, variables);
  46.  
  47. send(sock, datos, strlen(datos), 0);
  48. printf("mando: %s", datos); system("pause");
  49. strcpy_s(datos, "");
  50. recv(sock, datos, 20000, 0);
  51. printf("recibo: %s", datos); system("pause");
  52.  
  53. FILE *cookies, *caakies;
  54. int tam = strlen(datos), i, j;
  55.  
  56. caakies = fopen("Caakies.txt", "wt");
  57.  
  58. char hookie[500];
  59. for (i = 0; i < tam; i++)
  60. {
  61. if ((datos[i] == 'S') &&
  62. (datos[i + 1] == 'e') &&
  63. (datos[i + 2] == 't') &&
  64. (datos[i + 3] == '-') &&
  65. (datos[i + 4] == 'C') &&
  66. (datos[i + 5] == 'o') &&
  67. (datos[i + 6] == 'o') &&
  68. (datos[i + 7] == 'k') &&
  69. (datos[i + 8] == 'i') &&
  70. (datos[i + 9] == 'e') &&
  71. (datos[i + 10] == ':') &&
  72. (datos[i + 11] == ' '))
  73. {
  74. i = i + 12;
  75. j = 0;
  76. while (datos[i] != '\n')
  77. {
  78. cookie[j] = datos[i];
  79. i++;
  80. j++;
  81. }
  82. cookie[j] = '*';
  83. j = 0;
  84. for (int k = 0; k < strlen(cookie); k++)
  85. {
  86. if (cookie[k] != '*')
  87. {
  88. hookie[j] = cookie[k];
  89. j++;
  90. }
  91. else
  92. {
  93. hookie[j] = '\0';
  94. break;
  95. }
  96. }
  97. fprintf(caakies,"%s\n",hookie);
  98. strcpy_s(cookie, "");
  99. strcpy_s(hookie, "");
  100. }
  101. }
  102. fclose(caakies);
  103.  
  104. caakies = fopen("Caakies.txt","rt");
  105. cookies = fopen("Cookies.txt", "wt");
  106. char almacena[10][500];
  107. int coincidencia = 0;
  108.  
  109. i = 0;
  110. printf("entro");
  111. while (fgets(cookie, 400, caakies) && strcmp(cookie, "") != 0)
  112. {//falta poner que se quede con la ultima cookie.
  113. coincidencia = 0;
  114. strcpy_s(almacena[i], cookie);
  115. i++;
  116. for (int j = 0; j < i; j++)
  117. {
  118. if (strcmp(almacena[j], cookie) == 0)
  119. {
  120. coincidencia = 1;
  121. }
  122. }
  123. if (coincidencia != 1)
  124. {
  125. fprintf(cookies, "%s", cookie);
  126. }
  127. }
  128. printf("salgo");
  129.  
  130. system("pause");
  131.  
  132. cookies = fopen("Cookies.txt", "rt");
  133. strcpy_s(datos, "POST / HTTP/1.1\r\n");
  134. strcat_s(datos, "Host: dominio.com\r\n");
  135. strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
  136. strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  137. strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
  138. strcat_s(datos, "Referer: http://dominio.com/\r\n");
  139. while (fgets(cookie,400,cookies) && strcmp(cookie, "") != 0)
  140. {//fscanf(cookies,"%s\n",cookie)>0
  141. cookie[strlen(cookie)-1] = '\0';
  142. strcat_s(datos, "Cookie: ");
  143. strcat_s(datos, cookie);
  144. strcat_s(datos, "\r\n");
  145. }
  146. strcat_s(datos, "Connection: keep-alive\r\n");
  147. strcat_s(datos, "Cache-Control: max-age=0\r\n");
  148. strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
  149. strcat_s(datos, "Content-length: ");
  150. strcat_s(datos, auxiliar);
  151. strcat_s(datos, "\r\n\r\n");
  152. strcat_s(datos, variables);
  153. fclose(cookies);
  154.  
  155. send(sock, datos, strlen(datos), 0);
  156. printf("mando: %s", datos); system("pause");
  157. strcpy_s(datos, "");
  158. recv(sock, datos, 20000, 0);
  159. printf("recibo: %s", datos); system("pause");
  160.  
  161. cookies = fopen("Cookies.txt", "wt");
  162. tam = strlen(datos);
  163. strcpy(hookie,"");
  164. for (i = 0; i < tam; i++)
  165. {
  166. if ((datos[i] == 'S') &&
  167. (datos[i + 1] == 'e') &&
  168. (datos[i + 2] == 't') &&
  169. (datos[i + 3] == '-') &&
  170. (datos[i + 4] == 'C') &&
  171. (datos[i + 5] == 'o') &&
  172. (datos[i + 6] == 'o') &&
  173. (datos[i + 7] == 'k') &&
  174. (datos[i + 8] == 'i') &&
  175. (datos[i + 9] == 'e') &&
  176. (datos[i + 10] == ':') &&
  177. (datos[i + 11] == ' '))
  178. {
  179. i = i + 12;
  180. j = 0;
  181. while (datos[i] != ';')
  182. {
  183. cookie[j] = datos[i];
  184. i++;
  185. j++;
  186. }
  187. cookie[j] = '*';
  188. j = 0;
  189. for (int k = 0; k < strlen(cookie); k++)
  190. {
  191. if (cookie[k] != '*')
  192. {
  193. hookie[j] = cookie[k];
  194. j++;
  195. }
  196. else
  197. {
  198. hookie[j] = '\0';
  199. break;
  200. }
  201. }
  202. fprintf(cookies, "%s\n", hookie);
  203. strcpy_s(cookie, "");
  204. strcpy_s(hookie, "");
  205. }
  206. }
  207. fclose(cookies);
  208. closesocket(sock);
  209. }
  210. return 1;
  211. }
  212.  

Hago un POST  la página de login subiendo usuario y contraseña, una vez recogidas las cookies que me devuelve hago otro POST a la principal pues al mandar el POST del login me hace un MOVED TEMPORALY a la principal, así que voy a la principal mando cookies de la anterior que por cierto me manda 2 cookies que se llaman igual (en este caso debería quedarme con la última enviada, por cierto estaba haciendo ese código ahora y los archivos de cookies pueden fallar).

De todo esto me gustaría saber si para iniciar sesión en qué me tengo que fijar. Oí que en los javascript, en ese caso sería descargar el HTML, buscar document.cookie(...) habría que hacer eso, ¿qué más métodos pueden usar para meterme una cookie, y cómo yo debo hacer para interpretarla?. Gracias y saludos, subiré más cuando vuelva a ello, interesados en probar con la página que me manden MP.
617  Programación / Desarrollo Web / Re: .htaccess - Bloquear conexiones IP cada X entradas en: 9 Noviembre 2014, 13:07 pm
Idea macabra:

Código
  1. <?
  2. $fp=fopen("Control.txt","at");
  3. fwrite($fp,$_SERVER['REMOTE_ADDR'] . "\n");
  4. fclose($fp);
  5. ?>
  6.  

Este archivo lo borrarías cada día y luego tendrías que ejecutar un script PHP que te busque coincidencias de IP, si en el archivo llegas a 30 coincidencias quiere decir que esa máquina se ha conectado a esa dirección 30 veces en menos de un día luego podrías bloquearla, creando otro archivo php de control, les rediriges ahí en cada conexión y si coinciden, les deniegas la conexión hasta el siguiente día o hasta que quieras.

No es buena forma de hacerlo, nunca lo he probado pero creo que funcionaría, quizás le falten unas cosas, pero tampoco me parece mala idea, lo único que si la web es muy visitada puede pinzarse, aunque podrías borrar el archivo cada hora y si alguien se conecta mas de 20 veces en esa hora le deniegas conexión todo el día por ejemplo.

Edito: me quedo con la de ivancea.

Saludos.
618  Programación / Desarrollo Web / Recoger cookie de javascript con cliente en: 9 Noviembre 2014, 12:50 pm
Hola, miren estoy intentando iniciar sesión en una página web (si están interesados mandanme un privado les invito a intentarlo), lo que ocurre es que accedo al directorio login y envío un POST con las variables usuario y pass, vale luego recibo que me redirige a la página principal, hago una petición a la principal con las nuevas cookies y parece que recojo el html de la principal (osea que para eso podía haber hecho solo un POST a la principal y recoger datos luego inútil).

El problema es que no soy capaz de iniciar sesión, he probado con firefox y LIVE HEADERS para ver como inicia sesión y al parecer le ocurre algo parecido los 2 primeros pasos iguales luego firefox comienza a descargar archivos, imagenes etc (cosas que yo no necesito).

Tras muuchos POST de firefox, acaba recibiendo la cookie mágica JESSISID=293jf9239ur por ejemplo, ¿cómo puedo consguirla?, ¿cómo funciona esto de los javascript y como puedo interpretarlos en mi cliente que inicia sesión?.

Pues los js creo que son usados para cargar cookies, creo que lo que tengo que hacer es ir probando POST (pero a que páginas porque del index no salgo), y al recoger su HTML ¿debería proceder a buscar el javascript de las cookies? Y cuando recoja esa cadena como debería interpretarla, es un script en otro lenguaje.

En fin, orientadme un poco con esto si podéis, ¿como haríais vosotros para iniciar sesión en una pagína y mantener esa sesión usando HTTP evidentemente? gracias.
619  Programación / Programación C/C++ / Re: Problemas al recibir respuesta web iniciando sesión cpp en: 29 Octubre 2014, 00:50 am
Bueno bueno gente ya casi lo tengo he estado probando y he conseguido al descomprimir el gz que esta vez SI tiene el mismo tamaño del content-length una vez eliminada la cabecera:

Código:
<!DOCTYPE html>
<

El código empleado fue el siguiente, aunque el borrar la cabecera es manual (bloc de notas), lo que pasa es que al usar luego el gz me dice que el archivo está corrompido.

Código:
void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in directorio;
char datos[30000], cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "\r\n\r\n");

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");

int recibido = 0, i, j;
char trozo[512];

FILE *binario;
binario = fopen("binario.gz", "ab");

while (1)
{
memset(trozo, 0, 512);
if ((recibido = recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
for (i = 0; i < recibido; i++)
{
fwrite(&trozo[i], sizeof(char), 1, binario);
}
strcat_s(datos, trozo);
}
}
fclose(binario);
closesocket(sock);

//BORRARLE LA CABECERA Y LLAMAR A 7-ZIP.
//PARA DESCOMPRIMIRLO LO MEJOR LLAMAR A 7-ZIP
ofstream cookiez("cookies.txt");
int tam = strlen(datos);
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
cookiez << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
cookiez.close();
               ....................
system("pause");
}
}

He aislado los bytes, lo que hace el código es guardar todos los bytes que reciben los recv() en el archivo, y luego voy al archivo, elimino la cabecera con el bloc de notas y al descomprimir con el 7-zip me dice que esta corrompido y no me deja, ¿qué puede ser? el archivo  sin cabecera es del mismo tamaño que el content-length para mi sorpresa, entonces? Gracias.

Quizás eso de deflate tenga algo que ver pero aunque lo mande en el cliente o no la respuesta del server es gzip no gzip, deflate. Elige mandarmelo en gzip asi que sigo sin saberlo xp

Buenas noches.
620  Programación / Programación C/C++ / Re: Problemas al recibir respuesta web iniciando sesión cpp en: 27 Octubre 2014, 14:27 pm
Bueno eferion gracias por la respuesta, la verdad tienes algo de razón en lo del foro que me paso a preguntar dudas concretas pero tampoco es eso, siempre he estado y estoy dispuesto a ayudar en algo a los que me ayuden en base a mis conocimientos. Y de vez en cuando trato de aportar, pero si vine fue más por aprender que otra cosa y os lo agradezco.

La verdad me surgen varios proyectos, trato de afrontarlos y me surgen dudas que posteo y busco como solucionar por google, si me conocía la función strcmp() xD, y busque antes de leer tu respuesta homólogos a la función recv() pues pensé que podía ser parte del problema.

Si me leo las funciones de mí código lo único que puedo desconocer (o debería) es la cabecera HTTP en lo que soy "nuevo", he visto tu link y era justo lo que necesitaba gracias, de todas formas intentaré dejar de preguntar de forma tan directa las dudas sin ir antes a sus alrededores.

Te agradezco la respuesta, cuando tenga tiempo trataré de arreglar lo de gzip y volveré con el code funcionando xD, o eso espero jaja espero no se haga tarde.

Saludos.



Bueno, el documento me ha venido bastante bien había muchas cosas que devolvía el server y ahora veo que todas tienen respuesta en el documento. La verdad queda buen libro por leer poco a poco.

Me he dado cuenta de que recv() recoge 1010 bytes (lo obtenido al recoger el valor devuelto por la función) pero sin embargo el content-length es de 23000 aprox), a parte de eso he probado a separar la parte de cabecera del body (lo binario si no me equivoco) traté de usar fwrite dentro de un for pero desconozco el tamaño del body pues si recojo 1010 bytes incluido los de cabecera, no puedo hacer un bucle de for sin conocer los limites segun el condent-length hasta 23000, aun asi es muy raro porque es una mezcla de caracteres y bytes lo que manda, la cabecera caracteres, el body bits supongo, mi idea era guardar los datos binarios en un archivo y guardarlo como .gzip, y tratar de abrirlo con winrar o algo así no he encontrado documentación de como descomprimirlo ni como extraer la parte binaria. Y el winrar falló en un par de intentos mal hechos reconozco.

Pero la idea sería desencriptarlo en el programa mismo en ejecución (será mejor no? xd), de todas formas algo falla porque en mi post mando accept-encoding se supone que el habrá mandado previamente content-encoding: gzip, y yo luego lo acepto pero no soy yo el primero que envía me gustaría evitar todos estos líos y hacer que me mande el html sin cifrar en texto plano, quizás sea posible o quizás el server no tenga la opción.

He probado a no poner el accept-encoding y me dice haber recibido el recv 865 y al mostrarlo no sale nada hay un vacío. No sé es un poco lioso, cuando tenga tiempo le doy otro repaso, pero faltan cosas xd, no puede ser que diga que manda 23000 y que reciba yo 1010, no sé de donde me complico tanto para descaragr un html de una web que es publico xD pensaba que era más fácil o me complico yo o la web es especial.

Pues nada parece que el server esta empeñado en comprimirlo en gzip para mi desgracia, con el campo o sin el, el server lo devuelve cifrado si queréis hacer la prueba os invito a un privado  ::) ::)

el código que uso actualmente con la ilusión de obtener en una variable un html es:

Código
  1. void descarga_foros()
  2. {
  3. WSADATA wsa;
  4. SOCKET sock;
  5. unsigned short tamaño;
  6. struct sockaddr_in directorio;
  7. char datos[30000], auxiliar[50];
  8. char cookie[1000];
  9.  
  10. WSAStartup(MAKEWORD(2, 0), &wsa);
  11. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  12. {
  13. printf("Se ha producido un error al inicializar el socket.");
  14. exit(0);
  15. }
  16. else
  17. {
  18. directorio.sin_family = AF_INET;
  19. directorio.sin_port = htons(PUERTO);
  20. directorio.sin_addr.s_addr = inet_addr(IP);
  21.  
  22. strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
  23. strcat_s(datos, "Host: dominio.com\r\n");
  24. strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
  25. strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
  26. strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
  27. strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
  28. strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
  29. while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
  30. {
  31. strcat_s(datos, "Cookie: ");
  32. strcat_s(datos, cookie);
  33. strcat_s(datos, "\r\n");
  34. }
  35. strcat_s(datos, "Connection: keep-alive\r\n");
  36. strcat_s(datos, "Cache-Control: max-age=0\r\n");
  37. strcat_s(datos, "\r\n\r\n");
  38. cookies.close();
  39.  
  40. connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
  41. send(sock, datos, strlen(datos), 0);
  42. printf("%s", datos);
  43. strcpy_s(datos, "");
  44. printf("Recibo: %d bytes",recv(sock, datos, 27500, 0));
  45. closesocket(sock);
  46. printf("%s", datos);
  47.  

He quitado lo de cookies porque no vale para nada en esta funcion la verdad, solo he dejado la parte que las guarda las que devuelve el server para continuar con las peticiones.

Procederéa programar con el fwrite() cuando conozca porque recv recibe 1010 bytes y el lenght del server pone 23000, luego supongo que tendré que crear un fichero binario, mover el puntero en la cadena recibida (que ahora es mixta de caracteres y bytes) y no se muy bien como haré eso pero luego haría bucle for hasta el final para ir escribiendo byte a byte en el archivo .gz o .gzip.

Código
  1. for(i=(posicion donde empieza lo binario); i<strlen(datos); i++)
  2. {
  3. fwrite(datos,sizeof(byte),sizeof(byte),archivo);
  4. }
  5.  

Código
  1. fwrite(datos,sizeof(byte),tamaño_body_en_bytes(content-length),archivo);
  2.  

Nunca he trabajado con una cadena con datos de caracteres y otro binarios si podéis echarme un cable se agradece xd. Me fío mas de la ultima, segun esto, el content-length devuelve los bytes del body, entonces la pregunta sería como mover el puntero, los caracteres en binario con caracteres, la idea sería mover el puntero al inicio del body y alli meter el fwrite, pero como es eso posible? estoy pensando en ello. Gracias de nuevo.

También esta la dificultad de que recv() devuelve 1010 bytes mientras que el server dice mandar 23000 eso tambien me pregunto porque será, seguro vosotros sabéis mucho más de esto y quizás no os importe echarme una mano, ya sabéis que soy persistente xD me enfoco en algo y no puedo parar.

Y luego me mirare esto con detalle

Saludos.



Vaya he estado buscando como descomprimir archivos.gz (gzip), parecía bastante más sencillo, he encontrado 2 páginas:

http://www.boost.org/doc/libs/1_36_0/libs/iostreams/doc/classes/gzip.htmlhttp://www.zlib.net/

He probado con un ejemplo:

Código:
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main()
{
    using namespace std;

    ifstream file("hello.gz", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(gzip_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}

Pero a pesar de que aquí te deja seleccionar las librerías y sus derivados, SOLO quería preguntar si funcionaría añadir ese código, os cuento en archivos de cabecera del proyecto añadí esos 3 encabezados metiendolos dentro de los directorios (que no se si sería necesario lo dudo pero da igual), y cada uno de ellos tiene otras 10 dependencias más y esas otras 10 y blablabla, entonces como que ese no es el camino.

¿Alguien sabe como poder utilizar esas herramientas en el proyecto? También me descarge Zlib-1.2.8 pero no se como añadirlo/incluirlo al proyecto, pero de lo único que hay ejemplos es de la anterior, me pregunto como se podrá añadir, sino solo se me ocurre usar 7-zip pues ya llevo mucho tiempo buscando como poder hacerlo y nada, ademas aún no he conseguido aislar el body que devuelve el server.
Tampoco tenía sentido porque recibía 1010 y el body decía ser de 23000 ¿que es eso?

No tiene sentido, he trabajado con archivos binarios antes y al simple hecho de abrirlos con el bloc de notas podias observar que los caracteres se mantenian vale, pero el código binario (el cifrado tbn) salia de esta forma (/"%$("&/$))("Y (N() por ejemplo no þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ esto sale porque todos los bytes representan lo mismo el que no se? recv recibe una cadena, he probado a escribirla en un archivo inutilmente.

Código:
printf("Recibo: %d bytes",recv(sock, datos, 27500, 0));

FILE *fp;
fp = fopen("bin.gz", "wb");
fwrite(datos, sizeof(byte), sizeof(datos), fp);
fclose(fp);

¿Alguien sabe algun algoritmo para aislar el body (que esta comprimido en binario) de lo demás?
Es que es imposible el content-length no encaja con lo que recoje recv y recv lo recoge en una variable suficientemente grande, de tipo char * como indica la funcion, ahora me dicen que esa funcion recoge datos binarios comprimidos?.
PFF



Bueno aquí estoy de nuevo, miren mi nuevo código para descargar el html de la web:

Código:
void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in directorio;
char datos[30000], cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

ifstream cookies("cookies.txt");

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "Cookie: ");
strcat_s(datos, cookie);
strcat_s(datos, "\r\n");
}
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "\r\n\r\n");
cookies.close();

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");

clock_t tiempo = clock();
int recibido = 0;
char trozo[512];

while (1)
{
memset(trozo, 0, 512);
if ((clock() - tiempo) > 4000)
{
break;
}
else if ((recibido += recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
printf("%s", trozo);
strcat_s(datos, trozo);
}
}
closesocket(sock);
system("pause");
system("cls");
int tam = strlen(datos), i, j;
printf("\n\n\nrecibe %d\n\n", recibido);
printf("guardados %d\n\n", strlen(datos));
system("pause");
system("cls");
FILE *binario;
binario = fopen("binario.gz", "wb");
for (i = 0; i < tam; i++)
{
if ((datos[i] == '\r') &&
(datos[i + 1] == '\n') &&
(datos[i + 2] == '\r') &&
(datos[i + 3] == '\n'))
{
for (j = i + 4; j < tam; j++)
{
fwrite(&datos[j], sizeof(char), 1, binario);
printf("%c", datos[j]);
}
break;
}
}
fclose(binario);
system("pause");
//PARA DESCOMPRIMIRLO LO MEJOR LLAMAR A 7-ZIP
}
}

Bueno el content-length dice mandar 23000 pero yo solo soy capaz de recoger unos 11000 bytes, muevo el puntero por la cadena hasta llegar al body y alli empiezo a guardarlo en binario en el archivo .gz pero al usar 7-zip para descomprimirlo no tengo suerte no funciona de todas formas creo que no lo recibo todo, ¿que puede pasar? ¿sabéis algo? Muchas gracias.

He comprobado lo que guardo en el archivo y es justo lo que muestra el body que me manda el server es decir los bytes que recibo del body los estoy guardando en el gz y no los de cabecera, pero lo que digo, dice mandar 23000, recibo 12000 y guarda en la cadena con los strcat 11000 aprox se pierden muchos datos o que pasa?

alguna manera fiable de extraer todos los datos? Saludos.

Hola compañeros ya me he dado cuenta de donde surge la perdida de datos:

Código:
while (1)
{
memset(trozo, 0, 512);
/*if ((clock() - tiempo) > 4000)
{
break;
}*/
if ((recibido += recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
//printf("%s", trozo);
strcat_s(datos, trozo);
printf("%d recibido y guardado %d",recibido, strlen(datos));
system("pause");
}
}

Lo recibidoes mayor que lo guardado un byte ocuparía lo equivalente a un caracter.. mm pero bueno podría intentar escribirlo directamente en el archivo.. podría quizás.
Páginas: 1 ... 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [62] 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines