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

 

 


Tema destacado:


  Mostrar Temas
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
21  Programación / Programación General / Regex para matchear todas las urls en: 22 Mayo 2016, 17:03 pm
Código
  1. (https://[\w\d:#@%/;$()~_?\+-=\\\.&]*)
  2.  

No hay manera solo matchea la primera url, he probado con todo.

Saludos.

Edito: Da igual ya no lo necesito, encontré resolver el problema con el mismo regex, cambiando las funciones que usaba:

Código
  1. for (auto it = std::sregex_iterator(data.begin(), data.end(), urlExpression); it != std::sregex_iterator(); ++it)
  2. {
  3. std::string url = it->str();
  4. url = std::regex_replace(url, std::regex("https://"), "http://", std::regex_constants::format_first_only);
  5. url = std::regex_replace(url, std::regex("&"), "&");
  6. URLMonitor::GetInstance()->AddSecureLink(mClientIP, url);
  7. }
  8.  

Precioso.
22  Programación / Programación C/C++ / Mejor manera de programar una subrutina en C++ en: 20 Mayo 2016, 12:56 pm
Siguiendo como funcionan las clases en python, sabemos que una clase en python tiene sus atributos propios (self.*) y sus métodos que pueden ser accesibles desde dentro o fuera, pero además tiene un método __init() que se ejecuta automáticamente al llamar a la clase.

Así pues si queremos un thread que realice una determinada tarea este método es muy eficaz, por ejemplo para hacer ARP spoofing, debemos de trabajar con listas de hosts, funciones que afectan sobre ellos, y luego tenemos que permitir acceso externo para poder detenerlo o reiniciarlo.

Así pues creo este hilo para buscar cual es la mejor forma de programar esas subrutinas o módulos que están formados por funciones estáticas, atributos propios, y luego funciones externas que hacen de wrapper de los anteriores para poder controlar el funcionamiento de la subrutina desde otra parte del código externa.

Y bien ¿qué ideas se me han ocurrido?, me gustaría ver cuáles se os ocurrirían a vosotros y debatirlo hasta encontrar la manera más eficaz. La idea es no dar visibilidad en partes donde no se necesita, proteger el código.

1. Crear un namespace, con funciones que hacen de wrapper y pueden ser llamadas por terceros para controlar la subrutina. Y declarar las funciones correspondientes a la subrutina como static fuera del namespace.

spoofing.h

Código
  1. namespace Spoofing
  2. {
  3. Init();
  4. Restart();
  5. Uninit();
  6. };
  7.  
  8. void EscanearRed();
  9. void RealizarSpoofing();
  10. ...
  11.  

spoofing.cpp

Código
  1.  
  2. static BOOL * run = new BOOL();
  3.  
  4. Spoofing::Init()
  5. {
  6.     *run = TRUE;
  7.     hosts
  8.     param1, param2
  9.     //declaramos aqui todas las variables de la subrutina, la lista de hosts...
  10.     //y las inicializamos con las funciones static.
  11.     while(*run)
  12.     {
  13.     EscanerRed();
  14.     if(hosts)
  15.          thread spoof(RealizarSpoofing, param1, param2);...
  16.     }
  17.     ...
  18. }
  19.  
  20. Spoofing::Uninit()
  21. {
  22.     *run = FALSE;
  23. }
  24.  
  25. ...
  26.  
  27. static void EscanearRed(para1, param2)
  28. {
  29.      if(*run)
  30.          ...
  31. }
  32. static void RealizarSpoofing()
  33. {
  34.      while(*run)
  35.          ...
  36. }
  37.  

Utilizo una variable booleana para detener los subthreads que genera la subrutina. De esta manera controlo la subrutina desde el namespace. Al incluir al main.cpp la cabecera spoofing.h no tiene visibilidad a funciones que no son del namespace, no tiene acceso a datos que no le interesan.

Lo malo que hay que pasar parametros del namespace a las funciones static, ¿sería mejor declarar todas las variables fuera de Init() para así  no tener que estar pasandolas como argumento de una funcion a otra?, como ocurre con el BOOL* que gracias a que esta fuera no es necesario pasarlo entre funciones.

2. Crear una clase con todos los atributos, ponerla un método Init(), Uninit(), Restart(). Un constructor que inicialice a NULL los atributos, y tras instanciar la clase pasar a llamar a Init(), Uninit(), etc. Lo malo de esto sería que esa clase para poderla usar desde fuera habría que pasar su dirección de memoria. Por ejemplo si en el main.cpp la instanciamos y llamamos a Init(), y luego en archivox.cpp queremos llamar a Uninit(), debemos de pasarle la dirección de la clase instanciada.

También puede tener funciones estáticas.

De momento pongo estos 2 que son los que más me han hecho dudar, y sí también se puede poner todo con funciones staticas, pero ya que es C++ vamos a aprovechar los namespaces y las clases.

Agradecería críticas constructivas

¿Cual creéis que es la mejor? ¿y cuál usaríais vosotros?.

Saludos!!.

23  Programación / Programación C/C++ / ¿Alguien ha conseguido compilar Curl? [Solucionado] en: 18 Mayo 2016, 20:10 pm
Bueno, me descargue el código de la página pero como sabeis tiene varias dependencias, y sus dependencias tienen dependencias, y dan errores, y no tuve manera de compilar ni zlib como para compilar curl.

Es por eso que acudí en la propia página a compilaciones hechas por terceros:

https://curl.haxx.se/download.html#Win32

Están ya por la versión 7.49 y la última compilación corresponde a la 7.40 y es la única que tiene las librerías, que tienen vulnerabilidades, pero mejor que nada por supuesto :X

¿Alguien ha conseguido compilarlo alguna vez, consejos? ¿dónde puedo encontrar su última compilación?, bueno mientras, iré pasando los .a a .lib a ver si encuentro la forma y así puedo usar las librerías estáticas..

Un saludo!


Edito: He intentado crear la .lib a partir de libcurl.a y libcurl.def así como con libssh2.a y libssh2.def, y he conseguido crear las ambas en .lib a partir del comando pero su contenido está mal construido, explico:

Primero abro el command prompt de MVS:

http://stackoverflow.com/questions/21476588/where-is-developer-command-prompt-for-vs2013

Una vez allí he intentado generar las librerías estáticas .lib con los .a y sus archivos .def, accediendo al directorio "lib" donde están archivos .a y .def Con el comando:

Citar
lib /machine:i386 /def:libcurl.def
lib /machine:i386 /def:libssh2.def

Esto me crea libcurl.lib y libssh2.lib y sus .exp.

Sin embargo el .lib que me crea no tiene sentido ocupa 42kb mientras que el libcurl.a y libcurl.dll ocupan 660 kbs. Luego normal que al añadirle al proyecto me muestre mensaje de error diciendo que libcurl.dll no está en el equipo.

Creo un proyecto para C++ incluyo cabeceras, directorios de librerías (el "lib") y añado que quiero añadir las librerias libcurl.lib y libssh2.lib.

Compilo sin error un programa que usa libcurl, al ejecutar muestra error "el programa no puede iniciarse porue falta libcurl.dll en el equipo..".

¿?¿? ¿Cómo genero correctamente el .lib a partir del .a?

http://stackoverflow.com/questions/9346054/convert-from-mingw-a-to-vc-lib

Esto me genera un .lib de 42 kbs XD, también es cierto que hay más .a que tienen que ver tanto con libcurl como con libssh2. libcrypt.a libcurl.a lib....a y el libcurl.def pero el comando "lib" debería de valer igualmente, que ocurre.

Saludos sigo mirando.

Los .a son librerías estáticas de mingw, funcionan para codeblocks pero para VS no que usa .lib. Con el MVS command prompt siguiendo el tutorial unos dicen que se puede hacer otros no, yo lo he probado y ese fue el resultado.

http://stackoverflow.com/questions/5965171/what-is-a-file-with-extension-a

Vuelve edicion delicatesse:
http://stackoverflow.com/questions/20171165/getting-libcurl-to-work-with-visual-studio-2013
Lo he conseguido hacer compilar con nmake como pone en el ultimo link, sin embargo me aparece que simbolos externos no resueltos, he añadido los objet file al debug¿? y sigue igual, ¿porque no los reconoce?, en ello.

Solucionado esto ultimo también habia que añadir al preprocesador CURL_STATICLIB, ahora compila con la librería buena, PERO al ejecutar un codigo de prueba obtengo error en ejecucion debug assetion failed.., en ello.

Código
  1. CURL *curl;
  2. CURLcode res;
  3.  
  4. curl = curl_easy_init();
  5. if (curl) {
  6. /* First set the URL that is about to receive our POST. This URL can
  7. just as well be a https:// URL if that is what should receive the
  8. data. */
  9. curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.co.uk");
  10.  
  11. /* Perform the request, res will get the return code */
  12. res = curl_easy_perform(curl);
  13.  
  14. /* always cleanup */
  15. curl_easy_cleanup(curl);
  16. }
  17. return 0;
  18.  

curl_easy_perform(curl); heap corruption ¿?, quizás falte una directiva de preprocesador? :/

Jiji, me pasa lo mismo que a este:

https://curl.haxx.se/mail/lib-2010-11/0244.html

FINAL DELICATESSE EDITION: POR FIN, TENGO CURL  7.48 RULANDO FINO.

El error se debía a que estaba usando el modo debug en vez de release, con release no sale el debug:

http://www.cplusplus.com/forum/windows/172335/

Saludos  XDD

PD: me encantan los hilos que abro y me voy respondiendo a mi mismo hasta resolverlos ^^

Lo unico a ver si encuentro manera de poderlo usar en modo debug.
24  Foros Generales / Foro Libre / The Cove - Documental ganador de un oscar en: 22 Abril 2016, 22:41 pm
Hola a todos, he estado viendo este documental y aunque es de 2009 lo he visto ahora y me paso por aquí para recomendároslo pues seguro que muchos no lo habéis visto y quizás os interese.

Trata de la historia de unos activistas que viajan a Taiji (Japón) para hacer constar al mundo la caza anual de delfines que allí se produce.

Muy recomendable teniendo en cuenta que el proteagonista "Ric O'Barry" capturo en 1960 a 5 delfines para grabar "flipper", y se encargo de entrenarlos, pero pasados 10 años todo eso acabó y al morir Flipper en sus brazos, dio un cambio radical y se volvió activista durante los próximos 35 años liberando delfines en cautividad, y perdiendo a compañeros en su lucha, una persona con dos huevos.

No os cuento más XD, y os dejo el link:

https://www.youtube.com/watch?v=v3XNjrgReHU

Saludos.
25  Programación / Programación C/C++ / Problema removiendo clave de registro en: 15 Abril 2016, 15:53 pm
Código
  1. bool RemoveFromRegistry(bool privileges, LPCWSTR keyName)
  2. {
  3. HKEY hKeyOutput;
  4. HKEY hKeyInput;
  5. DWORD options;
  6. BOOL ret = FALSE;
  7.  
  8. hKeyInput = (privileges) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
  9. options = (arquitecturax64()) ? KEY_ALL_ACCESS | KEY_WOW64_64KEY : KEY_ALL_ACCESS | KEY_WOW64_32KEY;
  10.  
  11. if (RegOpenKeyEx(hKeyInput, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, options, &hKeyOutput) == NO_ERROR)
  12. {
  13. //options = (arquitecturax64()) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY;
  14. if (RegDeleteKeyEx(hKeyOutput, keyName, options, NULL) == NO_ERROR)
  15. {
  16. ret = TRUE;
  17. }
  18. RegCloseKey(hKeyInput);
  19. RegCloseKey(hKeyOutput);
  20. }
  21. return ret;
  22. }
  23.  

La clave esta creada y el nombre es el mismo que cuando la creé "pepito", el caso que cuando la voy a eliminar falla el RegDeleteKeyEx y no se porqué, ¿qué puedo estar haciendo mal?.

Saludos.
26  Seguridad Informática / Análisis y Diseño de Malware / Inyección de código de función void. en: 13 Abril 2016, 09:30 am
Buenas, pues quería hacer una inyección de código de una función tal cual en otra aplicación, me refiero a inyectar una función con una declaración:

Código
  1. static void HookFFRequest(void){
  2. MessageBox(NULL, "hola", NULL, NULL);
  3. }

Y luego al inyectar reservar memoria y escribir en ella solo una vez, en vez de dos ya que no queremos pasar parámetros a la función.

Código
  1. VirtualAllocEx(process, NULL, parametersSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  2. WriteProcessMemory(process, DataAddress, parameters, parametersSize, NULL);
  3. CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)MyFuncAddress, NULL, 0, NULL);

