Título: como agrego una funcion en struct o como executo una funcion con CreateRemoteT?
Publicado por: Belial & Grimoire en 28 Agosto 2011, 20:57 pm
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; }
Título: Re: como agrego una funcion en struct o como executo una funcion con CreateRemoteT?
Publicado por: Eternal Idol en 28 Agosto 2011, 21:28 pm
No se entiende nada. ¿Que es lo tratas de hacer? ¿Llamar a APIs directamente en la funcion inyectada? ¿Algo asi?: 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.
Título: Re: como agrego una funcion en struct o como executo una funcion con CreateRemoteT?
Publicado por: Belial & Grimoire en 28 Agosto 2011, 22:18 pm
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
Título: Re: como agrego una funcion en struct o como executo una funcion con CreateRemoteT?
Publicado por: Eternal Idol en 28 Agosto 2011, 22:27 pm
No se puede, arriba te lo explique, depuralo si no lo entendes.
|