文章作者:wened
DataExplore软件支持脚本操作,编写Javascript脚本可以实现复杂的磁盘扇区查找,可以把特定的扇区复制成文件等,达到恢复数据的目的.
运行DataExplore后,在工具条上有个"脚本"按钮,点出脚本视图,左边是代码编辑窗口,右边是执行按钮和进度条,下面是代码执行的输出信息,可
以输出扇区位置等等.
本人将陆续放上编写好的脚本文件,会说明使用场合,功能,希望对大家有所帮助.
脚本接口函数说明:
1. int Msg(LPSTR lpszMsg);
弹出消息,消息内容是 lpszMsg 指向的字符串,如果想弹出消息框显示"您好",就这样调用: DataExplore.Msg("您好");
2. int SetState(LPSTR lpszMsg);
设置进度条的文本状态(很少使用)
3. int OpenDisk(LPSTR szDriverName);
打开磁盘或普通文件,磁盘需要在Window下能看到的.
文件: 如果想打开文件,可以输入文件的全路径,如 DataExplore.OpenDisk("C:\\Folder\\Disk.img"); 将打开 C:\Folder\Disk.img文件.多个
文件可以当成一个大文件打开,各个文件间以分号";"隔开,比如一个分区做成2个镜像文件,可以这样打开:
DataExplore.OpenDisk("C:\\Disk01.img;C:\\Disk02.img");
磁盘: 硬盘0 -> HD0 ,硬盘1 -> HD1 ,C盘 -> C: ,D盘 -> D: 依次类推, 如打开硬盘0: DataExplore.OpenDisk("HD0");
4. int CloseDisk();
关闭磁盘文件,对应于 OpenDisk
5. int ReadSector(int nSectorNo,int nOffSize);
读取扇区的某个字节,输入参数里 nSectorNo 表示读取的扇区号, nOffSize 表示该字节在扇区里的位置, 返回的是读出的字节,比如要读取63
扇区的第128字节: v = DataExplore.ReadSector(63,127); 注意在Jscript里面索引下标都是从0 开始的,这里的127(从0)表示是第128(从1计
数)字节
6. int WriteSector(int nSectorNo,int nValue,int nOffSize);
写入磁盘扇区,该函数未实现,安全方面考虑的
7. int FlushDisk(int nSectorNo);
批写入磁盘扇区,该函数未实现,安全方面考虑的
8. int OpenFile(LPSTR szFilePathName,int nFormat);
打开普通的文件
szFilePathName : 文件的路径名称, 如: C:\\Folder\\Data.img
nFormat : 打开文件的方式,可以是 FILE_READ,FILE_WRITE,FILE_READWRITE,FILE_CREATE,FILE_NOTRUNCATE,FILE_NOINHERIT 的组合方式
只读方式打开文件: DataExplore.OpenFile("C:\\File0.dat",FILE_READ);
写的方式打开文件: DataExplore.OpenFile("C:\\File0.dat",FILE_WRITE);
写的方式打开文件,如果该文件不存在就创建: DataExplore.OpenFile("C:\\File0.dat",FILE_WRITE|FILE_CREATE);
读写方式打开文件: DataExplore.OpenFile("C:\\File0.dat",FILE_READWRITE);
9. int CloseFile();
关闭打开的文件,对应于 OpenFile
10. int ReadFile();
从文件读出一个字节
11. int WriteFile(int nValue);
写入一个字节到文件
12. int SeekFile(int nOffSize,int nFormat);
设置文件指针的位置,一般很少用到这个函数
13. int FlushFile();
将文件缓存刷新到硬盘,一般很少用到,因为文件在关闭时会自己写入磁盘
14. int InsertColumn(int nCol,LPSTR lpszName);
往结果窗口中插入一列信息
nCol : 插入列的位置
lpszName : 列名
如在结果列表窗口中插入2列,第一列是开始扇区号,第二列是扇区信息:
DataExplore.InsertColumn(0,"开始扇区号");
DataExplore.InsertColumn(1,"扇区信息");
15. int DeleteAllItems();
删除结果窗口中的所有行
16. int InsertItem(int nItem,LPSTR lpszText);
往结果窗口插入一行
17. int SetItemText(int nItem,int nCol,LPSTR lpszText);
设置结果窗口中nItem行nCol列的文本
18. int GetItemCount();
得到结果窗口中的行数
19. BSTR GetItemText(int nItem,int nCol);
得到结果窗口中nItem行nCol列的文本
20. int SetSize();
刷新结果窗口的内容
21. int SetReadRemote(int bRemote);
设置是否读取远程数据
22. int ConnectRemote(LPSTR szIP);
连接远程主机,远程主机上需要运行DataExploreServer.exe,并且远程主机必须能ping通
如:
DataExplore.SetReadRemote(1);
DataExplore.ConnectRemote("192.168.0.1");
23. int CloseRemote();
关闭远程连接
24. int GetStop();
返回用户是否停止执行,如果用户在执行后按下停止按钮,本函数将返回 S_OK,否则返回 S_FALSE
25. void SetPos(int nPos);
设置进度条的当前进度
26. void SetRange(int nRange);
设置进度条的范围
27. int CopyFile(LPSTR szFileSour,LPSTR szFileDest);
复制磁盘的普通文件,可以实现chk后文件扩展名的辨认,如将文件A.dat复制到文件B.mp3:
DataExplore.CopyFile("C:\\A.dat","D:\\Folder\\B.mp3");
脚本恢复例子1:
收到一个mm的u盘镜像文件,情况是打印文件是感染病毒,删除u盘上的doc文档.
我用一般的方式看到被删除的文件,大小是0,开始簇号0,无法恢复,使用搜索doc文件,效果不好,就采取脚本的方式,思路是搜索到doc的文件头的话,就按连续扇区的的方式复制出数据到普通文件.在这个u盘里所有的以doc文件开头的扇区都被复制成200K大小的以doc为扩展名的文件,文件自动编号.
脚本文件下载:
http://k888.k989.com/wened/spt/sector2doc.txt
运行这个脚本,需要注意几个地方:
1.修改var path = "D:\\AAA\\"; 这是存放复制出来的文件存放的位置,默认需要在D盘下手工建立 AAA 文件夹. 您可以修改这个路径,让复制出来的文件存放到别的路径下,注意是 \\ 哦
2.修改 b = DataExplore.OpenDisk("d:\\usb"); 我现在使用的是镜像文件,如果您想直接读U盘,请改成U盘的盘符比如M盘: b = DataExplore.OpenDisk("M:");
3.修改 var sector_count = 200*1000/512; 默认是每个文件存成200K左右大小,200K大约是200*1000字节,每扇区的字节数是512,所有就除以512,得到要复制的扇区数目.
4.修改 var range = 128*1000*1000/512; 这是U盘文件的大小, 128M 的U盘,大小大约是 128*1000*1000 字节,换算成扇区数需要除以512.
5.修改 var ext = ".doc"; 默认的复制成的文件以doc为扩展名
6.修改 if( ar[0] == 208 && ar[1] == 207 ) DOC文件头的前2个字节分别是208和207,我只判断每个扇区的前2个字节,如果是和doc文件头匹配,就从这个扇区开始连续复制出sector_count个扇区成文件.您如果要恢复别的类型文件,请研究它的文件头,然后修改这里.
7.如果还有什么不明白,请跟帖提问.