Problema con Inyector Dll

Iniciado por Vaagish, 21 Septiembre 2013, 02:13 AM

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

Vaagish

Hola Gente!! Alguien podria probar este codigo a ver por que no funca?
Al parecer, los valores que retornan las funciones y los valores de GetLastError() estan bien, pero el programa no funciona.. Estoy teniendo el mismo problema con un programa en VB.NET que postie en Analisis y Diseño de Malware. Bueno, ahi va.. :)


#include <windows.h>
#include <iostream>
using namespace std;

int main()
{

//********* ESTRUCTURAS ***********
 
 PROCESS_INFORMATION Process_Info = {0};
 STARTUPINFO StartUpInfo = {0};

//********** VARIABLES ************

 HMODULE Modulo;
 FARPROC Funcion;
 LPCVOID Virtual;
 HANDLE ThreadId;
 int Ret;

 wchar_t App_Name[] = L"Hola.exe";
 wchar_t Dll_Name[] = L"dllvirus.dll";  

   //************ INICIO *************

StartUpInfo.cb = sizeof(StartUpInfo);

cout << endl;

Modulo = LoadLibraryA("kernel32.dll");
cout << "Kernel32 BaseAddress: " << Modulo << endl;
Funcion = GetProcAddress(Modulo, "LoadLibraryA");
cout << "LoadLibraryA BaseAddress: " << Funcion << endl;

cout << endl;

// NORMAL_PRIORITY_CLASS
// CREATE_SUSPENDED
Ret = CreateProcess(App_Name, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &StartUpInfo, &Process_Info);
cout << "CreateProcess ERROR CODE: " << GetLastError() << endl;
cout << "CreateProcess return value: " << Ret << endl;

cout << endl;

cout << "*************************" << endl;
cout << "* hProcess: " << Process_Info.hProcess << "\t*" << endl;
cout << "* hThread: " << Process_Info.hThread << "\t*" << endl;
cout << "* dwThreadId: " << Process_Info.dwThreadId << "\t*" << endl;
cout << "* dwProcessId: " << Process_Info.dwProcessId << "\t*" << endl;
cout << "*************************" << endl;

cout << endl;
int DllLen = 12;
cout << "dllvirus.dll" << " LEN: " << DllLen << endl;

cout << endl;

Virtual = VirtualAllocEx(Process_Info.hProcess, NULL, DllLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
cout << "VirtualAllocEx ERROR CODE: " << GetLastError() << endl;
cout << "VirtualAllocEx: " << Virtual << endl;

cout << endl;

Ret = WriteProcessMemory(Process_Info.hProcess, &Virtual, &DllLen, DllLen, NULL);
cout << "WriteProcessMemory ERROR CODE: " << GetLastError() << endl;
cout << "WriteProcessMemory return value: " << Ret << endl;

cout << endl;

ThreadId = CreateRemoteThread(Process_Info.hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Funcion, &Virtual, 0, NULL);
cout << "CreateRemoteThread ERROR CODE: " << GetLastError() << endl;
cout << "CreateRemoteThread Handle: " << ThreadId << endl;

cout << endl;
cout << "Waiting for CreateRemoteThread..." << endl;
cout << endl;

WaitForSingleObject(Process_Info.hProcess, 1000);

cout << endl;
cout << "Lunching App..." << endl;
cout << endl;

ResumeThread(Process_Info.hProcess);

cout << endl;
cout << "Closing Handle..." << endl;
cout << endl;

CloseHandle(Process_Info.hProcess);

cout << endl;
cout << "End :)" << endl;
cout << endl;

cin.get();

return 0;
}


Ha,, me olvidaba,, Hola.exe es un "Hola mundo" en un MessageBox echo en ASM y dllvirus.dll lo que hace es sobreescribir el texto del mensaje con otro texto, pero bueno, la idea se entiende, por que no inyecta? :/

BloodSharp

Un comentario te voy a hacer y puede que sea el error que te falla en el programa: los strings en C/C++ son arrays de caracteres, que finalizan con el byte cero.

En tu código:
Cita de: Vaagish en 21 Septiembre 2013, 02:13 AM

int DllLen = 12;
cout << "dllvirus.dll" << " LEN: " << DllLen << endl;

ponés la cantidad de letras de tu string (12 bytes) pero realmente los programas manejan "d l l v i r u s . d l l \0" (13 bytes)... proba con longitud 13 y tal vez te funcione correctamente...


B#



Vaagish

Gracias por responder IEAX, pero no funciono.. ahora estaba probando el CreateProcess con GetExitCodeProcess y parece que funciona bien (Retorna 259 que seria STILL_ACTIVE), aparte el Hola.exe se ejecuta, pero no se ve! Crea el proceso en modo suspendido, pero al parecer no puede iniciar el main... No se que inventar, los valores de retorno estan bien, reserva memoria, la escribe, pero no funca.. :/

orlando9427

Declaras Virtual como un puntero que almacena la dirección del buffer, pero pasas su dirección cuando debes de pasar su valor.
A lo que me refiero es:
Ret = WriteProcessMemory(Process_Info.hProcess, &Virtual, &DllLen, DllLen, NULL);
En el puntero al buffer le pasas un puntero al puntero del buffer, igual con CreateRemoteThread. Además pasas un puntero de la variable que contiene el tamaño de la cadena cuando debes de pasar la cadena.
Ret = WriteProcessMemory(Process_Info.hProcess, Virtual, &Dll_Name, DllLen, NULL);

Saludos!

Vaagish

Verdad,, lo habia arreglado hace un momento antes de volver a ver el foro jeje ahora quedo asi:

Ret = WriteProcessMemory(Process_Info.hProcess, (LPVOID)Virtual, &Dll_Name, DllLen, NULL);

Pero no funca igual...

Vaagish

Bueno, por si a alguien le interesa, yo me aburri de intentarlo, pero pude sacar alguna conclusión antes de morir en el intento..

Es mucho mas simple hacer esto con OpenProcess que con CreateProcess, al parecer, CreateProcess no esta funcionando bien porque no rellena la informacion que deberia al terminar la funcion, a que me refiero: las estructuras PROCESS_INFORMATION y STARTUPINFO no cargan la informacion que deberian, en especial el hProcess, fundamental para que funcione.. No soy un experto del Olly ni el Wnddbg, pero a simple vista, puede ver como un codigo en ASM si hacia su trabajo y en C++ o VB.Net no lo hacia, si algun DebugMaster quiere intentarlo, genial. Al parecer, puede ser un problema con las variables, o con las estructuras, pero no se porque en ASM no precisa definir, ni declarar mas nada y en otros lenguajes si,, a lo mejor por el compilador, pero a mi ya me funciono con OpenProcess y listo. :D

Saludos!!