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
Código:
//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;
}
Código:
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;
{
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
Código:
#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;
}
#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;
}