Sin embargo da error ¿por qué?. También he probado a inyectar pasandole de parámetro solo el modulo que devuelve GetProcAddress:

Código
  1. DWORD module = (DWORD)GetProcAddress(hhUserModule, "MessageBox");

Y tampoco ha funcionado, ¿solo funciona si le paso todos los parámetros de la función a la que llamo?, no veo que tenga sentido hacerlo.

La idea es hacer un hook, por lo tanto la función del código que debo inyectar no tiene que llevar parámetros. Y la función sería simple código que ejecutara el hook haciendo override a la función original.

Código
  1.  
  2. typedef int (WINAPI* MsgBoxParam)(HWND, LPCSTR, LPCSTR, UINT);
  3.  
  4. struct PARAMETERS
  5. {
  6. DWORD module;
  7. char text[50];
  8. char caption[25];
  9. int buttons;
  10. //HWND handle;
  11. };
  12.  
  13. static DWORD WINAPI HookFFRequest(DWORD *module)// PARAMETERS *param)
  14. {
  15. MsgBoxParam m = (MsgBoxParam)*module;
  16. m(NULL, "HELLO", NULL, NULL);
  17.  
  18. /*MsgBoxParam MsgBox = (MsgBoxParam)param->module;
  19. int result = MsgBox(0, param->text, param->caption, param->buttons);
  20. switch (result){
  21. case IDOK:
  22. //code
  23. break;
  24. case IDCANCEL:
  25. //code
  26. break;
  27. }*/
  28. return 0;
  29. }
  30.  

