找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 395|回复: 7

[【其它】] U盘数据恢复笔记(3)谁解其中味

[复制链接]
发表于 2023-7-28 18:39:39 | 显示全部楼层 |阅读模式
本帖最后由 天堂雨 于 2023-7-28 23:23 编辑

U盘数据恢复笔记(3)谁解其中味

U盘没有物理性损坏,R-Sdudio可找到大部分数据,下面用winhex结合R-Sdudio手工恢复根目录被破坏的数据.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2023-7-28 18:39:56 | 显示全部楼层
本帖最后由 天堂雨 于 2023-7-28 18:47 编辑

基础知识
EXFAT是微软开发设计的文件系统,详细见
https://learn.microsoft.com/zh-cn/windows/win32/fileio/exfat-specification
此文件是机器翻译的,读起来有些难理解.
可查看对应的英文原版

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2023-7-28 18:40:12 | 显示全部楼层
本帖最后由 天堂雨 于 2023-7-28 19:00 编辑

修订分区引导记录DBR
因为EXFAT分区前24扇区保留分区重要信息,现需手工重建.
其中第0扇区记录分区的基本信息,WINHEX的模板查看和修改,
1扇区至第8扇区仅在最后有55AA结束标记
9扇区至第10扇区全0填充
11扇区为校验码扇区,是4字节的前11扇区的校验码,其中分区参数的6AH(106)、6BH(107)两字节为分区卷标记,70H(112)分区卷不参与计算校验码。
使用WINHEX的脚本计算校验码

  
扇区
  
Offset
内容
0
0000H
DBR
1
0200H
仅55AA结束标记
2
0400H
仅55AA结束标记
3
0600H
仅55AA结束标记
4
0800H
仅55AA结束标记
5
0A00H
仅55AA结束标记
6
0C00H
仅55AA结束标记
7
0E00H
仅55AA结束标记
8
1000
仅55AA结束标记
9
1200H
全0填充
10
1400H
全0填充
11
1600H
校验码扇区
12
1800H
DBR备份
13
1A00H
仅55AA结束标记
14
1C00H
仅55AA结束标记
15
1E00H
仅55AA结束标记
16
2000H
仅55AA结束标记
17
2200H
仅55AA结束标记
18
2400H
仅55AA结束标记
19
2600H
仅55AA结束标记
20
2800H
仅55AA结束标记
21
2A00H
全0填充
22
2C00H
全0填充
23
2E00H
校验码扇区


  1. // 此文件用于计算 EXFAT  前11个扇区除106-106(磁盘标记2字节)和112磁盘使用百分比1字节之外的校验和
  2. //指定打开的驱动器,要选择正确的EXFAT所在分区的盘符驱动器!!!!
  3. Open :?
  4. Assign Checksum 0
  5. Assign BytesPerSector (512)
  6. Assign NumberOfBytes (BytesPerSector*11)
  7. MessageBox NumberOfBytes
  8. Assign Index 0
  9. Assign one_byte 0
  10. {
  11.    IfEqual 106 Index
  12.        Inc Index
  13.    EndIf
  14.    IfEqual 107 Index
  15.        Inc Index
  16.    EndIf
  17.    IfEqual 112 Index
  18.        Inc Index
  19.    EndIf
  20.    Assign hight_bit 0
  21.    IfEqual (Checksum&1) 1
  22.        Assign hight_bit 0x00000080
  23.    EndIf
  24.    Goto Index
  25.    Read one_byte 1
  26.    Assign Checksum (hight_bit+Checksum/2+one_byte)
  27.    IfEqual (NumberOfBytes-1) Index  
  28.        ExitLoop
  29.    EndIf
  30.    Inc Index
  31. }[unlimited]
  32. MessageBox Checksum
  33. //将校验和写入第11个扇区,校验和4字节,共计写512/4次
  34. Assign START_POS (512*11)
  35. Assign nums (512/4)
  36. Goto START_POS
  37. {
  38.     Write Checksum
  39. }[nums]
  40. //将校验和写入第23个扇区,校验和4字节,共计写512/4次
  41. Assign START_POS (512*23)
  42. Assign nums (512/4)
  43. Goto START_POS
  44. {
  45.     Write Checksum
  46. }[nums]
  47. //记得保存,修改才能生效
  48. //Save
