|
Comment détruire définitivement un fichier sur disque. |
Iniciado por Jean Turcotte, abr., 23 2025 1:33 PM - 10 respostas |
| |
| | | |
|
| |
Membro registado 1.275 mensagems |
|
Publicado em abril, 23 2025 - 1:33 PM |
Bonjour, est-ce que l'un d'entre-vous sais comment programmer une fonction pour détruire complétement un fichier Windows sur disque de facon à ce qu'il ne puisse être récupéré par un logiciel de récupération?
Merci!
-- Jean Turcotte WX 2025 |
| |
| |
| | | |
|
| | |
| |
Membro registado 243 mensagems |
|
Publicado em abril, 23 2025 - 1:49 PM |
Bonjour, Confronté à ce problème il y a quelques années, je n'ai pas trouvé de solution directe. J'ai donc choisi de crypter le fichier avant de le supprimer. Cdt |
| |
| |
| | | |
|
| | |
| |
Membro registado 220 mensagems |
|
Publicado em abril, 23 2025 - 2:01 PM |
Bonjour,
C'est impossible. Il faut formatter tout le disque avec un formattage bas niveau et plusieurs fois pour que le fichier soit impossible à récupérer.
La solution de cryptage ne sert pas car on peut facilement récupérer une version antérieure du fichier (même après des années). Pour le système, le fichier crypté n'est rien qu'autre qu'un nouveau fichier avec la version non cryptée qui a été supprimée. |
| |
| |
| | | |
|
| | |
| |
Membro registado 243 mensagems |
|
Publicado em abril, 23 2025 - 2:13 PM |
Dav a écrit :
> La solution de cryptage ne sert pas car on peut facilement récupérer une version antérieure du fichier (même après des années). Pour le système, le fichier crypté n'est rien qu'autre qu'un nouveau fichier avec la version non cryptée qui a été supprimée.
FAUX : si la taille du fichier n'est pas modifiée, il ne sera pas créé de nouveau fichier Il faut juste écrire des données (cryptées ou non) en respectant la taille originale
Pour information : Jusqu’à ce que de nouvelles données soient écrites à l'emplacement physique du fichier supprimé, les données seront toujours présentes. C’est ce que les outils de récupération de données (comme Recuva, DiskDrill, Glary Undelete, etc...) utilisent pour analyser votre disque et récupérer ces données. Toutefois, lorsqu’un fichier existant est écrasé ou qu’un nouveau fichier est écrit dans le même espace physique que le fichier supprimé, la récupération devient extrêmement improbable voir impossible étant donné que le contenu du fichier a été complètement remplacé par d’autres données. CQFDMensagem modificada, abril, 23 2025 - 2:24 PM |
| |
| |
| | | |
|
| | |
| |
Membro registado 1.275 mensagems |
|
Publicado em abril, 23 2025 - 7:14 PM |
Merci pour vos réponses.
Dommage que ce ne soit pas possible. Peut-on alors forcer une fragmentation des disques par programmation?
-- Jean Turcotte WX 2025 |
| |
| |
| | | |
|
| | |
| |
Membro registado 243 mensagems |
|
Publicado em abril, 23 2025 - 9:09 PM |
Bonsoir,
Une "défragmentation" plutôt (avec consolidation de l'espace libre)
C'est possible en exécutant Defrag Ex. pour défragmenter le disque C: C:\Windows\System32\Defrag.exe /X C:
Cette commande doit être exécutée en "mode Administrateur"
A tester mais pas certain que ça résolve le problème initial
Cdt |
| |
| |
| | | |
|
| | |
| |
Publicado em abril, 24 2025 - 8:23 AM |
| |
| |
| | | |
|
| | |
| |
Membro registado 253 mensagems |
|
Publicado em abril, 24 2025 - 10:38 AM |
Jean Turcotte a écrit :
Bonjour, est-ce que l'un d'entre-vous sais comment programmer une fonction pour détruire complétement un fichier Windows sur disque de facon à ce qu'il ne puisse être récupéré par un logiciel de récupération?
Merci!
-- Jean Turcotte WX 2025
Bonjour,
Vous demandez à ce que le fichier ne soit pas récupérable par un logiciel de récupération (je comprends par là un logiciel du commerce) et non un logiciel spécialisé utilisé dans l'industrie de la récupération de données.
Alors c'est très simple. Le principe est de ne SURTOUT pas supprimer le fichier en question AVANT de faire cette opération : Il suffit d'ouvrir le fichier en question avec la fonction fEcrit() https://doc.pcsoft.fr/fr-FR/?3036014&3036014 et d'y écrire une chaine quelconque à l'intérieur (par exemple des zéro) puis de le renommer avec un nom aléatoire et enfin de le supprimer avec la fonction fSupprime (sans option). Cela suffit amplement à le détruire de façon à ce qu'il ne puisse être récupéré par des outils du commerce. Maintenant si vous êtes parano, vous pouvez aussi (avant de le détruire) récupérer la taille du fichier (en nbr de caractères) pour que la chaine à écrire avec fEcrit() soit de la même longueur, mais bon, comme je dis tout dépends du niveau de sécurité que demande le client.
En gros c'est ce que explique Fabrice N. Bon dev ! |
| |
| |
| | | |
|
| | |
| |
Membro registado 1.275 mensagems |
|
Publicado em abril, 24 2025 - 1:34 PM |
André STASZEWSKI a écrit :
Jean Turcotte a écrit : Bonjour, est-ce que l'un d'entre-vous sais comment programmer une fonction pour détruire complétement un fichier Windows sur disque de facon à ce qu'il ne puisse être récupéré par un logiciel de récupération?
Merci!
-- Jean Turcotte WX 2025
Bonjour, Vous demandez à ce que le fichier ne soit pas récupérable par un logiciel de récupération (je comprends par là un logiciel du commerce) et non un logiciel spécialisé utilisé dans l'industrie de la récupération de données. Alors c'est très simple. Le principe est de ne SURTOUT pas supprimer le fichier en question AVANT de faire cette opération : Il suffit d'ouvrir le fichier en question avec la fonction fEcrit() https://doc.pcsoft.fr/fr-FR/?3036014&3036014 et d'y écrire une chaine quelconque à l'intérieur (par exemple des zéro) puis de le renommer avec un nom aléatoire et enfin de le supprimer avec la fonction fSupprime (sans option). Cela suffit amplement à le détruire de façon à ce qu'il ne puisse être récupéré par des outils du commerce. Maintenant si vous êtes parano, vous pouvez aussi (avant de le détruire) récupérer la taille du fichier (en nbr de caractères) pour que la chaine à écrire avec fEcrit() soit de la même longueur, mais bon, comme je dis tout dépends du niveau de sécurité que demande le client. En gros c'est ce que explique Fabrice N. Bon dev !
Merci à vous tous, c'est exactement ce que je recherchais. 
-- Jean Turcotte WX 2025 |
| |
| |
| | | |
|
| | |
| |
Publicado em abril, 27 2025 - 1:12 PM |
Bonjour La commande powershell cypher peut s'avérer utile.
Mais les remarques de André et Fabrice m’ont inspiré pour traiter un seul fichier. J’ai développé cette procédure et j’attends vos commentaires…
ElPato
Procedure DetruireFichier(CheminfichierSource est chaîne) AvecTrace est un booléen=Vrai Sablier(Vrai) SI PAS fFichierExiste(CheminfichierSource) ALORS SI AvecTrace ALORS Trace(CheminfichierSource+" pas trouvé") RENVOYER Faux FIN disque est chaîne = fExtraitChemin(CheminfichierSource,fDisque) repertoire est chaîne = fExtraitChemin(CheminfichierSource,fRépertoire) SI disque~="" ALORS disque=fDisqueEnCours() SI repertoire~="" ALORS repertoire=fExtraitChemin(fRepEnCours(),fRépertoire) CheminFichierDestination est chaîne = disque+repertoire+DonneGUID(guidBrut) IDFichier est un entier ResEcriture est un entier texteDeRemplacement est chaîne ANSI caractèreDeRemplacement est chaîne = "A" dernierCaractère est chaîne = "Z" TailleDuFichierSource est entier sur 8 octets = fTaille(CheminfichierSource) TailleDuFichierDestination est entier sur 8 octets TailleAnalysée est entier sur 8 octet = 1 000 000 000 NombreDeTours,compteur est entier reste est entier SI AvecTrace ALORS Trace("Disque="+disque) Trace("Répertoire="+repertoire) Trace("Source="+CheminfichierSource) Trace("Destination:"+CheminFichierDestination) AffichageLignes("SOURCE",CheminfichierSource,TailleDuFichierSource) FIN SELON TailleDuFichierSource CAS < TailleAnalysée texteDeRemplacement = Complete(texteDeRemplacement,TailleDuFichierSource,caractèreDeRemplacement) IDFichier = fOuvre(CheminfichierSource, foLectureEcriture) SI IDFichier<>-1 ResEcriture = fEcrit(IDFichier,texteDeRemplacement,TailleDuFichierSource-1) ResEcriture = fEcrit(IDFichier,dernierCaractère,1) SINON SI AvecTrace ALORS Trace("Erreur écriture") fFerme(IDFichier) RENVOYER Faux FIN fFerme(IDFichier) AUTRES CAS IDFichier = fOuvre(CheminfichierSource,foLectureEcriture) NombreDeTours = PartieEntière(TailleDuFichierSource/TailleAnalysée) reste = TailleDuFichierSource-(TailleAnalysée* NombreDeTours) texteDeRemplacement = Complete(texteDeRemplacement,TailleAnalysée,caractèreDeRemplacement) SI IDFichier<>-1 ALORS POUR compteur=1 À NombreDeTours ResEcriture=fEcrit(IDFichier,texteDeRemplacement,TailleAnalysée) SI ResEcriture<>-1 ALORS SI AvecTrace ALORS Trace("tour="+compteur+"/"+NombreDeTours) SINON SI AvecTrace ALORS Trace("Erreur écriture") fFerme(IDFichier) RENVOYER Faux FIN FIN ResEcriture = fEcrit(IDFichier,texteDeRemplacement,reste-1) ResEcriture = fEcrit(IDFichier,dernierCaractère,1) fFerme(IDFichier) SINON fFerme(IDFichier) RENVOYER Faux FIN FIN SI fRenomme(CheminfichierSource,CheminFichierDestination) ALORS TailleDuFichierDestination=fTaille(CheminFichierDestination) SI TailleDuFichierSource=TailleDuFichierDestination ALORS SI AvecTrace ALORS AffichageLignes("DESTINATION",CheminFichierDestination,TailleDuFichierDestination) AffichageLignesFinales("DESTINATION", CheminFichierDestination) FIN verif est chaîne SI VerifDernierCaractère(CheminFichierDestination,dernierCaractère) ALORS verif=Vrai SINON verif=Faux FIN SI AvecTrace ALORS Info("Vérifiez la trace !") FIN SI fSupprime(CheminFichierDestination) ALORS RENVOYER verif SINON SI AvecTrace ALORS Trace("Suppression impossible de "+CheminFichierDestination) RENVOYER Faux FIN SINON fSupprime(CheminFichierDestination) SI AvecTrace ALORS Trace("Taille différente du source et de la destination") RENVOYER Faux FIN SINON SI AvecTrace ALORS Trace("renommage impossible de: "+ CheminfichierSource+RC+"en"+RC+ CheminFichierDestination) RENVOYER Faux FIN
PROCEDURE INTERNE AffichageLignes(Fichier,Cheminfichier,TailleDuFichier) Trace("") Trace("***************************************************************************************") Trace("FICHIER "+Fichier+": Affichage des premières lignes pour comparaison") Trace("***************************************************************************************") Trace("") IDFichier2 est entier = fOuvre(Cheminfichier) c est un entier sur 8 octets t est un chaîne ANSI fPositionne(IDFichier2,0,fpDébut) POUR c=1 À TailleDuFichier PAS 100 t=fLit(IDFichier2,100) Trace(c,t) SI c>=1000 ALORS SORTIR FIN FIN fFerme(IDFichier2) FIN
PROCEDURE INTERNE AffichageLignesFinales(Fichier,Cheminfichier) Trace("") Trace("***************************************************************************************") Trace("FICHIER "+Fichier+": Affichage des dernières lignes pour comparaison") Trace("***************************************************************************************") Trace("") IDFichier3 est entier = fOuvre(Cheminfichier) c est un entier sur 8 octets t est un chaîne ANSI fPositionne(IDFichier3,-100,fpFin) t=fLit(IDFichier3,100) Trace(c,t) fFerme(IDFichier3) FIN
PROCEDURE INTERNE VerifDernierCaractère(cheminFichier,dernier) IDFichier1 est entier = fOuvre(cheminFichier) t est un chaîne ANSI fPositionne(IDFichier1,-1,fpFin) t=fLit(IDFichier1,1) fFerme(IDFichier1) SI t=dernier RENVOYER Vrai FIN RENVOYER Faux FIN |
| |
| |
| | | |
|
| | |
| |
Membro registado 1.275 mensagems |
|
Publicado em abril, 28 2025 - 1:52 PM |
ElPato a écrit :
Bonjour La commande powershell cypher peut s'avérer utile. Mais les remarques de André et Fabrice m’ont inspiré pour traiter un seul fichier. J’ai développé cette procédure et j’attends vos commentaires… ElPato Procedure DetruireFichier(CheminfichierSource est chaîne) AvecTrace est un booléen=Vrai Sablier(Vrai) SI PAS fFichierExiste(CheminfichierSource) ALORS SI AvecTrace ALORS Trace(CheminfichierSource+" pas trouvé") RENVOYER Faux FIN disque est chaîne = fExtraitChemin(CheminfichierSource,fDisque) repertoire est chaîne = fExtraitChemin(CheminfichierSource,fRépertoire) SI disque~="" ALORS disque=fDisqueEnCours() SI repertoire~="" ALORS repertoire=fExtraitChemin(fRepEnCours(),fRépertoire) CheminFichierDestination est chaîne = disque+repertoire+DonneGUID(guidBrut) IDFichier est un entier ResEcriture est un entier texteDeRemplacement est chaîne ANSI caractèreDeRemplacement est chaîne = "A" dernierCaractère est chaîne = "Z" TailleDuFichierSource est entier sur 8 octets = fTaille(CheminfichierSource) TailleDuFichierDestination est entier sur 8 octets TailleAnalysée est entier sur 8 octet = 1 000 000 000 NombreDeTours,compteur est entier reste est entier SI AvecTrace ALORS Trace("Disque="+disque) Trace("Répertoire="+repertoire) Trace("Source="+CheminfichierSource) Trace("Destination:"+CheminFichierDestination) AffichageLignes("SOURCE",CheminfichierSource,TailleDuFichierSource) FIN SELON TailleDuFichierSource CAS < TailleAnalysée texteDeRemplacement = Complete(texteDeRemplacement,TailleDuFichierSource,caractèreDeRemplacement) IDFichier = fOuvre(CheminfichierSource, foLectureEcriture) SI IDFichier<>-1 ResEcriture = fEcrit(IDFichier,texteDeRemplacement,TailleDuFichierSource-1) ResEcriture = fEcrit(IDFichier,dernierCaractère,1) SINON SI AvecTrace ALORS Trace("Erreur écriture") fFerme(IDFichier) RENVOYER Faux FIN fFerme(IDFichier) AUTRES CAS IDFichier = fOuvre(CheminfichierSource,foLectureEcriture) NombreDeTours = PartieEntière(TailleDuFichierSource/TailleAnalysée) reste = TailleDuFichierSource-(TailleAnalysée* NombreDeTours) texteDeRemplacement = Complete(texteDeRemplacement,TailleAnalysée,caractèreDeRemplacement) SI IDFichier<>-1 ALORS POUR compteur=1 À NombreDeTours ResEcriture=fEcrit(IDFichier,texteDeRemplacement,TailleAnalysée) SI ResEcriture<>-1 ALORS SI AvecTrace ALORS Trace("tour="+compteur+"/"+NombreDeTours) SINON SI AvecTrace ALORS Trace("Erreur écriture") fFerme(IDFichier) RENVOYER Faux FIN FIN ResEcriture = fEcrit(IDFichier,texteDeRemplacement,reste-1) ResEcriture = fEcrit(IDFichier,dernierCaractère,1) fFerme(IDFichier) SINON fFerme(IDFichier) RENVOYER Faux FIN FIN SI fRenomme(CheminfichierSource,CheminFichierDestination) ALORS TailleDuFichierDestination=fTaille(CheminFichierDestination) SI TailleDuFichierSource=TailleDuFichierDestination ALORS SI AvecTrace ALORS AffichageLignes("DESTINATION",CheminFichierDestination,TailleDuFichierDestination) AffichageLignesFinales("DESTINATION", CheminFichierDestination) FIN verif est chaîne SI VerifDernierCaractère(CheminFichierDestination,dernierCaractère) ALORS verif=Vrai SINON verif=Faux FIN SI AvecTrace ALORS Info("Vérifiez la trace !") FIN SI fSupprime(CheminFichierDestination) ALORS RENVOYER verif SINON SI AvecTrace ALORS Trace("Suppression impossible de "+CheminFichierDestination) RENVOYER Faux FIN SINON fSupprime(CheminFichierDestination) SI AvecTrace ALORS Trace("Taille différente du source et de la destination") RENVOYER Faux FIN SINON SI AvecTrace ALORS Trace("renommage impossible de: "+ CheminfichierSource+RC+"en"+RC+ CheminFichierDestination) RENVOYER Faux FIN
PROCEDURE INTERNE AffichageLignes(Fichier,Cheminfichier,TailleDuFichier) Trace("") Trace("***************************************************************************************") Trace("FICHIER "+Fichier+": Affichage des premières lignes pour comparaison") Trace("***************************************************************************************") Trace("") IDFichier2 est entier = fOuvre(Cheminfichier) c est un entier sur 8 octets t est un chaîne ANSI fPositionne(IDFichier2,0,fpDébut) POUR c=1 À TailleDuFichier PAS 100 t=fLit(IDFichier2,100) Trace(c,t) SI c>=1000 ALORS SORTIR FIN FIN fFerme(IDFichier2) FIN
PROCEDURE INTERNE AffichageLignesFinales(Fichier,Cheminfichier) Trace("") Trace("***************************************************************************************") Trace("FICHIER "+Fichier+": Affichage des dernières lignes pour comparaison") Trace("***************************************************************************************") Trace("") IDFichier3 est entier = fOuvre(Cheminfichier) c est un entier sur 8 octets t est un chaîne ANSI fPositionne(IDFichier3,-100,fpFin) t=fLit(IDFichier3,100) Trace(c,t) fFerme(IDFichier3) FIN
PROCEDURE INTERNE VerifDernierCaractère(cheminFichier,dernier) IDFichier1 est entier = fOuvre(cheminFichier) t est un chaîne ANSI fPositionne(IDFichier1,-1,fpFin) t=fLit(IDFichier1,1) fFerme(IDFichier1) SI t=dernier RENVOYER Vrai FIN RENVOYER Faux FIN
Si ça peut aider, voici le code de ma propre procédure de Destruction;
Procedure DetruireFichier(sFichier est une chaîne)
SI OuiNon("Voulez-vous détruire les fichiers sélectionnés?") = Oui ALORS nIDFichier est un entier nTaille est un entier = fTaille(sFichier) sChaîneEcriture est une chaîne = Répète(0, nTaille)
sChemin est une chaîne = fExtraitChemin(sFichier, fRépertoire) sNouveauNom est une chaîne = sChemin + "Null.txt" fRenomme(sFichier, sNouveauNom)
nIDFichier = fOuvre(sNouveauNom, foEcriture) SI nIDFichier <> -1 ALORS
SI fEcrit(nIDFichier, &sChaîneEcriture, Taille(sChaîneEcriture)) = Faux ALORS RENVOYER Faux FIN SI fFerme(nIDFichier) = 0 ALORS SI fSupprime(sNouveauNom) = Faux ALORS RENVOYER Faux FIN FIN SINON RENVOYER Faux FIN RENVOYER Vrai FIN RENVOYER Faux
-- Jean Turcotte WX 2025 |
| |
| |
| | | |
|
| | | | |
| | |
|