Al inyectar HookFFRequest sin parámetros o con solo el módulo no funciona, sin embargo si le paso todos los parámetros si lo hace, ¿eso es que estoy haciendo mal la inyección, no?. ¿No puedo ejecutar esa función sin pasarla nada y hacer un MessageBox directamente?.

¿porque inyectar función y luego parametros de función y luego llamar función, pudiendo inyectar solo función poniendola ahí ya los parámetros que queramos y así inyectamos solo una vez?.


Saludos, ahí voy probando.

27  Seguridad Informática / Análisis y Diseño de Malware / [C++] Inyección de código en memoria- Aplicación crashea en: 6 Abril 2016, 18:58 pm
Hola buenas, hace pocos días estuve leyendo sobre el API hooking y de allí salté a la inyección de DLL, y más adelante pasé a la inyección de código, y ayudándome con un código que encontré en rohitab fuí dando forma a mi código y puse control de errores. Este es el link por si a alguien le interesa, me fue muy útil:

http://www.rohitab.com/discuss/topic/39357-code-cave-injection-tutorial-c/

El programa inyecta un MessageBox en la aplicación objetivo, tras salir el MessageBox y pulsar aceptar se cierra la aplicación objetivo. Desconozco el porqué, os dejo el código a ver si me podéis ayudar a saber:

