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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  No me funciona la inyección DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No me funciona la inyección DLL  (Leído 4,118 veces)
ApOkAlizE

Desconectado Desconectado

Mensajes: 150


¿sabes lo que vales? ¡consigue lo que te mereces!


Ver Perfil
No me funciona la inyección DLL
« en: 11 Diciembre 2011, 14:21 pm »

Bueno estoy intentando hacer una inyección DLL y en VC++ tengo esto.

#include <windows.h>
#include <Tlhelp32.h>
#include "iostream"
using namespace std;
void main()
{
HANDLE proceso;
LPVOID RemoteString;
LPVOID nLoadLibrary;
int pid;
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
while(Process32Next(handle, &procinfo))
{
if(!strcmp("procinfo.szExeFile", "calc.exe"))

{
CloseHandle(handle);
pid = procinfo.th32ProcessID;
cout << pid << endl;
system("pause");
}
}
CloseHandle(handle);
proceso = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
nLoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
RemoteString = (LPVOID)VirtualAllocEx(proceso,NULL,strlen("C:\\Users\\Ramonet\\Documents\\dll.dll"),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
WriteProcessMemory(proceso,(LPVOID)RemoteString,"C:\\Users\\Ramonet\\Documents\\dll.dll",strlen("C:\\Users\\Ramonet\\Documents\\dll.dll"),NULL);
CreateRemoteThread(proceso,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL,NULL);
CloseHandle(proceso);
}

Y en la dll que esta situada en Documents esto:


#include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
MessageBox (0, "aaa", "aa", 0);
}
return TRUE;
}

Y ni ejecutando el exe como administrador consigo inyectar a la calculadora (que esta ejecutandose en ese momento) porque a ver ¿ahora al ejecutar la calculadora de nuevo tendria que aparecer el Messagebox verdad?
Estoy muy perdido con este tema.
gracias.
En línea

Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: No me funciona la inyección DLL
« Respuesta #1 en: 11 Diciembre 2011, 20:13 pm »

Pon todo dentro de sus debidas etiquetas y es posible que lo lea
En línea

Unbr0ken

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: No me funciona la inyección DLL
« Respuesta #2 en: 12 Diciembre 2011, 00:34 am »

"jkasjkadkajsdñasjodhq", ese es el resultado de un copy/paste.

Aburrido esta tarde reformé ese código:

Código
  1. #include <windows.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. HANDLE hProceso;
  9. HWND hVentana;
  10. DWORD idProceso;
  11. HMODULE hModulo;
  12. LPVOID pFuncion, mUbicacion;
  13. char* Libreria = "C:\\Dll.dll";
  14.  
  15. if (!(hVentana = FindWindow(L"CalcFrame", L"Calculadora")))
  16. {
  17. cout << "Ventana no encontrada.";
  18. getchar();
  19. return 1;
  20. }
  21. else cout << "Ventana encontrada!\nObteniendo el ID del proceso..." << endl;
  22.  
  23. GetWindowThreadProcessId(hVentana, &idProceso);
  24.  
  25. if (!idProceso)
  26. {
  27. cout << "No se pudo obtener el ID del proceso.";
  28. getchar();
  29. return 1;
  30. }
  31. else cout << "ID del proceso: " << idProceso << ".\nAbriendo el manejador del proceso..." << endl;
  32.  
  33. if (!(hProceso = OpenProcess(PROCESS_ALL_ACCESS, false, idProceso)))
  34. {
  35. cout << "Imposible abrir el manejador del proceso.";
  36. getchar();
  37. return 1;
  38. }
  39. else cout << "Manejador del proceso abierto correctamente.\nObteniendo el puntero del modulo \"Kernel32.Dll\"..." << endl;
  40.  
  41. if (!(hModulo = GetModuleHandle(L"Kernel32.dll")))
  42. {
  43. cout << "Imposible obtener el puntero del modulo \"Kernel32.dll\".";
  44. getchar();
  45. return 1;
  46. }
  47. else cout << "Puntero del modulo \"Kernel32.dll\": " << hModulo << ".\nObteniendo el puntero de la funcion \"LoadLibraryA\"..." << endl;
  48.  
  49. if (!(pFuncion = GetProcAddress(hModulo, "LoadLibraryA")))
  50. {
  51. cout << "Imposible obtener el puntero de la funcion \"LoadLibraryA\".";
  52. getchar();
  53. return 1;
  54. }
  55. else cout << "Puntero de la funcion \"LoadLibraryA\": " << pFuncion << ".\nReservando/asignando memoria para escribir los datos..." << endl;
  56.  
  57. if (!(mUbicacion = VirtualAllocEx(hProceso, NULL, strlen(Libreria), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)))
  58. {
  59. cout << "Imposible reservar/asignar las paginas de la memoria virtual del proceso.";
  60. getchar();
  61. return 1;
  62. }
  63. else cout << "Se ha reservado/asignado la memoria en la siguiente direccion: " << mUbicacion << ".\nIntentando escribir los datos de la libreria en la memoria..." << endl;
  64.  
  65. if (!WriteProcessMemory(hProceso, (LPVOID)mUbicacion, Libreria, strlen(Libreria), NULL))
  66. {
  67. cout << "Imposible escribir datos en la memoria virtual del proceso.";
  68. getchar();
  69. return 1;
  70. }
  71. else cout << "Datos escritos correctamente, intentando crear/iniciar el hilo remoto..." << endl;
  72.  
  73. if (!CreateRemoteThread(hProceso, NULL, NULL, (LPTHREAD_START_ROUTINE)pFuncion, (LPVOID)mUbicacion, NULL, NULL))
  74. {
  75. cout << "Imposible crear/iniciar el hilo remoto en el proceso.";
  76. getchar();
  77. return 1;
  78. }
  79. else cout << "Hilo creado/iniciado correctamente.\nIntentando cerrar el manejador abierto..." << endl;
  80.  
  81. if (!CloseHandle(hProceso))
  82. {
  83. cout << "Imposible cerrar el manejador.";
  84. getchar();
  85. return 1;
  86. }
  87. else cout << "Hilo cerrado correctamente.\n\nInyeccion realizada con exito, presione enter para salir...";
  88.  
  89. getchar();
  90.  
  91. return 0;
  92. }

