为什么下面的代码删除文件后,还可用 360 软件恢复回来(已亲测)?难道要用 mmap 模块吗?
#--------------------------------------------------
import tkinter.filedialog as tf
def selecFile(title='多文件选择',fmt='.'):
'''(多个)文件选择(对话框) 返元组 取消时返空'''
return tf.askopenfilenames(title=title,filetypes=[('all files',fmt)])
def myRemoveFiles():
'''彻底删除文件'''
paths = selecFile(title='选择要删除的文件') #
if paths:
if tm.askokcancel('重要提示!','确定永久删除吗?'):
fn = '_Test{}_.tmp'
_dir = os.path.dirname(paths[0])
for i, _file in enumerate(paths):
try:
fsize = os.path.getsize(_file)
with open(_file,'rb+') as f:
for _ in range(3):
f.seek(0,0)
f.write(os.urandom(fsize))
file = os.path.abspath(os.path.join(_dir,fn.format(i)))
os.rename(_file,file)
os.remove(file)
print(_file,"OK")
except Exception as err:
print(_file,str(err))
1
springmarker 2017-08-27 11:57:06 +08:00
要覆盖掉文件在磁盘的数据才行吧
|
2
disk 2017-08-27 12:10:44 +08:00 via Android
要直接磁盘访问,不能只是删记录,把文件所在扇区多次写入随机数据就行
|
3
XiaoFaye 2017-08-27 12:11:10 +08:00
直接把文件内容改了不就行了?原来的肯定找不回来了。
|
4
metorm 2017-08-27 12:15:27 +08:00
恢复回来倒是可以,但是恢复回来的文件应该已经是乱码了吧?
|
5
imn1 2017-08-27 12:19:29 +08:00
粉碎机是必须抹盘的
删除或彻底删除只是把原来文件在磁盘的位置,标记为可用空间而已 覆盖实质只是“另存”,然后把文件索引指向新的位置,原来的位置标记为可用 |
6
NoAnyLove 2017-08-27 12:21:02 +08:00
比较好奇,如果直接对文件操作,而不是直接对磁盘访问,能保证覆写文件的时候,覆盖的是相同的硬盘区域吗?
|
7
panda1001 2017-08-27 12:34:53 +08:00 via Android 1
用勒索病毒试试
|
8
metorm 2017-08-27 12:46:35 +08:00
@imn1
然而,楼主这种方法,如果是 360 恢复这种软件,按文件名寻找丢失的文件,寻找回来的应该是已经被随机写入过的版本吧?我猜原版的文件还在,但已经没法用文件名寻找了。 |
10
explist OP |
11
explist OP 为了进一步验证,我把上面函数中关于重命名及删除文件的代码注释掉,执行完后,原文件大小不变,内容为乱码!!
为什么恢复后却是原本的内容而不是乱码? |
12
RqPS6rhmP3Nyn3Tm 2017-08-27 15:13:11 +08:00 via iPhone
Python 吗
Os.system("shred your_file") 解决问题 |
13
explist OP 我们对指针进行再操作的时候,肯定会覆盖(破坏)指针指向地址的数据,那么对于文件对象为什么从文件首开始写操作,不能破坏其数据?
那么利用 mmap 模块,对文件建立内存映射,再对映射进行全员覆盖,这样会有不同吗? |
14
ryd994 2017-08-27 15:29:14 +08:00 via Android
|
15
SlipStupig 2017-08-27 15:31:28 +08:00
360 文件粉碎机是直接摘除文件系统 cluster 索引,文件系统无法定位到这个文件,更别说恢复,你上无法恢复内容,用 python 实现的话,有点麻烦,你得解析到该文件在 ntfs 相对物理盘地址和文件偏移量大小,然后随机填充 0 和 1,30 次以上,基本上来说就恢复不了
|
16
ryd994 2017-08-27 15:33:20 +08:00 via Android
做个实验:
写 0 并格式化一个 U 盘(保证没有干扰) 写一个文件,看能不能找到 覆盖完不要删除,看能不能找到 最后人工删除,看能不能找到 |
17
likuku 2017-08-27 16:01:16 +08:00
好奇对于类似 ZFS/AppleFS 这种 WAL 的 FS,
在不填满整个 storage pool 的前提下如何覆盖已删除文件的数据块? |
18
antowa 2017-08-27 16:19:19 +08:00
先加密后删除。即使恢复了那么数据没有意义。这样思路不是更简洁?
|
19
explist OP def myRemoveFiles():
'''彻底删除文件''' paths = selecFile(title='选择要删除的文件') # if paths: if tm.askokcancel('重要提示!','确定永久删除吗?'): fn = '_Test{}_.tmp' _dir = os.path.dirname(paths[0]) for i, _file in enumerate(paths): try: # fsize = os.path.getsize(_file) # with open(_file,'rb+') as f: # for _ in range(3): # f.seek(0,0) # f.write(os.urandom(fsize)) fd = os.open(_file,os.O_RDWR) with mmap.mmap(fd,0,access=mmap.ACCESS_WRITE) as m: m.write(os.urandom(m.size())) m.flush() os.close(fd) file = os.path.abspath(os.path.join(_dir,fn.format(i))) os.rename(_file,file) os.remove(file) print(_file,"OK") except Exception as err: print(_file,str(err)) |
20
explist OP 用 mmap 时未发现能恢复
|
21
jhaohai 2017-08-27 19:56:42 +08:00
抹盘,全写 0 三十遍
|