Código
  1. #pragma once
  2. #include <windows.h>
  3. #include <shlobj.h>
  4. #include <wininet.h>
  5. #include <tlhelp32.h>
  6. #include <shlwapi.h>
  7.  
  8. typedef int (WINAPI* MsgBoxParam)(HWND, LPCSTR, LPCSTR, UINT);
  9. using namespace std;
  10.  
  11. struct PARAMETERS{
  12. DWORD MessageBoxInj;
  13. char text[50];
  14. char caption[25];
  15. int buttons;
  16. //HWND handle;
  17. };
  18.  
  19. DWORD GetPIDFromProcName(LPCWSTR procName);
  20. DWORD MyFunc(PARAMETERS * myparam);
  21. DWORD Useless();
  22. bool Injecter();
  23.  
  24. DWORD GetPIDFromProcName(LPCWSTR procName)
  25. {
  26. PROCESSENTRY32 pe;
  27. HANDLE thSnapShot;
  28. BOOL retval;
  29.  
  30. thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  31.  
  32. if (thSnapShot == INVALID_HANDLE_VALUE)
  33. {
  34. return 0;
  35. }
  36.  
  37. pe.dwSize = sizeof(PROCESSENTRY32);
  38.  
  39. retval = Process32First(thSnapShot, &pe);
  40.  
  41. while (retval)
  42. {
  43. if (!lstrcmp(pe.szExeFile, procName))
  44. {
  45. return pe.th32ProcessID;
  46. }
  47. retval = Process32Next(thSnapShot, &pe);
  48. }
  49.  
  50. return 0;
  51. }
  52.  
  53. static DWORD MyFunc(PARAMETERS * myparam){
  54. MsgBoxParam MsgBox = (MsgBoxParam)myparam->MessageBoxInj;
  55. int result = MsgBox(0, myparam->text, myparam->caption, myparam->buttons);
  56. switch (result){
  57. case IDOK:
  58.                //code
  59. break;
  60. case IDCANCEL:
  61. //code
  62. break;
  63. }
  64. return 0;
  65. }
  66.  
  67. static DWORD useless(){
  68. return 0;
  69. }
  70.  
  71. //debe ser static para que el compilador las ponga juntas y calcule bien el tamaño :)
  72. bool Injecter()
  73. {
  74.  
  75. HANDLE proc = NULL;
  76. DWORD pID = NULL;
  77.  
  78. if ((pID = GetPIDFromProcName(L"chrome.exe")) == NULL)// no GetTargetThreadIDFromProcName ^^
  79. {
  80. return false;
  81. }
  82.  
  83. if ((proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID)) == NULL)
  84. {
  85. return false;
  86. }
  87.  
  88. char * mytext = "Hello by CodeCave!";
  89. char * mycaption = "Injection result";
  90.  
  91. PARAMETERS data;   //let's fill in a PARAMETERS struct
  92.  
  93. HINSTANCE hUserModule = LoadLibraryA("user32.dll");
  94.  
  95. if (hUserModule == NULL)
  96. {
  97. CloseHandle(proc);
  98. return false;
  99. }
  100.  
  101. data.MessageBoxInj = (DWORD)GetProcAddress(hUserModule, "MessageBoxA");
  102. strcpy(data.text, mytext);
  103. strcpy(data.caption, mycaption);
  104. data.buttons = MB_OKCANCEL | MB_ICONQUESTION;
  105.  
  106. DWORD_PTR size_myFunc = (DWORD_PTR)((LPBYTE)useless - (LPBYTE)MyFunc);
  107.  
  108. LPVOID MyFuncAddress = NULL;
  109.  
  110. if ((MyFuncAddress = VirtualAllocEx(proc, NULL, size_myFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE)) == NULL)
  111. {
  112. CloseHandle(proc);
  113. return false;
  114. }
  115.  
  116. if (WriteProcessMemory(proc, MyFuncAddress, (LPVOID)MyFunc, size_myFunc, NULL) == NULL)
  117. {
  118. VirtualFree(MyFuncAddress, 0, MEM_RELEASE);
  119. CloseHandle(proc);
  120. return false;
  121. }
  122.  
  123. LPVOID DataAddress = NULL;
  124.  
  125. if ((DataAddress = VirtualAllocEx(proc, NULL, sizeof(PARAMETERS), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL)
  126. {
  127. CloseHandle(proc);
  128. return false;
  129. }
  130.  
  131. if (WriteProcessMemory(proc, DataAddress, (LPVOID)&data, sizeof(PARAMETERS), NULL) == NULL)
  132. {
  133. VirtualFree(MyFuncAddress, 0, MEM_RELEASE);
  134. VirtualFree(DataAddress, 0, MEM_RELEASE);
  135. CloseHandle(proc);
  136. return false;
  137. }
  138.  
  139. HANDLE thread = NULL;
  140.  
  141. if ((thread = CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)MyFuncAddress, DataAddress, 0, NULL)) == NULL)
  142. {
  143. VirtualFree(MyFuncAddress, 0, MEM_RELEASE);
  144. VirtualFree(DataAddress, 0, MEM_RELEASE);
  145. CloseHandle(proc);
  146. return false;
  147. }
  148.  
  149. WaitForSingleObject(thread, INFINITE);
  150. VirtualFree(MyFuncAddress, 0, MEM_RELEASE);
  151. VirtualFree(DataAddress, 0, MEM_RELEASE);
  152. CloseHandle(thread);
  153. CloseHandle(proc);
  154. cout << "Injection completed!" << endl;
  155.  
  156. return true;
  157. }
  158.  
  159.  

