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 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; 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; } 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?:
Código
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 Código: 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 Código: 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.
|