zck699 发表于 2017-4-14 15:57:57

用Winhex脚本计算并写入exFAT的DBR校验

本帖最后由 zck699 于 2017-4-20 01:20 编辑

  现在很多人的U盘甚至移动硬盘都在使用exFAT文件系统,exFAT文件系统一个烦人的问题就是DBR中若因意外损坏,会导致提示未格式化无法使用。
 
  以前的一些帖子甚至某些数据恢复类的书籍中讲的方法都是找一个好的DBR先覆盖坏掉的DBR,再修改PBP参数就恢复了。其实,由于exFAT分区的第12个扇区中有前11个扇区(DBR及保留扇区)校验值的存在,即使这些参数修正确,仍会因校验出错提示格式化,使得Windows无法访问数据,只能用winhex或其他数据恢复软件中提取数据。要在恢复数据后能让Windows直接打开,必须得正确计算并写入校验值才行。想写个程序解决,但不是科班出生,虽能看懂一些程序代码但自己不会编程,以前从论坛上下载过一个校验程序,遗憾的是这个程序只能用于DBR在63扇区的情况,每次修复DBR扇区后,还得弄个虚拟硬盘,将DBR的前12个扇区数据从虚拟硬盘的63扇区写入,再用该程序检验。

  这样做实在是太麻烦,就想写一个Winhex脚本应该解决该问题。先查到校验算法:

UNIT32 BootChecksum(const unsigned char data[], int bytes)
    {
    UINT32 checksum   =   0;
    for (int i = 0; i < bytes; i++)
    {
    if (i == 106 || i == 107 || i == 112)
    continue;
    checksum = (checksum<< 31) | (checksum>> 1) + data;
    }
    returnchecksum;
    }

  无非就是设置一个校验值变量,初始化值为0,然后逐一读取前11个扇区的每个字节,跳过106、107、112这三个字节,循环计算直到第11扇区结束:校验值为左移31位与右移1位进行按位或运算,再加上每次读取到的相应字节值。

  Winhex脚本貌似不支持移位运算,用乘除法代之,按照上述检验算法,写出了校验脚本,测试完全正确。从此,好久没再忍受计算校验之苦了。

  如法炮制,后来又写了GPT分区的校验脚本,解决GPT分区也方便多了。

bakawa 发表于 2017-5-9 17:24:33

gpt exfat的三校验曾经用bat脚本写过一个
不过winhex还能用脚本?是winhex的模板文件?

2547679602 发表于 2017-10-2 17:46:13

能说下GPT的校验怎么算吗?以前记得是DBR的哈希校验。。忘记了,去年的时候

feifanll 发表于 2017-10-19 12:42:02

checksum = (checksum<< 31) | (checksum>> 1) + data
这个运算checksum值会溢出,怎么处理?
麻烦大神回复一下,谢谢!

dyfyun 发表于 2018-3-6 16:50:59

请问winhex脚本代码 可以共享 吗?上面所贴代码是 java还是 C语言?

shj8847 发表于 2019-4-9 14:10:32

楼主代码能共享不,或者卖一份给我多少钱一份看到了回复一下。

xiao1967_109 发表于 2019-6-14 13:01:55

楼主能共享不,或者卖一份给我多少钱一份看到了回复一下。

zck699 发表于 2019-11-5 16:46:03

feifanll 发表于 2017-10-19 12:42
checksum = (checksum> 1) + data
这个运算checksum值会溢出,怎么处理?
麻烦大神回复一下,谢谢!

设定为4个字节

笨菜鸟 发表于 2020-1-9 10:18:44

学习一下。。。。

kony 发表于 2023-6-15 08:44:11

太牛了 真的佩服大虾
页: [1]
查看完整版本: 用Winhex脚本计算并写入exFAT的DBR校验