Al ejecutar el programa ejecuta todo sin errore y muestra "Injection completed!", pero al cerrar el MessageBox que invoco el la aplicación a la que inyecto esta se me cierra también.

Creo que se debe al calculo del tamaño de la función a inyectar, quizás dependiendo de un compilador pueda variar el resultado.

Saludos y gracias.
28  Seguridad Informática / Análisis y Diseño de Malware / Dudas sobre API hooking en: 4 Abril 2016, 15:09 pm
Hola a todos, resulta que ayer estuve leyendo sobre este método un buen rato, pero sin embargo hay algo que no logro comprender.

Si bien he conseguido hookear una función para que haga lo que yo quiera (En este caso MessageBoxW), el hook no va más allá de mi aplicación, el hook solo me afecta a mi.

Ya que abro otro programa que ejecuta MessageBoxW y no muestra el mensaje del hook.

Luego ¿para que vale esto si solo afecta a nuestro propio programa, o que paso por alto?.

Continue leyendo este tutorial, que esta muy bien y seguro que todos lo habréis leido:

http://www.codeproject.com/Articles/2082/API-hooking-revealed

Y bueno para ejecutar codigo en otro proceso necesitamos inyectar una DLL al proceso del que queremos manipular una función. Para inyectar una DLL con nuestro código si el proceso al que queremos inyectarla usa User32.dll se puede modificar un registro para que cargue nuestra DLL, sino hay otros métodos...

