为什么下面的代码删除文件后,还可用 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 ![]() 用勒索病毒试试 |
![]() | 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 三十遍 |