Tema destacado:
Autor
|
Tema: [SOURCE] Library Injector (Leído 2,596 veces)
|
yeikos
Desconectado
Mensajes: 1.424
|
// Library Injector v1.0 - yeikos (at) gmail (dot) com // GNU General Public License - http://www.gnu.org/licenses/gpl-3.0.txt #include <windows.h> #include <tlhelp32.h> #define MAX_PID 6 int fncHelp() { printf("\n\t[INFO]\n" "\t -a\t\t\tShows every process id with his process name respective\n" "\t -s <process name>\tShows every process id from the process name\n\n" "\t[INJECT]\n" "\t -l <library>\t\tLoads the library for the injection\n" "\t -n <process name>\tInjects the library in all process id from the process name\n" "\t -i <process id>\tInjects the library in the process id\n\n" "\n\t Usage: li.exe [[-a]|[-s]] [-l [-n]|[-i]]\n"); exit(1); } char strLibrary[MAX_PATH], strPName[MAX_PATH], strShow[MAX_PATH], strPID[MAX_PID]; unsigned short int i, optAll = 0, optShow = 0, optLibrary = 0, optPID= 0, optPName= 0; int main(int argc, char **argv) { printf ("\n Library Injector v1.0 - yeikos (at) gmail (dot) com\n\n"); if (argc < 2) { fncHelp(); } for (i=1;i<argc;i+=2) { switch((int)argv[i][1]) { case 'a': if (optAll > 0 || argc != 2) { fncHelp(); } else { optAll = i+1; } break; case 's': if (optShow > 0 || argc != 3) { fncHelp(); } else { optShow = i+1; } break; case 'l': if (optLibrary > 0 || argc != 5) { fncHelp(); } else { optLibrary = i+1; } break; case 'i': if (optPID > 0 || argc != 5 || strlen(argv[i+1]) > MAX_PID ) { fncHelp(); } else { optPID = i+1; } break; case 'n': if (optPName > 0 || argc != 5) { fncHelp(); } else { optPName = i+1; } break; default: fncHelp(); break; } } HANDLE hProcessSnap; PROCESSENTRY32 pe32; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pe32.dwSize = sizeof(PROCESSENTRY32); if (optAll > 0 || optShow > 0) { printf("\tID\t Name\n\t-- ----\n"); } if (!Process32First(hProcessSnap,&pe32)) { CloseHandle(hProcessSnap); } do { if (optAll > 0) { if (pe32.th32ProcessID != 0) { printf("\t[%i]\t %s\n", pe32.th32ProcessID, pe32.szExeFile); } } else if (optShow > 0) { strncpy(strShow, argv[optShow], sizeof(strShow)); if (strcmp(strShow,pe32.szExeFile) == 0) { printf("\t[%i]\t %s\n", pe32.th32ProcessID, pe32.szExeFile); } } else if (optLibrary > 0) { strncpy(strLibrary, argv[optLibrary], sizeof(strLibrary)); char tmpPID[MAX_PID]; sprintf(tmpPID, "%i", pe32.th32ProcessID); if (optPName > 0) { strncpy(strPName, argv[optPName], sizeof(strPName)); if (strcmp(strPName,pe32.szExeFile) == 0) { sprintf(strPID, "%i", pe32.th32ProcessID); } } else if (optPID > 0) { if (strcmp(argv[optPID],tmpPID) == 0) { strncpy(strPName, pe32.szExeFile, sizeof(strPName)); strncpy(strPID, argv[optPID], sizeof(strPID)); } } if (strcmp(strPID,tmpPID) == 0) { DWORD pid; pid=(DWORD)atoi(tmpPID); HANDLE proc; LPVOID RemoteString; LPVOID nLoadLibrary; proc = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); nLoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); RemoteString = (LPVOID)VirtualAllocEx(proc,0,strlen(strLibrary),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE); WriteProcessMemory(proc,(LPVOID)RemoteString,strLibrary,strlen(strLibrary),0); CreateRemoteThread(proc,0,0,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,0,0); CloseHandle(proc); printf("\t%s >> %s [%s]\n",strLibrary,strPName,tmpPID); } } } while(Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap); if ((optLibrary > 0) && (strlen(strPName) == 0 || strlen(strPID) == 0)) { printf("\n\tResults (0)\n"); } return 0; }
|
|
|
|
« Última modificación: 30 Agosto 2007, 13:40 por yeikos »
|
En línea
|
|
|
|
EvilGoblin
Desconectado
Mensajes: 2.320
YO NO LA VOTE!
|
=O!..... El tema este lo andaban preguntando bastante! ^^ Gran aporte yeikos (aunq todavia no lo probe ;P) me lo llevoy lo pruebo.... y aver si no lo detecta algun AV como ROOTKIT xD ^^" Suerte! 
|
|
|
|
|
En línea
|
Experimental Serial Lain [Linux User]
|
|
|
yeikos
Desconectado
Mensajes: 1.424
|
En realidad no es ninguna herramienta de camuflaje, a pesar de que una de sus funciones sea esa. Su uso es para la explotación de vulnerabilidades, por ejemplo, éstas dos últimas que han salido recientemente en Yahoo y MSN Messenger, en las que se tenía que inyectar la librería en el proceso del mensajero. li.exe -i C:\overflow-yahoo.dll -n yahoo.exe li.exe -i C:\overflow-msn.dll -n msnmsgr.exe CreateRemoteThread es detectado por muchos antivirus, pero eso no importa para nada en esta herramienta, aún así, muchas gracias por el comentario.
|
|
|
|
|
En línea
|
|
|
|
|
MazarD
|
Es infinitamente detectado, hay varias fuentes casi identicas en este mismo foro, ahún así si lo va a usar solo para explotar igual es la mejor opción por ser, de las que yo conozco por lo menos, la técnica menos intrusiva.
Hace un tiempo vi no sé donde un código para fuzzear inyectandose al programa y hookeando winsock, ahora mismo no he logrado encontrarlo pero estaba realmente interesante.
Saludos.
|
|
|
|
|
En línea
|
|
|
|
|
~~
|
Oye MazarD lo q detecta el av es CreateRemoteThread no? y si se llama a esta api por su espacio en la dll lo detecta el av?
|
|
|
|
|
En línea
|
|
|
|
|
Hendrix
|
Oye MazarD lo q detecta el av es CreateRemoteThread no? y si se llama a esta api por su espacio en la dll lo detecta el av?
El Kav lo que hace es hookear el kernel, y, aunque la llames por su espacio de memoria o lo que quieras sabra que estas llamando a esa API y saltara 
|
|
|
|
|
En línea
|
"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
|
|
|
Ferсhu
Desconectado
Mensajes: 1.213
Menos palabras y Mas codigos.
|
Aver si alguien me saca una duda q siempre tuve.
Se puede copiar el codigo(makina) de la funcion CreateRemoteThread y meterlo en nuestra aplicacion, es decir yo digo copiar la el tamaño de la funcion y guardarlo en nuestro programa como una funcion y llamar a esa, seguramente esta funcion llamara a otras apis, pero la llamada hacia la "MI CreateRemoteThread" por el hook del antivirus no pasa.
Es posible hacer eso? A ver si alguien sabe tanto y me responde jaja.
Saludos!!!
|
|
|
|
|
En línea
|
|
|
|
|
MazarD
|
Esta función está llamando muchas otrás por debajo que terminarán usando recursos restringidos por/para el sistema operativo por lo que imagino que se podría hacer, pero sólo en ring0 y con lo poco documentado que está el tema a ese nivel seguro que terminas antes parcheando la sdt que es donde tengo entendido suelen hookear los antivirus. No soy un entendido en tema de hooking en ring0 así que tampoco me hagas mucho caso xD Saludos.
|
|
|
|
« Última modificación: 7 Septiembre 2007, 00:14 por MazarD »
|
En línea
|
|
|
|
opterman
Desconectado
Mensajes: 87
|
Nas a todos Bueno respecto a lo que dice mazarD sobre cargar la librería desde Ring0 (modo driver del kernel ) aqui traigo una posible solucion para ello
Creamos un driver en el que se cree un callback donde sale todos los modulos que se cargan en el proceso cuando en el callback aparezca el proceso al que nosotros queremos inyectarnos abrimos el proceso mediante su pid y con ldrloaddll cargamos la dll en el proceso, asin de simple.
PD: si funciona bien, publicaré el codigo del driver para que lo prueben.
Saludos, Opterman
|
|
|
|
|
En línea
|
|
|
|
|
MazarD
|
opterman no entiendo que quieres decir, eso mismo lo puedes hacer en ring3 directamente con loadlibrary, la cuestión es como dirigir el punto de ejecución que como comentamos se puede hacer con createremotethread, es obvio que hay otras opciones para conseguir lanzarlo sin ser detectados pero hablabamos de esta concreta y de si sería posible usarla con algun tipo de "walkaround", a lo que yo opinó que no, o que por lo menos sería tan costoso que no merecería la pena ni intentarlo. De todos modos el hilo es 100% offtopic ya 
|
|
|
|
« Última modificación: 7 Septiembre 2007, 17:07 por MazarD »
|
En línea
|
|
|
|
c3r0x
Desconectado
Mensajes: 42
|
inyeccion de dll paso de moda..detectado por los av's claro q si yeikos lo hice para explotar es otra cuestion  salu2
|
|
|
|
« Última modificación: 8 Septiembre 2007, 06:26 por c3r0x »
|
En línea
|
|
|
|
De@th (L1zb3th)
TROLL
Desconectado
Mensajes: 619
<-[Rin]->
|
inyeccion de dll paso de moda..detectado por los av's claro q si yeikos lo hice para explotar es otra cuestion  salu2 sory ella, la fashion de la moda xDDDD es asi, quizas vos no lo ves bien por que no conoces el tema en cuestion ... es una buena técnica, depende del arte que le ponga uno, vi un par de articulos haciendolo a modo kernel driver como dice opterman, es ralativamente simple y la cuestion es que no se detecta =) Au Revoir !
|
|
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
De la forma que se habla se detecta del mismo modo, pq terminas hookeando en modo usuario ¿pq no proteger el proceso de cualquier intento de acceso? desde un driver logico.
|
|
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
pero sólo en ring0 y con lo poco documentado que está el tema a ese nivel seguro que terminas antes parcheando la sdt que es donde tengo entendido suelen hookear los antivirus. esta poco o nada documentado en castellano, en ingles tienes buenas bases y despues con windbg haces los deberes  . tienes mal entendido, se hookea en la ssdt. la sdt que exporta ntoskrnl con el nombre KeServiceDescriptorTable es una estructura donde lo que interesa es el primer miembro que es un puntero a la ssdt y ahi es donde estan las direcciones de las funciones. en realidad son 2 estructuras pero bueno al final solo importa este puntero. saludos.
|
|
|
|
|
En línea
|
|
|
|
|
MazarD
|
tienes mal entendido Por eso el: No soy un entendido en tema de hooking en ring0 así que tampoco me hagas mucho caso  Gracias por la aclaración, es un tema realmente interesante.
|
|
|
|
|
En línea
|
|
|
|
|
|