Suponiendo que hemos conseguido que el programa objetivo cargue nuestra DLL, ahora ¿cómo podemos interceptar una función suya y manipularla?. No lo tengo claro, ¿acaso ahora la DLL debería de hookear la función en cuestión que queremos modificar y ahora ya funcionaría debido a que pertenece al mismo proceso?, ¿en eso consiste?, porque sno no veo claro la relación.

Ejemplo: Si queremos manipular HttpSendRequestW de InternetExplorer desde un proceso externo. Planteamiento: cargar nuestra DLL en iexplorer.exe y nuestra DLL tendría un hook para HttpSendRequestW que al ser ejecutada por iexplorer.exe hookearía la API ejecutando nuestro código en cada llamada a la función. ¿Consiste en eso o como?.

Es que estoy empezando a probar un poco de que va esto.

Saludos.

Puff acabo de inyectarme en chorme.exe y ha sido ORGASMICO, ahora voy a probar a manipular sus funciones con algún hook a una de sus funciones.  A ver si se puede.
29  Comunicaciones / Redes / Duda sobre HTTP y P2P en: 29 Marzo 2016, 17:13 pm
Buenas, me estaba preguntando si es posible a través de un servidor HTTP enlazar dos ordenadores
entre si a través de el, ya que el actuaría como tracker.

La idea no se si funcionaría pero sería que los 2 ordenadores se conectasen a un servidor HTTP y que le manden su puerto, ip pública, e ip privada. Entonces lanzarían peticiones HTTP el uno al otro para comunicarse, también podría utilizar otros protocolos estáticos usando HTTP tunnel.
El único incomveniente que veo de primeras es que el puerto no sabremos cual sería el del cliente, pues en cada petición HTTP el puerto es distinto y va subiendo de uno en uno, sin embargo al ser otra IP cambiará y no se me ocurre manera de predecir el puerto.

