as you probably know, Windows does not actually delete the files and folders,
he only declare, in the allocation table, the place of a given file is free
but the file is still accessible even after deletion!
with for example, TestDisk or Recuva etc ...
Pure_wipe_FreeSpace 3 will create a folder "wipe_FreeSpace"
and fill it with a multitude of file 10 megabytes!
these files are files filled with random characters
The folder will be filled up to saturate the hard disk!
However, it will leave a margin of safety of 500 mega
then the file will be deleted!
this process will effectively write and overwrite the files still present in the free area of the hard disk!
Recuva, and any recovery software, can no longer recover anything!
in French :
un programme pour effacer la zone libre d'un disque Dur ou carte SD NTFS
comme vous le savez surement, windows n'efface pas vraiment les fichiers et dossiers,
il ne fait que declarer, dans la table d'allocation ,que la place , de tel ou tel fichier est libre
mais le fichier est toujours accessible, meme apres effacement !
avec par exemple ,Recuva ou TestDisk etc ...
Pure_wipe_FreeSpace 3 va creer un dossier "wipe_FreeSpace"
et le remplir, d'une multitude de fichiers de 10 mega octets !
ces fichiers sont des fichiers rempli de caracteres aleatoire
Le dossier sera rempli jusqu'a saturer le disque dur !
il laissera cependant une marge de securité de 500 mega
puis le dossier sera effacé !
ce procédé aura pour effet d'ecrire et d'ecraser, les fichiers encore present dans la zone libre du Disque dur !
Recuva, et tout les logiciels de recupération, ne pourront plus rien recupérer !
le Code :
Code: Select all
;***********************************************
;Titre :*Pure_wipe_FreeSpace 3
;Auteur : Dobro
;Date :01/02/2016
;Heure :12:37:56
;Version Purebasic : PureBasic 5.30 (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
; information :
; *********************************
; COMPILEZ EN MODE
;THREAD SAFE OFF
; 32 BITS
; NON UNICODE
; *********************************
; Principe de fonctionnement :
;le bouton [x] sert a effacer le fichier temporaire "wipe_FreeSpace.go" si celui ci survivait en fin de traitement
; si le traitement est interrompu ,le fichier temporaire "wipe_FreeSpace.go" est en principe effacé par le prg
; il sera effacé a la fin du programme si tout se deroule normalement....
; il y a 1 passes
; passe 1 = ecriture dans le dossier temporaire "wipe_FreeSpace" de fichiers contenant des valeur aleatoire
; l'ecriture se fait par fichiers de 100 megas octets
; c'est le fait de creer pleins de fichiers , qui va donc ecrire sur l'espace libre de votre disque (et la table d'allocation !! )
; jusqu'a le remplir quasi entierement !!
; et ainsi effacer les anciennes valeurs et fichiers qui peuvent encore y etre ...
; comme on ecrit des fichiers remplis de valeurs aleatoire, en principe , aucun recuperateur de fichier genre "Recuva" ne peut
; ramener de la zone libre des fichiers ayant été effacé par windows ....
; ensuite :
; effacement du dossier temporaire "wipe_FreeSpace" et donc de tout les fichiers bidon qu'il contient
; ce qui aura pour effet de vous rendre la partie libre du disque ayant été remplis par le dossier temporaire "wipe_FreeSpace"
; la partie libre du disque est de nouveau sans fichiers, et donc pas de possibilité d'espionner vos données effacées :o)
;***********************************************
;{- Enumerations / DataSections
;{ Windows
Enumeration
#Win
#file
EndEnumeration
;}
;{ Gadgets
Enumeration
#Text_Auteur
#Text_Titre
#Button_wipe
#button_erase_temp
#Explorer_drive
#bar
#sys_on_off
#Text_info
#Font_Text_Titre
#text_taille_file
EndEnumeration
;}
Define.l Event
;}
;-declares
Declare openwindow_win()
Declare Alea()
Declare event(drive.s)
Declare wipe_free_space(drive.s)
Declare.s taille_disque(drive.s,mode)
Declare stop_sys(Param.l)
Declare Creation_fichier(drive.s)
global drive.s ,aleat.s="" ,sys_on_off.i=#PB_CheckBox_Unchecked ,compteur=0
Global Dossier.s="wipe_FreeSpace\"
drive.s="c:\"
OpenWindow_Win()
;{- Event loop
Repeat
Event = WaitWindowEvent(12)
Select Event
; ///////////////////
Case #PB_Event_Gadget
Select EventGadget()
Case #Text_Auteur
Case #button_erase_temp
if FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")<>-1
SetGadgetText(#Text_info, "effacement du dossier temporaire")
DeleteDirectory(drive.s+Dossier.s,"*.*",#PB_FileSystem_Force ) ; efface le dossier temporaire
SetGadgettext(#text_taille_file,"*")
SetGadgetText(#Text_info, "")
Endif
Case #Button_wipe
drive.s=LCase(GetGadgetText(#Explorer_drive))
;if drive.s<>"c:\" ; securité pour eviter l'emploi du drive systeme
if Drive.s<>""
wipe_Free_Space(drive.s)
Endif
; Else
; MessageRequester("attention","Utilisez un autre lecteur que celui du systeme")
; Endif
Case #Explorer_drive
drive.s=GetGadgetText(#Explorer_drive)
Case #sys_on_off
sys_on_off.i=GetGadgetState(#sys_on_off)
EndSelect
; ////////////////////////
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Win
CloseWindow(#Win)
if FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")<>-1
SetGadgetText(#Text_info, "effacement du dossier temporaire")
DeleteDirectory(drive.s+Dossier.s,"*.*",#PB_FileSystem_Force ) ; efface le dossier temporaire
SetGadgettext(#text_taille_file,"*")
SetGadgetText(#Text_info, "")
Endif
Break
EndSelect
EndSelect
Forever
;
;}
;-Zone Procedures
Procedure OpenWindow_Win()
If OpenWindow(#Win, 483, 140, 220, 176, "Pure_Wipe_FreeSpace", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
; If CreateGadgetList(WindowID(#Win))
TextGadget(#Text_Titre, 15, 5, 195, 20, "Pure_Wipe_FreeSpace 3 ")
CheckBoxGadget(#sys_on_off, 15,25, 150, 20, "extinction PC") :GadgetToolTip(#sys_on_off, "si coché , eteinds l'ordi a la fin du traitement")
TextGadget(#Text_Auteur, 170, 156,100, 20, "By Dobro")
TextGadget(#text_taille_file, 5, 155, 165, 20, "*")
TextGadget(#Text_info, 10, 80, 200, 20, "")
ButtonGadget(#button_wipe, 10, 105, 90, 30, "Wipe_Space") :GadgetToolTip(#button_wipe, "lance le néttoyage de la zone libre du disque")
ButtonGadget(#button_erase_temp, 180, 105, 30, 30, "X"):GadgetToolTip(#button_erase_temp, "Efface manuellement le dossier temporaire au cas ou il serai encore present")
ExplorerComboGadget(#Explorer_drive, 35, 45, 150, 30, "c:\", #PB_Explorer_DrivesOnly)
ProgressBarGadget(#bar, 10, 140, 200, 10, 0, 100) :GadgetToolTip(#bar, "Indique l'etat d'avancement du processus")
; Gadget Fonts
SetGadgetFont(#Text_Titre, LoadFont(#Font_Text_Titre, "Microsoft Sans Serif", 11, #PB_Font_Bold|#PB_Font_HighQuality))
;EndIf
EndIf
EndProcedure
Procedure Creation_fichier(drive.s)
CreateDirectory(drive.s+Dossier.s)
SetGadgetText(#Text_info, "ecriture du fichier de ref")
if OpenFile(#file,drive.s+Dossier.s+"wipe_FreeSpace.go")
For i=1 to 100 ; on va ecrire 100 fois 100 kilo donc chaque fichiers fera 10 mega ... ecrire des fichier trop gros ralenti considérablement le prg
if WritestringN( #file,aleat.s)=0
MessageRequester("Attention","erreur d'ecriture"+chr(10)+"utilisez le bouton [x] avant de quitter le prg")
CloseFile (#file)
ProcedureReturn
Endif
Next i
CloseFile (#file)
Endif
EndProcedure
procedure wipe_Free_Space(drive.s)
; By Dobro
if FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")<>-1
SetGadgetText(#Text_info, "effacement du dossier temporaire")
DeleteDirectory(drive.s+Dossier.s,"*.*",#PB_FileSystem_Force ) ; efface le dossier temporaire
SetGadgettext(#text_taille_file,"*")
SetGadgetText(#Text_info, "")
Endif
taille_restante.f=Valf(taille_disque(drive.s,1))*1024 ; en mega
Setgadgettext(#Button_wipe,"Stop")
if Alea() =1
Setgadgettext(#Button_wipe,"Wipe_Space")
SetGadgetState(#bar,0)
ProcedureReturn
Endif
SetGadgetAttribute(#bar,#PB_ProgressBar_Maximum,taille_restante.f)
SetGadgetState(#bar, 1)
WaitWindowEvent(1)
; UpdateWindow_(GadgetID(#bar))
; ecriture
Creation_fichier(drive.s)
compteur=0
SetGadgetText(#Text_info, "copie du fichier :"+str(compteur))
While taille_restante.f>500 ; minimum qu'on laisse en mega par securité
compteur=compteur+1
CopyFile(drive.s+Dossier.s+"wipe_FreeSpace.go", drive.s+Dossier.s+"wipe_FreeSpace"+str(compteur)+".go")
SetGadgetText(#Text_info, "copie du fichier :"+str(compteur))
taille_restante.f=Valf(taille_disque(drive.s,1))*1024
taille_fichier.f=taille_fichier.f+FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")/1024/1024 +FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go"+str(compteur))/1024/1024
SetGadgettext(#text_taille_file,strf(taille_fichier.f,2)+" Mo"+" <-> "+strf(taille_restante.f,2)+" Mo")
SetGadgetState(#bar, taille_fichier)
if event(drive.s) =1 ; vide les event, et verifie si on demande l'arret du processus
Setgadgettext(#Button_wipe,"Wipe_Space")
SetGadgetState(#bar,0)
ProcedureReturn
Endif
Wend
SetGadgetText(#Text_info, "terminé !")
if FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")<>-1
SetGadgetText(#Text_info, "effacement du dossier temporaire")
DeleteDirectory(drive.s+Dossier.s,"*.*",#PB_FileSystem_Force ) ; efface le dossier temporaire avant de quitter Pur_Wipe_FreeSpace
SetGadgettext(#text_taille_file,"*")
SetGadgetText(#Text_info, "")
Endif
if sys_on_off=#PB_CheckBox_Checked
stop_sys(2)
Endif
EndProcedure
Procedure.s taille_disque(drive.s,mode)
; mode=0 =taille du disque
;mode=1 = espace libre restant
Structure int64
Long1.l
Long2.l
EndStructure
; this prevents the 'please insert drive' requester.
; GetDiskFreeSpaceEx_() will just return 0 if the drive is not avaiable,
; without a prompt to the user:
SetErrorMode_(#SEM_FAILCRITICALERRORS)
If GetDiskFreeSpaceEx_(@drive.s, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64) = 0
MessageRequester("","Drive not ready!",0)
End
EndIf
; reset the error behaviour
SetErrorMode_(0)
; calculate sizes in mb.
select mode
Case 0
TotalMB = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12)
ProcedureReturn strf(TotalMB/1000,2)
Case 1
FreeMB = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12)
ProcedureReturn strf(FreeMB/1000,2)
EndSelect
EndProcedure
Procedure event(drive.s)
select WaitWindowEvent(1)
case #PB_Event_Gadget
Select EventGadget()
Case #Button_wipe
SetGadgetText(#Text_info, "processus Stopé")
if FileSize(drive.s+Dossier.s+"wipe_FreeSpace.go")<>-1
SetGadgetText(#Text_info, "effacement du dossier temporaire")
DeleteDirectory(drive.s+Dossier.s,"*.*",#PB_FileSystem_Force ) ; efface le dossier temporaire
SetGadgettext(#text_taille_file,"*")
SetGadgetText(#Text_info, "")
Endif
MessageRequester("information","le processus est annulé , le fichier temporaire a été effacé")
ProcedureReturn 1
EndSelect
EndSelect
EndProcedure
Procedure Alea()
; By Dobro
SetGadgetText(#Text_info, "fabrication du random")
SetGadgetAttribute(#bar,#PB_ProgressBar_Maximum,1024*100)
For i=1 to 1024*100 step 1024 ; 100 kilo par lignes
For col=1 to 1024
aleat.s=aleat.s+chr(random(250,32)) ; une ligne egale 100 kilo octet (on ecrit 1024 caracteres a la fois soit 1 kilo x 100)
Next col
SetGadgetState(#bar, i)
; UpdateWindow_(GadgetID(#bar))
if event(drive.s) =1 ; vide les event, et verifie si on demande l'arret du processus
Setgadgettext(#Button_wipe,"Wipe_Space")
SetGadgetState(#bar,0)
ProcedureReturn 1
Endif
Next i
EndProcedure
Procedure stop_sys(Param.l)
; Code Le Soldat inconnu
; Mis en Pb4.00 par Dobro
; Param = paramètre d'instinction de l'ordinateur
; 1 : quitter session
; 2 : arrêter
; 3 : redémarrer
#TOKEN_ADJUST_PRIVILEGES = 32
#TOKEN_QUERY = 8
#SE_PRIVILEGE_ENABLED = 2
#EWX_LOGOFF = 0
#EWX_SHUTDOWN = 1
#EWX_REBOOT = 2
#EWX_FORCE = 4
#EWX_POWEROFF = 8
Structure MyLUID
lowpart.l
highpart.l
Attributes.l
EndStructure
Structure MyTOKEN
PrivilegeCount.l
lowpart.l
highpart.l
Attributes.l
EndStructure
Protected hdlTokenHandle.l, tmpLuid.MyLUID, tkp.MyTOKEN, tkpNewButIgnored.MyTOKEN, lBufferNeeded.l
OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle)
SysName.s = "" + Chr(0)
Name.s = "SeShutdownPrivilege" + Chr(0)
LookupPrivilegeValue_(SysName, Name, @tmpLuid)
tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED
tkp\PrivilegeCount = 1
tkp\lowpart = tmpLuid\lowpart
tkp\highpart = tmpLuid\highpart
tkp\Attributes = tmpLuid\Attributes
AdjustTokenPrivileges_(hdlTokenHandle, 0, @tkp, SizeOf(MyTOKEN), @tkpNewButIgnored, @lBufferNeeded)
Select Param
Case 1 : ExitWindowsEx_(#EWX_LOGOFF | #EWX_FORCE, 0)
Case 2 : ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0)
Case 3 : ExitWindowsEx_(#EWX_REBOOT | #EWX_FORCE, 0)
EndSelect
EndProcedure
; Epb


