No me funciona la inyección DLL

Iniciado por ApOkAlizE, 11 Diciembre 2011, 14:21 PM

0 Miembros y 1 Visitante están viendo este tema.

ApOkAlizE

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.
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

Pon todo dentro de sus debidas etiquetas y es posible que lo lea

Unbr0ken

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

Aburrido esta tarde reformé ese código:

Código (cpp) [Seleccionar]
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
HANDLE hProceso;
HWND hVentana;
DWORD idProceso;
HMODULE hModulo;
LPVOID pFuncion, mUbicacion;
char* Libreria = "C:\\Dll.dll";

if (!(hVentana = FindWindow(L"CalcFrame", L"Calculadora")))
{
cout << "Ventana no encontrada.";
getchar();
return 1;
}
else cout << "Ventana encontrada!\nObteniendo el ID del proceso..." << endl;

GetWindowThreadProcessId(hVentana, &idProceso);

if (!idProceso)
{
cout << "No se pudo obtener el ID del proceso.";
getchar();
return 1;
}
else cout << "ID del proceso: " << idProceso << ".\nAbriendo el manejador del proceso..." << endl;

if (!(hProceso = OpenProcess(PROCESS_ALL_ACCESS, false, idProceso)))
{
cout << "Imposible abrir el manejador del proceso.";
getchar();
return 1;
}
else cout << "Manejador del proceso abierto correctamente.\nObteniendo el puntero del modulo \"Kernel32.Dll\"..." << endl;

if (!(hModulo = GetModuleHandle(L"Kernel32.dll")))
{
cout << "Imposible obtener el puntero del modulo \"Kernel32.dll\".";
getchar();
return 1;
}
else cout << "Puntero del modulo \"Kernel32.dll\": " << hModulo << ".\nObteniendo el puntero de la funcion \"LoadLibraryA\"..." << endl;

if (!(pFuncion = GetProcAddress(hModulo, "LoadLibraryA")))
{
cout << "Imposible obtener el puntero de la funcion \"LoadLibraryA\".";
getchar();
return 1;
}
else cout << "Puntero de la funcion \"LoadLibraryA\": " << pFuncion << ".\nReservando/asignando memoria para escribir los datos..." << endl;

if (!(mUbicacion = VirtualAllocEx(hProceso, NULL, strlen(Libreria), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)))
{
cout << "Imposible reservar/asignar las paginas de la memoria virtual del proceso.";
getchar();
return 1;
}
else cout << "Se ha reservado/asignado la memoria en la siguiente direccion: " << mUbicacion << ".\nIntentando escribir los datos de la libreria en la memoria..." << endl;

if (!WriteProcessMemory(hProceso, (LPVOID)mUbicacion, Libreria, strlen(Libreria), NULL))
{
cout << "Imposible escribir datos en la memoria virtual del proceso.";
getchar();
return 1;
}
else cout << "Datos escritos correctamente, intentando crear/iniciar el hilo remoto..." << endl;

if (!CreateRemoteThread(hProceso, NULL, NULL, (LPTHREAD_START_ROUTINE)pFuncion, (LPVOID)mUbicacion, NULL, NULL))
{
cout << "Imposible crear/iniciar el hilo remoto en el proceso.";
getchar();
return 1;
}
else cout << "Hilo creado/iniciado correctamente.\nIntentando cerrar el manejador abierto..." << endl;

if (!CloseHandle(hProceso))
{
cout << "Imposible cerrar el manejador.";
getchar();
return 1;
}
else cout << "Hilo cerrado correctamente.\n\nInyeccion realizada con exito, presione enter para salir...";

getchar();

return 0;
}


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

Código (cpp) [Seleccionar]
#include <Windows.h>

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
MessageBox(0, L"Me he cargado correctamente", L"Probando...", 0);

return TRUE;
}


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

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

Salud.
Cita de: SnowcrashDiscutir 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

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 :)
Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE

Unbr0ken

Cita de: ApOkAlizE en 14 Diciembre 2011, 21:21 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.
Cita de: SnowcrashDiscutir 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

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++?
Los virus informaticos son como las personas, hacen lo posible para destruir y hacen lo impossible para no ser destruidos... - ApOkAlizE

Unbr0ken

#6
Cita de: ApOkAlizE 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++?

¿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).
Cita de: SnowcrashDiscutir 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.