Pero necesito saber si es viable, y si funcionaría.

Si es que ambos ordenadores al lanzar connect y usar recv mutuamente sean capaces de conectarse el uno con el otro, la única diferencia con otros tracker sería que utilizarían el protocolo HTTP lo que permitiría pasar sobre el firewall y el router.

También quisiera saber si esto es gracias a una vulnerabilidad de la NAT como ocurre con un tracker TCP orientado a conexión, y a pesar de que he buscado no encuentro la diferencia entre un tracker TCP y UDP, aunque seguiré indagando en ello.

Pues me gustaría crear una P2P que use HTTP como protocolo de encapsulamiento. Por las ventajas que ofrece, ahora el problema es engañar al que sería el servidor, porque ambos ordenadores actuarían como cliente y servidor, ¿pero que puerto abro en el servidor?, y si lo abro tengo que hacer port fordwarding con el router, luego para engañarlo debe de actuar como cliente también.

La única manera que se me ocurre es que ambos lanzarán la peticion a la vez y que recibieran un ACK y que piensen que procede de un servidor y que ese servidor está respondiendo a su petición anterior, entonces este mandaría un ACK al otro diciendo que lo ha recibido el mensaje del otro:

Citar
A-SYN-B ---------------- B-SYN-A

A-ACK-B ---------------- B-ACK-A

A-REQUEST-B ---------------- B-RESPONSE-A

A-RESPONSE-B ---------------- B-REQUEST-A

No se si será posible, pero en la primera interacción cuando mandan los SYN ningún router dejaría pasar el paquete lo cortaría (la menos eso hacen la mayoría de las redes), sin embargo, si en el tracker ponemos una hora minuto y segundo concreta para que manden el SYN y el ACK a la vez, quizás pueda producirse la conexión, lo veo muy dificil, pero me gustaría escuchar más ideas y ver si sería viable.

Un saludo!

Edito: Bueno me pregunto si simplemente A conociendo la IP publica y privada de B, y B teniendo un puerto abierto escuchando que A conoce, si sería capaz A de conectar con B sin necesidad de que le llegue un ACK.. :P
30  Programación / Programación C/C++ / HTTP multipart/form-data no sube archivo correctamente. en: 21 Marzo 2016, 17:10 pm
Bueno, pues estoy tratando de subir un archivo a una página web, que corre un script PHP..

El caso que he probado de todas las maneras posibles sin éxito alguno, he probado a hacer POST enviando en una variable el nombre del archivo y en otra el contenido del archivo con application/x-www-form-urlencoded y recibía el nombre correctamente pero el contenido mal (los bytes del jpg), me conseguía crear el archivo en el servidor pero estaba corrupto, en el PHP simplemente habría el archivo con ese nombre y escribía el contenido en binario, pero ya os digo el archivo ocupaba 80kb y escribió solo 1,9kbs si no mal recuerdo.

También probé a usar lo mismo pero con application/octet-stream, y bueno en este caso tenía que cambiar el script PHP, pero no me interesó realmente y no le dí muchas vueltas a este método, porque quiero subirlo o bien con POST con  application/x-www-form-urlencoded o con POST con multipart/form-data.

Visto que el primero escribía el 2% del archivo como que lo dejé y pase a multipart/form-data.
Copiando os datos de firefox, analizando paquetes de firefox con los de mi aplicación, como suben ambos el archivo, y SON JODIDAMENTE IGUALES EL BODY SOLO OJO, pero uno lo sube y otro no.

Os dejo el código de la función que sube un archivo y del PHP.

Código
  1. <?php
  2. if($_FILES["archivo"]["name"]){    
  3.      if ($_FILES["archivo"]["error"] > 0) {
  4.        echo $_FILES["archivo"]["error"] . "<br/>";
  5.      } else {
  6.          if (file_exists("" . $_FILES["archivo"]["name"])) {
  7.            echo $_FILES["archivo"]["name"] . " ya existe. ";
  8.          } else {
  9.            move_uploaded_file($_FILES["archivo"]["tmp_name"],
  10.            "" . $_FILES["archivo"]["name"]);
  11.            echo "Archivo Subido <br />";
  12.          }
  13.      }
  14. }
  15. ?>
  16.  

