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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 77
111  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.
112  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.

113  Seguridad Informática / Análisis y Diseño de Malware / Re: [C++] Inyección de código en memoria- Aplicación crashea en: 8 Abril 2016, 20:39 pm
Bueno siento no haber respondido antes, pero estoy ocupado sin embargo he ido leyendo poco a poco los mensajes, y ahora he hecho un hueco para responder.

El código como dije funcionaba el codeblocks luego no era problema de código, iba a probar a compilarlo release, y buscar la función que se inyectaba aunque si bine la primera por tiempo, la segunda no tuve suerte.

He probado lo que decía pinkiepie de desactivar el RTC y ha funcionado a la primera. ¡BRAVOO!

Así que muchas gracias a todos, en especial a pinkiepie, bienvenido al foro que te has creado cuenta solo para responder parece XD, un abrazo.

Cuando tenga tiempo estudiaré a fondo el tema, y me pondré con hexadecimal y ollydbg.

Saludos.
114  Seguridad Informática / Análisis y Diseño de Malware / Re: [C++] Inyección de código en memoria- Aplicación crashea en: 7 Abril 2016, 17:26 pm
Bueno solucionado todavía no está, aunque si he confirmado que el problema tiene que ver con el compilador como suponía, luego el código está bien.

Ahora, creo que se puede solucionar de las siguientes maneras:

- Cargando el código a inyectar ya compilado en una variable e inyectar desde ella (no  me acaba de gustar, pero ahí esta).

- Cambiando de compilador, el compilador de visual studio creo que ofusca el código y es por eso que falla, con otro funcionaría. Pero aún así no se podrian usar crypters ni nada por el estilo con el ejecutable, ya que al acceder al código a inyectar si esta ofuscado no funcionaría (aunque dependería del crypter algunos si), y eso es buena **.

- Como tú dices abriendo el ejecutable con el ollydbg, pero si por cada vez que lo vuelvo a compilar o cada cambio que añado tengo que estar haciendo eso para que funcione y buscando las direcciones de memoria y tal, tampoco me parece un buen método, pero es lo que más me convence aunque ahora mismo no sabría como hacerlo.

El problema de la inyección de código es: ¿es compatible con crypters?.

Luego me pondré a mirar como va eso del ollydbg a ver si encuentro algo X"D

Saludos!.
115  Seguridad Informática / Análisis y Diseño de Malware / Re: [C++] Inyección de código en memoria- Aplicación crashea en: 7 Abril 2016, 12:39 pm
¿GetTargetThreadIDFromProcName?

¿Podrías poner el código completo e indicar que compilador estas usando?

saludos.

Hola fary, gracias por la respuesta.

GetTargetThreadIDFromProcName es GetPIDFromProcName que lo cambié el nombre para que fuera más sencillo, eso ha sido un fallo de edición, es simplemente una función que devuelve el PID de un proceso que le pasas como argumento. Es GetPIDFromProcName vamos XD.

El caso es el compilador y que no se como usar el debugger para pillar las direcciones de las funciones y en qué puede ayudarme a pesar de que he estado buscando sobre ello.

Uso visual studio 2013 (v120). El compilador es derivado de g++ es propio de VS.  Calculo el tamaño de la función con delimitandola con otra función static, pero ese método inestable para calcular el tamaño de la función dependiendo del compilador. Es probable que el mismo código funcione en codeblocks sin problemas. Pero en caso de ser eso lo que falle, ¿como puedo arreglarlo?, ¿dónde debería de inspeccionar?.

Seguiré probando más adelante con la versión release y otros compiladores, pero tengo que hacerlo con el de VS.

Un saludo.

Edito: Buenas acabo de probar el código en codeblocks y funciona sin problemas, codeblocks usa g++ y para C gcc si no mal recuerdo.  Luego no es problema del código, es del compilador.
116  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.
117  Seguridad Informática / Análisis y Diseño de Malware / Re: Dudas sobre API hooking en: 5 Abril 2016, 13:02 pm
Te he dado la respuesta desde que preguntaste la primera vez, pero no atendias. Una costumbre que no me extraña viniendo de tí.