复制代码
代码见上文,愿意友情支持积分的请付费下载.
将上述代码保存为DBR_boot_sector_checksum.whs放到winhex所在目录也是可以的


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2023-7-28 18:40:34 | 显示全部楼层
本帖最后由 天堂雨 于 2023-7-28 19:17 编辑

修订根目录特殊项


大写字符表$UpCase也需要在根目录项填写校验码,此处直接复制一个新格式化的U盘的$UpCase到第4扇区,修订根目录项82H的校验码
修订目录项82H$Bitmap簇位图数据
根据需要根目录下的卷标目录项83H,也可以不要卷标目录项





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2023-7-28 18:40:58 | 显示全部楼层
本帖最后由 天堂雨 于 2023-7-28 19:23 编辑

修订根目录文件夹等

根据R-STUDIO显示所在扇区,记录到excel表格中,转换计算出簇号

用winhex的85H等项目修订起始簇号,然后再计算校验码,并写入文件名校验码.
  1. // 此文件用于计算 EXFAT 文件目录的SetChecksum 字段校验和
  2. // 默认取SecondaryCount=2,即文件共计有32X(2+1)=96字节组成
  3. // 如文件名较长,应根据实际情况修改SecondaryCount值
  4. // 计算出结果后将数据填入目录条目的第2、3字节
  5. //根目录区域修改前
  6. //Offset           00  01  02  03  04  05  06  07    08  09  0A  0B  0C  0D  0E  0F
  7. //9830400(960000H):03  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  8. //9830416(960010H):00  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  9. //9830432(960020H):81  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  10. //9830448(960030H):00  00  00  00  02  00  00  00    77  A9  03  00  00  00  00  00
  11. //9830464(960040H):82  00  00  00  0D  D3  19  E6    00  00  00  00  00  00  00  00
  12. //9830480(960050H):00  00  00  00  04  00  00  00    CC  16  00  00  00  00  00  00
  13. //9830496(960060H):85  02  F5  1F  20  00  00  00    3D  68  F1  56  72  03  F3  56
  14. //9830512(960070H):72  03  F3  56  98  00  A0  A0    A0  00  00  00  00  00  00  00
  15. //9830528(960080H):C0  03  00  0B  34  41  00  00    1D  00  00  00  00  00  00  00
  16. //9830544(960090H):00  00  00  00  08  00  00  00    1D  00  00  00  00  00  00  00
  17. //9830560(9600A0H):C1  00  61  00  75  00  74  00    6F  00  72  00  75  00  6E  00
  18. //9830576(9600B0H):2E  00  69  00  6E  00  66  00    00  00  00  00  00  00  00  00
  19. //根目录区域修改后
  20. //Offset           00  01  02  03  04  05  06  07    08  09  0A  0B  0C  0D  0E  0F
  21. //9830400(960000H):03  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  22. //9830416(960010H):00  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  23. //9830432(960020H):81  00  00  00  00  00  00  00    00  00  00  00  00  00  00  00
  24. //9830448(960030H):00  00  00  00  02  00  00  00    77  A9  03  00  00  00  00  00
  25. //9830464(960040H):82  00  00  00  0D  D3  19  E6    00  00  00  00  00  00  00  00
  26. //9830480(960050H):00  00  00  00  04  00  00  00    CC  16  00  00  00  00  00  00
  27. //9830496(960060H):85  02  F5  09  20  00  00  00    3D  68  F1  56  72  03  F3  56
  28. //9830512(960070H):72  03  F3  56  98  00  A0  A0    A0  00  00  00  00  00  00  00
  29. //9830528(960080H):C0  03  00  0B  34  41  00  00    1D  00  00  00  00  00  00  00
  30. //9830544(960090H):00  00  00  00  08  00  00  00    1D  00  00  00  00  00  00  00
  31. //9830560(9600A0H):C1  00  61  00  75  00  74  00    6F  00  72  00  75  00  6E  00
  32. //9830576(9600B0H):2E  00  69  00  6E  00  66  00    00  00  00  00  00  00  00  00
  33. //示例计算出来的校验和为2549,转换为16进制为 09 F5,小头在前 F5 09,
  34. //因此在9830498、9830499处两字节修改为 09 F5
  35. //GetUserInputI cur_position "请输入文件条目起始位置(如 9830496):"
  36. //CurrentPos 不能放到表达式中参与运算
  37. //数字可以用常规10进制,或者形式如0x3E之类的16进制

  38. MessageBox "请将光标放在0x85H开头的行上面"
  39. Assign cur_position CurrentPos
  40. Assign move_offset 0
  41. IfGreater (cur_position%16) 0
  42.     Assign move_offset (0-(cur_position%16))
  43. EndIf
  44. //Assign SecondaryCount 3
  45. //Assign Checksum 0
  46. Assign one_byte 0
  47. Assign Index 0
  48. Move move_offset
  49. //读入首字节=0x85
  50. Read one_byte 1
  51. //输入第1字节辅助项目数量=SecondaryCount
  52. Read SecondaryCount 1
  53. //读入第2,3字节校验码
  54. Read Checksum 2
  55. Assign OriginalChecksum Checksum
  56. Assign Checksum 0
  57. Move -4
  58. //回退到首字节位置
  59. Assign one_bytestr "1111"
  60. Assign dir_enrty_offset CurrentPos
  61. //如果首字节不是0x85,终止程序
  62. IfGreater one_byte 0x85
  63.     MessageBox "首字节不是0x85退出"
  64.     JumpTo ContinueHere
  65. EndIf
  66. IfGreater 0x85 one_byte
  67.     MessageBox "首字节不是0x85退出"
  68.     JumpTo ContinueHere
  69. EndIf
  70. //如果首字节是0x85,开始计算校验和
  71. //第2,3字节是校验和,不参与计算
  72. Assign NumberOfBytes ((SecondaryCount+1)*32)
  73. {
  74.    IfEqual 2 Index
  75.        Inc Index
  76.    EndIf
  77.    IfEqual 3 Index
  78.        Inc Index
  79.    EndIf
  80.    Assign hight_bit 0
  81.    IfEqual (Checksum&1) 1
  82.        Assign hight_bit 0x0080
  83.    EndIf
  84.    Goto (Index+dir_enrty_offset)
  85.    Read one_byte 1
  86.    Assign Checksum (hight_bit+Checksum/2+one_byte)
  87.    IfEqual (NumberOfBytes-1) Index  
  88.        ExitLoop
  89.    EndIf
  90.    Inc Index
  91. }[unlimited]
  92. IntToStr StrChecksum Checksum
  93. IntToStr strOriginalChecksum OriginalChecksum
  94. Assign move_offset (0-NumberOfBytes+2)
  95. Move move_offset
  96. Write Checksum
  97. Assign toshowMsg  "原始校验和:"
  98. StrCat toshowMsg strOriginalChecksum
  99. StrCat toshowMsg "  计算的校验和:"
  100. StrCat toshowMsg StrChecksum
  101. MessageBox toshowMsg
  102. Label ContinueHere
复制代码

代码见上文,愿意友情支持积分的请付费下载.
将上述代码保存为EntrySetChecksum_general.whs放到winhex所在目录也是可以的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2023-7-28 18:41:20 | 显示全部楼层
本帖最后由 天堂雨 于 2023-7-28 19:26 编辑


用OSFMount加载故障备份故障U盘












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2023-7-28 22:50:23 | 显示全部楼层
感谢分享           
回复

使用道具 举报

 楼主| 发表于 2023-7-29 18:07:36 来自手机 | 显示全部楼层
NMR 发表于 2023-7-28 22:50
感谢分享

感谢阅读和关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-11-21 23:43 , Processed in 0.188599 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表