Código
  1. bool tracker::SendFile(std::string _path)
  2. {
  3. HINTERNET hInternet;
  4.  
  5. if ((hInternet = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)) == NO_ERROR){
  6. return false;
  7. }
  8.  
  9. if ((hInternet = InternetConnectA(hInternet, domain.c_str(), INTERNET_DEFAULT_HTTP_PORT,
  10. NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) == NO_ERROR){
  11. InternetCloseHandle(hInternet);
  12. return false;
  13. }
  14.  
  15. DWORD requestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
  16. INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
  17. INTERNET_FLAG_KEEP_CONNECTION |
  18. INTERNET_FLAG_NO_AUTO_REDIRECT |
  19. INTERNET_FLAG_NO_COOKIES |
  20. INTERNET_FLAG_NO_CACHE_WRITE |
  21. INTERNET_FLAG_NO_UI |
  22. INTERNET_FLAG_RELOAD;
  23.  
  24. if ((hInternet = HttpOpenRequestA(hInternet,
  25. "POST",
  26. "/catcher.php",
  27. "HTTP/1.1",
  28. NULL, NULL,
  29. requestFlags, 0)) == NO_ERROR){
  30. InternetCloseHandle(hInternet);
  31. return false;
  32. }
  33.  
  34. std::ifstream reader("C:\\Users\\User\\Desktop\\ciclista.jpg", std::ifstream::ate | std::ifstream::binary);
  35. int size = reader.tellg();
  36. char* buffer = new char[size];
  37. reader.seekg(0, std::ios::beg);
  38. reader.read(buffer, size);
  39. reader.close();
  40.  
  41. std::string content;
  42. content = std::string(buffer, size);
  43. delete[] buffer;
  44.  
  45. std::string body;
  46. std::string boundary = "-----------------------------268991947030948";
  47.  
  48. /*Body*/
  49. body += boundary + "\r\n";
  50. body += "Content-Disposition: form-data; name=\"archivo\"; filename=\"ciclista.jpg\"\r\n";
  51. body += "Content-Type: image/jpeg\r\n\r\n";
  52. body += content + "\r\n";
  53. body += boundary + "\r\n";
  54. body += "Content-Disposition: form-data; name=\"boton\"\r\n\r\n";
  55. body += "Enviar archivo\r\n";
  56. body += boundary + "--\r\n";
  57.  
  58. /*Header*/
  59. std::string headers = "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n";
  60. HttpAddRequestHeadersA(hInternet, headers.c_str(), headers.length(), HTTP_ADDREQ_FLAG_ADD);
  61.  
  62. /*Body*/
  63. std::cout << body.substr(0, 600) << body.substr(body.length() - 200, 200);
  64. std::cout << body.length() << std::endl;
  65.  
  66. if (HttpSendRequestA(hInternet, NULL, 0, (LPVOID)body.c_str(), body.length()) == NO_ERROR){
  67. InternetCloseHandle(hInternet);
  68. return false;
  69. }
  70.  
  71. std::string response;
  72. DWORD dwBytes;
  73. char ch;
  74.  
  75. while (InternetReadFile(hInternet, &ch, 1, &dwBytes))
  76. {
  77. if (dwBytes != 1) break;
  78. response += ch;
  79. }
  80.  
  81. InternetCloseHandle(hInternet);
  82. std::cout << response;
  83. }
  84.  

Bueno me he vuelto loco comparando el contenido de los paquetes, y solo puede fallar la cabecera (luego a saber que será), pero el Content-Length es igual en firefox que en mi función, luego si cambia algo sería la cabecera que tiene HOST, CONTENT-LENGTH, CONTENT-TYPE, CONNECTION KEEP ALIVE, CACHE-CONTROL NO CACHE. Al acabar el header \r\n\r\n como siempre y mando el body, ahí está el código, cuando recibo la respuesta del server recibo solo el HTML sin el "se ha subido correctamente" o "ya existe". Pero no hay errores en el PHP.

¿Qué pasa?.

Saludos :X
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines