@@ -35,13 +35,15 @@ def initialize(info={})
35
35
register_options (
36
36
[
37
37
OptBool . new ( 'ZERO' , [ false , 'Zero overwrite. If set to false, random data will be used' , false ] ) ,
38
+ OptInt . new ( 'ITERATIONS' , [ false , 'The number of overwrite passes' , 1 ] ) ,
38
39
OptString . new ( 'FILE' , [ true , 'File to be deleted' , '' ] )
39
40
] , self . class )
40
41
end
41
42
42
43
43
44
def run
44
45
type = 1
46
+ n = datastore [ 'ITERATIONS' ]
45
47
file = datastore [ 'FILE' ]
46
48
47
49
if datastore [ 'ZERO' ] ==true
@@ -53,9 +55,9 @@ def run
53
55
print_error ( "File #{ file } does not exist" )
54
56
return
55
57
elsif comp_encr ( file )
56
- print_status ( "File compress or encrypted. Content could not be overwritten" )
58
+ print_status ( "File compress or encrypted. Content could not be overwritten! " )
57
59
end
58
- file_overwrite ( file , type )
60
+ file_overwrite ( file , type , n )
59
61
end
60
62
61
63
@@ -76,7 +78,7 @@ def size_on_disk(file)
76
78
print_status ( "Size of the file: #{ size_file } " )
77
79
78
80
if ( size_file <800 )
79
- print_status ( "The file is too small. If it's store in the MTF (NTFS) sdel will not overwrite it" )
81
+ print_status ( "The file is too small. If it's store in the MTF (NTFS) sdel will not overwrite it! " )
80
82
end
81
83
82
84
sizeC = size_cluster ( )
@@ -101,34 +103,41 @@ def change_mace(file)
101
103
client . priv . fs . set_file_mace ( file , date , date , date , date )
102
104
end
103
105
104
-
105
106
#Function to overwrite the file
106
- def file_overwrite ( file , type )
107
+ def file_overwrite ( file , type , n )
107
108
#FILE_FLAG_WRITE_THROUGH: Write operations will go directly to disk
108
109
r = client . railgun . kernel32 . CreateFileA ( file , "GENERIC_WRITE" , "FILE_SHARE_READ|FILE_SHARE_WRITE" , nil , "OPEN_EXISTING" , "FILE_FLAG_WRITE_THROUGH" , 0 )
109
110
handle = r [ 'return' ]
110
111
real_size = size_on_disk ( file )
111
112
112
- #http://msdn.microsoft.com/en-us/library/windows/desktop/aa365541(v=vs.85).aspx
113
- client . railgun . kernel32 . SetFilePointer ( handle , 0 , nil , "FILE_BEGIN" )
114
-
115
113
if type ==0
116
114
random = "\0 " *real_size
117
- else
118
- random = Rex ::Text . rand_text ( real_size , nil )
119
115
end
120
116
121
- #http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx
122
- w = client . railgun . kernel32 . WriteFile ( handle , random , real_size , 4 , nil )
117
+ i = 0
118
+ n . times do
119
+ i +=1
120
+ print_status ( "Iteration #{ i . to_s } /#{ n . to_s } :" )
123
121
124
- if w [ 'return' ] ==false
125
- print_error ( "The was an error writing to disk, check permissions" )
126
- return
122
+ if type ==1
123
+ random = Rex ::Text . rand_text ( real_size , nil )
124
+ end
125
+
126
+ #http://msdn.microsoft.com/en-us/library/windows/desktop/aa365541(v=vs.85).aspx
127
+ client . railgun . kernel32 . SetFilePointer ( handle , 0 , nil , "FILE_BEGIN" )
128
+
129
+ #http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx
130
+ w = client . railgun . kernel32 . WriteFile ( handle , random , real_size , 4 , nil )
131
+
132
+ if w [ 'return' ] ==false
133
+ print_error ( "The was an error writing to disk, check permissions" )
134
+ return
135
+ end
136
+
137
+ print_status ( "#{ w [ 'lpNumberOfBytesWritten' ] } bytes overwritten" )
127
138
end
128
139
129
- print_status ( "#{ w [ 'lpNumberOfBytesWritten' ] } bytes overwritten" )
130
140
client . railgun . kernel32 . CloseHandle ( handle )
131
-
132
141
change_mace ( file )
133
142
134
143
#Generate a long random file name before delete it
0 commit comments