level 12
恢复误删除文件的工具一大把,本文讲怎样自己写个程序来恢复误删除的代码。
仅限于误删除的代码,当然,原理看明白了,想恢复什么文件自己再写吧。
2013年04月26日 01点04分
1
level 12
先讲基本的:磁盘结构。
磁盘最小的存储单位是字节,但是可操作的最小单位是“扇区(Sector)”,每个扇区有固定的大小:512 字节。
常见文件系统的最小操作单位是“簇(Cluster)”,一个簇包含 N 个扇区,N 的值在格式化的时候可以设定。例如格式化时设定每个簇 4KB,那么就表示 N = 8。这时候即便文件只有 1 字节,也会占用整个 4KB 的簇。如果文件超过 4KB,那么文件会分别存放在不同的簇中,不一定连续存放。
2013年04月26日 01点04分
2
level 12
之所以将恢复代码文件,是因为代码文件的开头通常是 #include 或者 // 或者 /**** 一类,因为每个文件都会从簇的开始存放,所以只需要判断簇的开始几个字节是否是 #include 等字符,就可以判断这个簇中存放的是不是代码。当然,还可以判断整个簇中是否包含 printf 一类字符,这个判断自己在写程序的时候衡量吧。
PS:BMP 文件开头的两个字节是 "BM",zip 的文件头是 "PK"…… 自己探索吧。
2013年04月26日 01点04分
3
level 12
我想我只需要贴出来一个函数就够了吧:
#include <windows.h>
// 读取磁盘扇区
BOOL ReadSector(char cDrive, DWORD dwStartSector, LPBYTE lpSectBuff)
{
if (cDrive < 'A' || cDrive > 'Z')
return 0;
char devName[] = "\\\\.\\A:"; // 原字符串 \\.\A:
devName[4] =cDrive;
HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
DWORD dwCB;
BOOL bRet = ReadFile(hDev, lpSectBuff, 512, &dwCB, NULL);
CloseHandle(hDev);
return bRet;
}
// 主函数
void main()
{
// 定义缓冲区
unsigned char bBuf[512];
// 读取 F 盘第一个扇区至缓冲区
ReadSector('F', 0, bBuf);
// 剩下的可以自己分析 bBuf 的内容啦
}
需要注意的是:
1. 当前这个函数是读取指定扇区,包括“打开、读取、关闭”三个步骤。如果要连续读取,那么这个函数的性能是很低的,需要修改为“打开、读取、读取、读取、……、读取、关闭”,具体的,自己修改吧。
2. 函数返回值表示读取是成功还是失败。
3. 如果完善一点,还需要读取指定磁盘的容量,以及每个簇有几个扇区,等等,自己查资料吧。
4. 如果想列出文件夹结构,那么需要查阅相关磁盘格式。建议从 FAT32 格式开始学习,比较容易一些。
2013年04月26日 01点04分
4
level 12
忘了说恢复删除的原理: 文件删除时,不会将整个文件占用的空间全部清 0,只会在文件目录项中标记该文件被删除,空间可以被别的文件使用。所以,文件内容还在。恢复的时候,就要从磁盘中找到这个文件。但是因为删除的文件所占用的磁盘位置被标记为“未使用”,所以新的文件有可能会使用这部分空间。因此,误删除后,不要再使用该盘,如果新的文件将旧文件覆盖,那就回天乏术了。
2013年04月26日 03点04分
5
羡慕,嫉妒加恨的技术,膜拜中
2013年04月26日 06点04分