Y... por el lado de la librería, tengo esto:

Código
  1. #include <Windows.h>
  2.  
  3. BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  4. {
  5. if (ul_reason_for_call == DLL_PROCESS_ATTACH)
  6. MessageBox(0, L"Me he cargado correctamente", L"Probando...", 0);
  7.  
  8. return TRUE;
  9. }

Y... el resultado te queda a ti, (ostia ¿qué difícil no?...)

Tu franela me hace pensar en: lamming, lamming everywhere.

Salud.
« Última modificación: 12 Diciembre 2011, 00:36 am por Unbr0ken » En línea

Cita de: Snowcrash
Discutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.
ApOkAlizE

Desconectado Desconectado

Mensajes: 150


¿sabes lo que vales? ¡consigue lo que te mereces!


Ver Perfil
Re: No me funciona la inyección DLL
« Respuesta #3 en: 14 Diciembre 2011, 21:21 pm »

Muchas gracias UnBr0ken, bueno no es lamming lo que pasa es que cuando me estudio algo nuevo primero me gusta más tener un ejemplo basico que funcione para poder ver así paso a paso como funciona y poder provar de ir cambiando cosas para intentar conseguir hacer cosas distintas.
Por cierto se inyecta la DLL, pero solo la ejecuta esa vez, es decir, al ejecutar la calculadora de nuevo ¿no tendria que volver a cargar la dll?
Bueno no se, ahora me pongo a estudiarme bien todo este tema, muchas gracias en serio :)
En línea

Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE
Unbr0ken

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: No me funciona la inyección DLL
« Respuesta #4 en: 14 Diciembre 2011, 23:51 pm »

Por cierto se inyecta la DLL, pero solo la ejecuta esa vez, es decir, al ejecutar la calculadora de nuevo ¿no tendria que volver a cargar la dll?
Bueno no se, ahora me pongo a estudiarme bien todo este tema, muchas gracias en serio :)

Ostia (?), obviamente estás inyectando una sola vez en el proceso en ejecución, si abres una nueva calculadora tendrías que inyectar en esta ya que toda la memoria de la calculadora es "nueva", no tiene ningún módulo adicional cargado, en este caso el de la .dll del MessageBox.

Ahora si quieres que cada vez que se ejecute la calculadora, se cargue la .dll, deberás modificar el ejecutable, creo que tiene que ver con la estructura PEB, pero ni idea... nunca profundicé ese tema. Google te puede ayudar ahí, por otro lado... busca primero conceptos y luego ve a la práctica, si no... imagina.

Salud.
En línea

Cita de: Snowcrash
Discutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.
ApOkAlizE

Desconectado Desconectado

Mensajes: 150


¿sabes lo que vales? ¡consigue lo que te mereces!


Ver Perfil
Re: No me funciona la inyección DLL
« Respuesta #5 en: 17 Diciembre 2011, 13:52 pm »

Muchas gracias.
Por cierto ¿sabes como saber el nombre de la classe de un programa?

por ejemplo, la calculadora el nombre de su classe es calcframe, sabes si hay algo que sirva para obtener el nombre de classe de un programa, he visto por ahí spy++ o winspy++... ¿se puede hacer desde C++?
En línea

Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE
Unbr0ken

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: No me funciona la inyección DLL
« Respuesta #6 en: 17 Diciembre 2011, 19:44 pm »

Muchas gracias.
Por cierto ¿sabes como saber el nombre de la classe de un programa?

por ejemplo, la calculadora el nombre de su classe es calcframe, sabes si hay algo que sirva para obtener el nombre de classe de un programa, he visto por ahí spy++ o winspy++... ¿se puede hacer desde C++?

¿Qué no se puede hacer desde C++?... (Y mucho más si hablamos de Win32API...)

Mirad la API GetClassName, procede a usarla en tu aplicación. (Combina otras API con esta para lograr un funcionamiento correcto)

Por cierto, pasate por google antes de hacer alguna pregunta, el foro debería ser usado para casos donde no se encuentre resultado alguno a tu duda.

Salud.

P.D.: Si preguntas por esto por haber visto que he usado como primer parámetro "CalcFrame" al momento de hacer la llamada a la API FindWindow, necesitas saber que puedes omitir cualquiera de estos dos parámetros, pasando en vez de este un valor nulo (NULL).
« Última modificación: 17 Diciembre 2011, 23:25 pm por Unbr0ken » En línea

Cita de: Snowcrash
Discutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
psx no me funciona
Juegos y Consolas
faju 4 2,503 Último mensaje 23 Febrero 2005, 00:25 am
por ¤ Nerviozzo ¤
X-oom funciona pero no funciona (sungoku?)
Multimedia
Lordofchaos 4 3,822 Último mensaje 12 Diciembre 2005, 20:44 pm
por Sourraund
Login con md5 , BD funciona pero no funciona « 1 2 »
PHP
securedigital 16 9,588 Último mensaje 25 Mayo 2007, 17:46 pm
por securedigital
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines