Como sabéis hay oleadas de infecciones USB del tipo RECYCLER, familiares, amigos y compañeros me encargan la limpieza de sus desafortunados dispositivos, pero vuelven a picar.
El virus RECYCLER y variantes ocultan las carpetas del directorio raiz de los medios extraíbles y en su lugar colocan accesos directos que apuntan al virus, para que al abrirlo (pensando que es la carpeta original) infecte el PC. Los incautos y poco observadores abrirán de ese modo sus carpetas infectando cada PC que encuentren a su paso.
Cansado de reparar a mano unidades USB infectadas con virus de ese tipo, decidí automatizar el sistema de forma que se visualicen las carpetas ocultas y se borren todos aquellos accesos directos cuyo contenido tenga la palabra “recycler”. Posteriormente vacuna la unidad escribiendo una carpeta llamada Recycler y un archivo llamado autorun.inf. Los atributos de archivo son convenientemente alterados para evitar que el virus los borre o reescriba en una posible nueva infección. El sistema usado para ello es mediante escritura a “pelo” en FAT16 o FAT32. De esto se habló aquí y aquí. Lo que hago es marcar como archivo bloqueado la carpeta recycler y como carpeta bloqueada el archivo autorun.inf. He utilizado el mismo código que publiqué en este último enlace, una API para trabajar con FAT16 y FAT32. Si el virus no sabe como deshacer esto, no podrá infectar nuestro pendrive.
Tras la vacuna, el programa configura el PC para evitar el AutoRun al conectar dispositivos extraíbles y repara los ganchos al registro para archivos ejecutables.
Expongo el código principal:
void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Lines->Clear(); Memo1->Lines->Add("COMENZAMOS EL TRABAJO, \r\nNO SAQUE SU PENDRIVE HASTA QUE TERMINEMOS.\r\n"); // Enumerando unidades extraibles char Drive[] = "A:\\"; char* D = Drive; for(; *D <= 'Z'; (*D)++){ if(GetDriveType(Drive) == DRIVE_REMOVABLE){ Memo1->Lines->Add("Limpiando unidad: " + String(Drive)); Memo1->Lines->Add(" Visualizando carpetas ocultas..."); SetAttribute(Drive, FILE_ATTRIBUTE_NORMAL, false); Memo1->Lines->Add(" Borrando Accesos directos infectados..."); DeleteRecyclerLnk(Drive); String File; Memo1->Lines->Add(" Vacunando autorun.inf..."); File = String(Drive) + "autorun.inf"; SetFileAttrFAT(File.c_str(), 0); RemoveDir(File); DeleteFile(File); FileClose(FileCreate(File)); SetFileAttrFAT(File.c_str(), ATTR_DIRECTORY | ATTR_DEVICE | ATTR_HIDDEN); Memo1->Lines->Add(" Vacunando Carpeta Recycler"); File = String(Drive) + "Recycler"; SetFileAttrFAT(File.c_str(), 0); RemoveDir(File); DeleteFile(File); CreateDir(File); SetFileAttrFAT(File.c_str(), ATTR_ARCHIVE | ATTR_DEVICE | ATTR_HIDDEN); Memo1->Lines->Add(""); } } // Reparando el registro del PC HKEY hKey; if(Ch_NoAutoRun->Checked){ // NoDriveTypeAutoRun Memo1->Lines->Add("NoDriveTypeAutoRun"); if(RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\Explorer", &hKey)==ERROR_SUCCESS){ DWORD Data = 0x000000FF; RegSetValueEx(hKey, "NoDriveTypeAutoRun", 0, REG_DWORD, (PBYTE)&Data, sizeof(DWORD)); RegCloseKey(hKey); } } // UnhookRegKey Memo1->Lines->Add("UnhookRegKey"); char Val[] = "\"%1\" %*"; SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\batfile\\shell\\open\\command", 0, Val); SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\comfile\\shell\\open\\command", 0, Val); SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\exefile\\shell\\open\\command", 0, Val); SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\piffile\\shell\\open\\command", 0, Val); SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\scrfile\\shell\\open\\command", 0, Val); SetStrValue(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\regfile\\shell\\open\\command", 0, "regedit.exe %1"); // Unlock Registry Memo1->Lines->Add("Unlock Registry"); if(RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hKey)==ERROR_SUCCESS){ RegDeleteValue(hKey, "DisableRegistryTools"); RegCloseKey(hKey); } Memo1->Lines->Add("\r\nTRABAJO TERMINADO"); }
El código está escrito en BCB5 y como suelo hacer, las partes más sensibles están escritas con la API de Windows
Subo el código completo con fuente y binario.
Saludos.