楼主: zck699 - 

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

[复制链接]
  • TA的每日心情
    奋斗
    2012-8-8 20:58
  • 签到天数: 1 天

    [LV.1]布衣百姓

    14

    主题

    64

    回帖

    856

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    856
    发表于 2017-4-14 15:57:57 | 显示全部楼层 |阅读模式
    本帖最后由 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分区也方便多了。
    本帖评分记录金子 收起 理由
    yinzongjie + 50 很给力!
  • TA的每日心情
    慵懒
    2016-2-15 09:21
  • 签到天数: 17 天

    [LV.4]七品知县

    1

    主题

    38

    回帖

    344

    积分

    [INTOHARD]排长

    Rank: 3Rank: 3

    积分
    344
    发表于 2017-5-9 17:24:33 | 显示全部楼层
    gpt exfat的三校验曾经用bat脚本写过一个
    不过winhex还能用脚本?  是winhex的模板文件?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-4-24 14:07
  • 签到天数: 12 天

    [LV.3]八品县丞

    5

    主题

    102

    回帖

    142

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    142
    发表于 2017-10-2 17:46:13 | 显示全部楼层
    能说下GPT的校验怎么算吗?以前记得是DBR的哈希校验。。忘记了,去年的时候
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-9-25 09:57
  • 签到天数: 27 天

    [LV.4]七品知县

    9

    主题

    168

    回帖

    1339

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1339
    发表于 2017-10-19 12:42:02 | 显示全部楼层
    checksum = (checksum<< 31) | (checksum>> 1) + data
    这个运算checksum值会溢出,怎么处理?
    麻烦大神回复一下,谢谢![s:1]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    回帖

    6

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    6
    发表于 2018-3-6 16:50:59 | 显示全部楼层
    请问winhex脚本代码 可以共享 吗?上面所贴代码是 java还是 C语言?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-12-15 14:12
  • 签到天数: 6 天

    [LV.2]九品芝麻官

    0

    主题

    22

    回帖

    55

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    55
    发表于 2019-4-9 14:10:32 | 显示全部楼层
    楼主代码能共享不,或者卖一份给我多少钱一份看到了回复一下。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-12-29 16:32
  • 签到天数: 58 天

    [LV.5]六品通判

    0

    主题

    105

    回帖

    129

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    129
    发表于 2019-6-14 13:01:55 | 显示全部楼层
    楼主能共享不,或者卖一份给我多少钱一份看到了回复一下。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2012-8-8 20:58
  • 签到天数: 1 天

    [LV.1]布衣百姓

    14

    主题

    64

    回帖

    856

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    856
     楼主| 发表于 2019-11-5 16:46:03 | 显示全部楼层
    feifanll 发表于 2017-10-19 12:42
    checksum = (checksum> 1) + data
    这个运算checksum值会溢出,怎么处理?
    麻烦大神回复一下,谢谢!

    设定为4个字节
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-23 17:40
  • 签到天数: 4 天

    [LV.2]九品芝麻官

    0

    主题

    74

    回帖

    49

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    49
    发表于 2023-6-15 08:44:11 | 显示全部楼层
    太牛了 真的佩服大虾
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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