2010-01-14 35 views
6

Me han encargado sobrescribir todo el espacio libre en algunas laptops 3 veces. Sé que hay algunas alternativas, pero me gusta saber cómo funcionan las cosas y si puedo hacerlo con C#.Limpiar Espacio libre en la unidad de disco duro con C#

1) Sí, sé que hay un montón de aplicaciones freeware que hará esto

2) que no, que no es necesario para ajustarse a cualquier gobierno norma específica

¿Dónde Busco ideas sobre cómo comenzar esto?

Gracias si me puede indicar la dirección correcta.

¿Se puede lograr usando C#? ¿Si es así, cómo?

+4

Parece que no hay necesidad de sobrescribir varias veces http://hostjury.com/blog/view/195/the-great-zero-challenge-remains-unaccepted http://stackoverflow.com/questions/59656/why-overwrite-a-file-more-than-once-to-securely-delete-all-traces-of-a-file –

Respuesta

3

algoritmo simple: (.. La mejor manera de utilizar un archivo previamente creado en lugar de regenerar al azar por razones de rendimiento Probarlo)

  • Cree un archivo de texto grande llena de texto arbitrario
  • Crear una ingeniosa esquema de nombres de carpetas y archivos para poder rastrear los archivos. También debe hacer un seguimiento de los archivos con su aplicación, pero si se bloquea, especialmente al final de las primeras pruebas, querrá encontrar y limpiar fácilmente su trabajo.
  • escribirlo en el disco duro hasta que esté completa
  • Eliminar los archivos que ha creado
  • repita los pasos anteriores dos veces más

Actualización: Más consideración avanzada sobre secándose por la posterior discusión:

  • En la primera pasada escribir archivos de 0x0000 valores (todos los bits desactivados)
  • En segundo paso s escriben todos los bits como 0xFFFF (todos los bits en)
  • En última repetición pase con 0x0000

Lo anterior hace caso omiso de algunas ideas, como lo es el mejor tamaño del archivo, depende de su sistema de archivos de todos modos. También puede obtener comportamientos diferentes del sistema operativo cuando se encuentre cerca de un disco duro lleno ...

+0

Esta puede ser una forma mucho mejor que la mía de manejar la simple implementación que está buscando. Como dije, no soy un experto en el campo;) – hackerhasid

+0

Simplemente agregaré que escribir ceros en el archivo es aún mejor (no es necesario agregarle texto). – gbianchi

+0

@gbianchi: Tal vez ... Ahí es donde se vuelve un poco más teórico. ¿Sería mejor el texto aleatorio para frustrar a los posibles ladrones de datos? Quizás, quizás no. También podría ser mejor cambiar entre 0s y 1s para forzar un salto de un momento para realmente "sacudir" los datos previos. –

0

Tendrá que hacer algunas manipulaciones de bajo nivel, por lo que seguramente tendrá que hablar con la API de Win32. No he hecho este tipo de cosas, así que no puedo darle detalles, pero un buen lugar para empezar a buscar podría ser la referencia API de Win32: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Realmente no soy un experto en este campo. , pero a mi entender ingenuamente, necesitarás: 1) obtener información sobre dónde se inicia el sistema de archivos & paradas 2) usando los archivos no eliminados como referencia, obtener una lista de ubicaciones físicas de lo que debería ser espacio libre 3) escriba 0 en esas ubicaciones

Quizás esta no sea una gran respuesta ya que no soy un experto en el campo, pero fue demasiado tiempo para hacer un comentario;) Espero que eso ayude a pequeño.

-1

Consulte la documentación de SDelete, tal vez pueda obtener una pista allí.

+1

está disponible en inglés? – hackerhasid

+1

Vaya, perdón, cambiado a en-us – jmservera

1

Este código es de The Code Project Creo. Estoy seguro de que el artículo es orignal, pero hace lo que solicitó:

Sobre la base de los comentarios que claramente necesito spoonfeed un poco más ..

Usted puede hacer esto de manera muy sencilla, en función de sus necesidades .

  1. Haga 1 archivo grande que llene el tamaño libre restante en su unidad. Luego, simplemente limpie este archivo.

  2. Haga varios archivos hasta que la unidad esté llena. (Esto podría ser mejor si desea usar la máquina mientras está en funcionamiento). Luego puede comenzar a limpiar cada archivo, por lo tanto, en efecto, el tiempo total que el sistema tiene una unidad de disco duro completa es más pequeño que con el método 1. Pero es probable que sea un poco más lento y use un poco más de código.

La ventaja de usar son algunos, un código fácil de usar. No tiene que jugar con API de bajo nivel que lo arruinarán.

using System; 
using System.IO; 
using System.Security.Cryptography; 

namespace QuickStarterShared 
{ 
    public class Wipe 
    { 
     /// <summary> 
     /// Deletes a file in a secure way by overwriting it with 
     /// random garbage data n times. 
     /// </summary> 
     /// <param name="filename">Full path of the file to be deleted</param> 
     /// <param name="timesToWrite">Specifies the number of times the file should be overwritten</param> 
     public void WipeFile(string filename, int timesToWrite) 
     { 
#if !DEBUG 
      try 
      { 
#endif 
       if (File.Exists(filename)) 
       { 
        // Set the files attributes to normal in case it's read-only. 
        File.SetAttributes(filename, FileAttributes.Normal); 

        // Calculate the total number of sectors in the file. 
        double sectors = Math.Ceiling(new FileInfo(filename).Length/512.0); 

        // Create a dummy-buffer the size of a sector. 
        byte[] dummyBuffer = new byte[512]; 

        // Create a cryptographic Random Number Generator. 
        // This is what I use to create the garbage data. 
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 

        // Open a FileStream to the file. 
        FileStream inputStream = new FileStream(filename, FileMode.Open); 
        for (int currentPass = 0; currentPass < timesToWrite; currentPass++) 
        { 
         // Go to the beginning of the stream 
         inputStream.Position = 0; 

         // Loop all sectors 
         for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++) 
         { 
          // Fill the dummy-buffer with random data 
          rng.GetBytes(dummyBuffer); 
          // Write it to the stream 
          inputStream.Write(dummyBuffer, 0, dummyBuffer.Length); 
         } 
        } 
        // Truncate the file to 0 bytes. 
        // This will hide the original file-length if you try to recover the file. 
        inputStream.SetLength(0); 
        // Close the stream. 
        inputStream.Close(); 

        // As an extra precaution I change the dates of the file so the 
        // original dates are hidden if you try to recover the file. 
        DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0); 
        File.SetCreationTime(filename, dt); 
        File.SetLastAccessTime(filename, dt); 
        File.SetLastWriteTime(filename, dt); 

        File.SetCreationTimeUtc(filename, dt); 
        File.SetLastAccessTimeUtc(filename, dt); 
        File.SetLastWriteTimeUtc(filename, dt); 

        // Finally, delete the file 
        File.Delete(filename); 
       } 
#if !DEBUG 
      } 
      catch(Exception e) 
      { 

      } 
#endif 
     } 
    } 

    # region Events 
    # region PassInfo 
    public delegate void PassInfoEventHandler(PassInfoEventArgs e); 
    public class PassInfoEventArgs : EventArgs 
    { 
     private readonly int cPass; 
     private readonly int tPass; 

     public PassInfoEventArgs(int currentPass, int totalPasses) 
     { 
      cPass = currentPass; 
      tPass = totalPasses; 
     } 

     /// <summary> Get the current pass </summary> 
     public int CurrentPass { get { return cPass; } } 
     /// <summary> Get the total number of passes to be run </summary> 
     public int TotalPasses { get { return tPass; } } 
    } 
    # endregion 

    # region SectorInfo   
    public delegate void SectorInfoEventHandler(SectorInfoEventArgs e); 
    public class SectorInfoEventArgs : EventArgs 
    { 
     private readonly int cSector; 
     private readonly int tSectors; 

     public SectorInfoEventArgs(int currentSector, int totalSectors) 
     { 
      cSector = currentSector; 
      tSectors = totalSectors; 
     } 

     /// <summary> Get the current sector </summary> 
     public int CurrentSector { get { return cSector; } } 
     /// <summary> Get the total number of sectors to be run </summary> 
     public int TotalSectors { get { return tSectors; } } 
    } 
    # endregion 

    # region WipeDone   
    public delegate void WipeDoneEventHandler(WipeDoneEventArgs e); 
    public class WipeDoneEventArgs : EventArgs 
    { 
    } 
    # endregion 

    # region WipeError 
    public delegate void WipeErrorEventHandler(WipeErrorEventArgs e); 
    public class WipeErrorEventArgs : EventArgs 
    { 
     private readonly Exception e; 

     public WipeErrorEventArgs(Exception error) 
     { 
      e = error; 
     } 

     public Exception WipeError{get{ return e;}} 
    } 
    # endregion 
    # endregion 
} 
+0

Esto borra un archivo individual. La pregunta era sobre borrar todo el espacio libre en el disco duro ... que contiene archivos eliminados/eliminados que podrían ser recuperados por un tercero. –

+0

Esto es para sobrescribir de forma segura un archivo existente. Está buscando limpiar con seguridad el espacio libre en su disco. – hackerhasid

+3

Esto no es lo que pedí en el OP, pero sigue siendo muy interesante gracias – Crash893

-1
System.Diagonstics.Process.Start("chipher.exe /WC:\"); 

Esta es asíncrona por defecto, se entiende la idea.

2

Esto es muy peligroso pero ..

Puede utilizar el Defrag APIs (here's a C# wrapper) a controlar la 'mapa' de la unidad y, específicamente, apuntar el espacio libre y escribir basura para aquellas partes del disco.

+0

Si llena todo el espacio libre al mismo tiempo con los archivos, puede causar problemas si otra cosa intenta escribir en el disco, o la memoria virtual intenta expandirse. Si utiliza las API de desfragmentación, al menos puede despejar el espacio libre sin causar problemas, suponiendo que lo haga bien. –

Cuestiones relacionadas