Ahh vale me estabas dando la respuesta a la pregunta de 4 mensajes atrás tras citarme la del mensaje anterior, ahora todo tiene sentido...
118  Seguridad Informática / Análisis y Diseño de Malware / Re: Dudas sobre API hooking en: 5 Abril 2016, 10:40 am
NO, NO y mil veces mas NO. No tienes porque inyectar una DLL... inyectando código es suficiente.

Eso es lo que estoy preguntando, que si se puede hacer sin DLL, luego la respuesta es que sí.

¿Una por cada aplicación? ¿Se puede saber porque tienes que crear una por cada aplicación?
¿No te referirás a hacer un hook generico para todas las API?

No solo para una.

Si por ejemplo quieres hookear MessageBox de una aplicación y FindNextFile de otra. Si lo haces inyectando DLLs lo suyo sería hacer una para cada aplicación hookeando la API de cada una, también puedes hacer una sola que hookee una u otra dependiendo del proceso que la llame.

Saludos.
119  Seguridad Informática / Análisis y Diseño de Malware / Re: Dudas sobre API hooking en: 5 Abril 2016, 10:17 am
Te he dicho y te repito que se puede inyectar código en un proceso.

http://foro.elhacker.net/analisis_y_diseno_de_malware/inyecciones_de_codigo_en_memoria-t446557.0.html



Eso ya lo tengo bastante claro, y por supuesto no es a lo que me refiero.

Lo que haces en el hilo es cargar user32.dll en calc.exe y llamar a MessageBoxA desde calc.exe.

Y no, no es eso. Claro que puedes inyectar código, mi pregunta es si se puede hacer sin dll mediante otro método u artimaña.

Porque si queremos crear un hook para una aplicación, deberemos inyectarnos en ella como DLL para poder ejecutar los hooks a sus APIs.

Y como ya dije anteriormente... es costoso porque habría que crear una DLL por cada aplicación a hookear.

120  Seguridad Informática / Análisis y Diseño de Malware / Re: Dudas sobre API hooking en: 5 Abril 2016, 09:46 am
Inyectar código de una dll no sería viable ya que las direcciones en el código no se reubican. Lee el artículo y lo vas a comprender el por qué.

Buenas, a lo que me refería era a pasar el codigo compilado de la DLL con el hook a la API en hexadecimal, y en ejecución a crear un archivo .dll pasando los valores hexadecimales a bytes, en ese caso ya tendríamos el archivo dll y lo podríamos inyectar.

Me he leído tu POST, y no logro comprender pues allí haces un hook a MessageBoxA (una función de la API que no hookeas), inyectando la DLL de User32 que seguramente se encontraría en  el IPC de los programas a los que inyectas.

El caso es, en tu ejemplo les haces cargar una DLL que ya tiene el sistema, no tu propia DLL que contiene las funciones que hookearán la API del programa, por lo tanto es distinto.

Por ejemplo puedo hacer que cualquier programa ejecute lo que quiera haciendole una inyección de DLL, esa DLL puede ser de la API y cargarla y ejecutar sus funciones con los parámetros de la API, O lo que quiero hacer cargar mi propia DLL que no tiene que ver con la de la API inyectarla en proceso y que al hacer el ATTACH hookee una función de la API de ese programa haciendo que haga lo que quiera. Lo que digo se puede hacer y ya lo he probado, lo que me refería era a si puede hacerse sin pasar la DLL, es decir API hooking sin DLL, mediante alguna artimaña para así no estar creando un archivo DLL por cada hook y hacerlo directamente todo desde el ejecutable.

https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fd706e03-9385-4d39-ac0f-1076dc282df2/hooking-api-functions-without-dll-c?forum=windowsgeneraldevelopmentissues

Saludos.

Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 77
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines