标签归档:WinHex

如何使用WinHex脚本自动修复FAT32文件系统DBR

        此脚本不是去复制备份的DBR,而是通过文件系统计算BPB参数,来达到修复文件系统的目的,下面是脚本:

 

Assign ParSize GetSize
Assign SecSize 512

Goto 0x000
Write 0xEB5890
Write 0x4D53444F53352E30
Write SecSize
Write 0x00
Write 0x0000
Write 0x02
Write 0x0000
Write 0x0000
Write 0xF8
Write 0x0000
Write 0x3F00
Write 0xFF00
Write 0x00000000
Write 0x0000000000000000
Write 0x0000
Write 0x0000
Write 0x02000000
Write 0x0100
Write 0x0600
Write 0x000000000000000000000000
Write 0x80
Write 0x00
Write 0x29
Write 0x9E3A76F0
Write 0x48424E2052657061697220
Write 0x4641543332202020
{
Write 0x00
}[420]
Write 0x55AA

Goto 0x020
Write (ParSize/SecSize)

Goto 0x000
Find 0xF8FFFF0FFFFFFF Down
IfFound
Assign FAT1 CurrentPos
Move SecSize
EndIF

Find 0xF8FFFF0FFFFFFF Down
IfFound
Assign FAT2 CurrentPos
Move SecSize
EndIF

Goto 0x024
Write ((FAT2/SecSize)-(FAT1/SecSize))

Goto 0x00E
Write (FAT1/SecSize)

Goto ((FAT2-FAT1)+FAT2)
Find 0x2E20202020202020202020 Down
IfFound
Assign SEC1 CurrentPos
Move 26
Read CDX1 2
EndIF

Find 0x2E20202020202020202020 Down
IfFound
Assign SEC2 CurrentPos
Move 26
Read CDX2 2
EndIF

Goto 0x00D
Write (((SEC1/SecSize)-(SEC2/SecSize))/((CDX1)-(CDX2)))

MessageBox "DBR修复完成!"

WinHex脚本编程

脚本命令适用的环境比较多。脚本文件中的注释以为双斜杠开头。脚本支持的最长255字符的参数。有疑点的地方是十六进制,文本字符串(甚至10进制数值)都可以作为参数,你可以使用引号强制转换数字参数为文本参数。如果文本或者变量名中存在空格,则引号是必须的,在引号中的所有字符都被被识别成一个参数而存在。

当在WinHex中使用数学表达式的时候,可以引用数学表达式,但是必须用括号括起来。在数学表达式中不能有空格。同样可以在数学表达式中应用数字变量。支持的操作有,加法(+),减法(-),乘法(*),整除(/),模除(%),逻辑运算符AND(&),OR(|),以及XOR(^)。以下是有效的数学表达式:(5*2+1), (MyVar1/(MyVar2+4)), or (-MyVar)。

以下是目前支持的脚本命令的详细描述以及使用实例。

Create "D:\My File.txt" 1000
创建一个1000字节的新文件,如果已经存在同名文件,则将其覆盖。

Open "D:\My File.txt"
Open "D:\*.txt"
打开指定格式的文件,如果通配符为“?”则WinHex会让用户选择要打开的文件。

Open C:
Open D:
打开指定的逻辑驱动器。如果通配符为“:?”则WinHex会让用户选择要打开的逻辑驱动器或者磁盘。

Open 80h
Open 81h
Open 9Eh
打开指定的物理介质。软盘的为00h,硬盘与u盘为80h,光盘为9Eh。
可以增加第二个参数来设定文件或者介质的编辑模式(“in-place”或者“read-only”)

CreateBackup
为活动文件的当前状态创建WHX备份。

CreateBackupEx 0 100000 650 true "F:\My backup.whx"
备份当前活动磁盘中从0扇区到100000扇区的数据。备份文件将自动分割成650M大小。并且选择了压缩选项。输出文件的路径以及名称作为最后的参数写入。
如果备份文件不需要分割,则第三个参数的数值该为0即可。如果不启动压缩功能则将“true”改为“false”。如果需要自动分配文件名以及文件路径则最后的参数表示为“""”即可。

Goto 0x128
Goto MyVariable
将光标的位置移动到偏移量0x128位置(16进制表示)。同样也可以用数字变量(最长8字节)来定义光标移动的位置。

Move -100
将当前光标的位置向后移动100字节(16进制)。

Write "Test"
Write 0x0D0A
Write MyVariable
在光标当前位置(以覆盖模式)写入ASCII字符“Test”或者两个字节的16进制数“0D0A”。这里同样可以写入数字变量中的值。同时将光标移动到被覆盖部分的后面。当到达文件的结尾时,将在文件尾部添加空字节以完成操作。下一个写命令将不会在文件尾巴

Write2
和“Write”的功能类似,当时当到达文件结尾的时候,不会在文件添加空字节。So it is
not safe to assume that Write2 always moves the current position forward by the number of bytes
written.

Insert "Test"
功能与“Write”类似,但是在“insert”模式只能应用于文件。

Read MyVariable 10
从当前位置读入10个字节的数据到“MyVariable”变量中。如果变量不存在,它将会创建一个。WinHex同时可以支持48个不同的变量。另一个创建变量的命令是“Assign”。

ReadLn MyVariable
从当前位置读入一整行的数据到“MyVariable”变量中直到遇到换行符。如果变量已经存在了,则变量的大小将会被从新调整。

Close
不保存的关闭当前活动窗口。

CloseAll
不保存的关闭所有窗口。

Save
保存当前活动窗口中打开的文件或磁盘的修改。

SaveAs "C:\New Name.txt"
将当前活动窗口打开的文件另存为指定目录下的文件。如果通配符为“?”,则WinHex会让用户自己选择保存的路径以及文件名。

SaveAll
保存所有窗口中修改。

Terminate
中断脚本的执行。

Exit
中断脚本的执行并且关闭WinHex。

ExitIfNoFilesOpen
如果在WinHex中没有打开的文件将终止脚本文件的执行。

Block 100 200
Block "My Variable 1" "My Variable 2"
在当前活动窗口中定义一个偏移量从100到200的选块(10进制)。下一行命令表示定义从变量"My Variable 1"到"My Variable 2"的选块(最长8字节)

Block1 0x100
在偏移量0x100处定义一个字节的选块。同样可以使用变量。

Block2 0x200
定义一个从开头到偏移量0x200部分的选块。同样可以使用变量。

Copy
将当前选块复制进剪切板中。如果没有定义选块,其功能和编辑菜单中的复制命令相同。

Cut
将当前选块中的文件剪切到剪切板中。

Remove
将当前选块中的数据从文件中移除。

CopyIntoNewFile "D:\New File.dat"
CopyIntoNewFile "D:\File +MyVariable+.dat"
将当前选块中的数据复制进指定的新文件,而不复制进剪切板。如果没有定义选块,其功能和编辑菜单中的复制命令相同。同样可以复制磁盘扇区中的数据作为一个新文件。新建的文件不会自动在WinHex的编辑窗口中打开。可以在“+”之间加入变量,变量名将被解释为不大于2^24(16M)的整数。通常在循环应用以及文件恢复中比较有用。

Paste
将剪切板中的数据粘贴入文件中,并且不改变光标当前位置。

WriteClipboard
将剪切板中的数据写入文件或磁盘扇的当前位置中,不改变光标当前位置,并且覆盖从当前光标所在位置以后的数据。

Convert Param1 Param2
将当前活动文件中的数据从一种格式转换成另一种格式。有效的参数是ANSI,IBM,EBCDIC,Binary,HexASCII,IntelHex,MotorolaS, Base64, UUCode, LowerCase, 以及UpperCase,与转换菜单中的转换菜单命令功能相同。

AESEncrypt "My Password"
使用AES加密当前活动文件或者磁盘,或其选块,使用指定的密钥(最高32位)。

AESDecrypt "My Password"
解密当前活动文件或磁盘。

Find "John" [MatchCase MatchWord Down Up BlockOnly SaveAllPos Unicode Wildcards]
Find 0x1234 [Down Up BlockOnly SaveAllPos Wildcards]
分别搜索当前活动窗口中名为“john”的字符串或16进制值数0x1234,并且在第一个搜索到的地方停下来。其他的参数是可选的。默认的WinHex搜索整个文件或磁盘。其他的可选参数功能和通常的WinHex搜索选项相同。

ReplaceAll "Jon" "Don" [MatchCase MatchWord Down Up BlockOnly Unicode Wildcards]
ReplaceAll 0x0A 0x0D0A [Down Up BlockOnly Wildcards]
在当前活动窗口中使用其他的值替换所有存在上述字符串或16进制数值的地方。在“in-place”模式下只能应用与磁盘。

IfFound
A boolean value that depends on whether or not the last Find or ReplaceAll command was
successful. Place commands that shall be executed if something was found after the IfFound
command.

IfEqual MyVariable "Hello World"
IfEqual 0x12345678 MyVariable
IfEqual MyVariable 1000
IfEqual MyVariable MyOtherVariable
IfEqual MyVariable (10*MyOtherVariable)
比较两个整数值(其中每个值可以是常量,整数变量或者数学表达式)或者两个变量,ASCII字符串,或16进制数值(2进制模式)。比较两个对象的2进制数值长度,如果不相同的话则返回结果为false。只有返回值为true时,下面的命令才会被执行。if条件不可以镶套使用。

IfGreater MyVariable "Hello World"
IfGreater 0x12345678 MyVariable
IfGreater MyVariable 1000
IfGreater MyVariable MyOtherVariable
IfGreater MyVariable (10*MyOtherVariable)
和IfEqual拥有相同的参数。第一个参数大于第二个参数,返回值为true,则下面的命令才能被执行。if条件不可以镶套使用。

Else
应用在IfFound或IfEqual之后。如果没有任何对象被搜索到或者比较的目标不相同,则执行else后面的代码。

EndIf
结束if条件命令执行(在IfFound或IfEqual之后)。

{...
ExitLoop
...}
退出循环。其后会有一个方括号来定义其循环次数,可以是变量也可以是关键字“unlimited”(无限循环)。WinHex脚本中循环只能使用ExitLoop命令来退出。循环不可以镶套使用。
举例:
{ Write "Loop" }[10] 将输出“Loop”字符串10次。

Label ContinueHere
创建一个标签并命名为“ContinueHere”

JumpTo ContinueHere
Continues script execution with the command following that label.

NextObj
循环在所有窗口中进行切换“活动”窗口。如果有三个窗口被打开,并且窗口#3状态为活动窗口,则“NextObj”命令将会让窗口#1变为活动窗口。

ForAllObjDo
在ForAllObjDo与EndDo之间的脚本代码将在所有打开的文件或者磁盘中执行。

CopyFile C:\A.dat D:\B.dat
将C:\A.dat文件中的内容复制到D:\B.dat中。

MoveFile C:\A.dat D:\B.dat
将C:\A.dat文件转移到D盘中并命名为D:\B.dat。

DeleteFile C:\A.dat
将C:\A.dat文件删除。

InitFreeSpace
InitSlackSpace
使用当前初始化设置清理当前逻辑驱动器中的所有自由空间或松散空间,InitSlackSpace将驱动器的模式临时转换为“in-place”模式,以保存未保存的修改。

InitMFTRecords
使用当前初始化设置在当前NTFS格式的逻辑驱动器中清理未使用的MFT FILE记录。对于其他的文件系统无效。修改立即就会写入硬盘中。

Assign MyVariable 12345
Assign MyVariable 0x0D0A
Assign MyVariable "I like WinHex"
Assign MyVariable MyOtherVariable
将整数,二进制数值,ASCII文本,或其他变量内容保存到“MyVariable”变量中。如果这个变量不存在,将会被自动创建。其他的创建变量的方法:Read,GetUserInput,InttoStr。同时可以允许有48个变量存在。

Release MyVariable
删除一个已存在的变量,因为WinHex脚本中只支持48个变量存在,所以用过的不再使用变量我们可以将其删除以释放变量空间。

SetVarSize MyVariable 1
SetVarSize MyVariable 4
明确的定义了变量的长度。在限制数值长度方面比较有用,比如数值和计算结果的二进制以一个固定的长度被写入文件中。如果没有servarsize,那么变量的大小就无法确定。比如
Explicitly sets the allocated memory size of a variable at a given time, in bytes. This can be
useful e.g. for variables that hold integer values and that are the result of a calculation, if this
value is to be written to a binary file with a fixed-length structure. Without SetVarSize, no
assumption must be made about the size of the variable. For instance, the number 300 could be
stored in any number of bytes larger than 1. If the new size set by SetVarSize is smaller than the
old size, the allocated memory is truncated. If the new size is larger, the allocated memory is
expanded. At any rate, the value of the persisting bytes is retained.

GetUserInput MyVariable "Please enter your name:"
在脚本运行期间,保存用户指定的ASCII文本或二进制数据(0x...)到变量“MyVariable”中。第二个参数给除了用户提示。如果变量不存在,它将重新创建一个。其他创建变量的方式:Assign,Read。

GetUserInputI MyIntegerVariable "Please enter your age:"
与GetUserInput功能相同,但是只允许整数型变量。

Inc MyVariable
将变量解释为整数(不大于8位)并且每运行一次变量自动加1。在循环中有用。

Dec MyVariable
将变量解释为整数(不大于8位)并且每运行一次变量自动减1。在循环中有用。

IntToStr MyStr MyInt
IntToStr MyStr 12345
将第一个变量中的ASCII文本转换成整数并保存到第二个变量中。

StrToInt MyInt MyStr
将第一个变量中的整数转换成ASCII文本并保存到第二个变量中。

GetClusterAlloc MyStr
在逻辑卷中,找回哪个文件被储存在当前簇中的文本描述,然后将描述保存到指定的变量中。

GetClusterAllocEx IntVar
在逻辑卷中,找回一个整数值指示簇是否被分配,1或者非0,表示该簇已被分配。并且将描述保存在指定变量中。

GetClusterSize IntVar
返回逻辑卷中簇的大小,并将数值保存到指定的变量中。

InterpretImageAsDisk
将磁盘镜像或证据文件作为原始物理磁盘或分区一样对待。需要specialist或forensic许可。

CalcHash HashType MyVariable
CalcHashEx HashType MyVariable
与工具菜单中的hash命令功能相同并且将变量储存在指定变量中(如果变量不存在,则会自动创建)。HashType参数必须为以下类型中的一种:CS8, CS16, CS32, CS64, CRC16, CRC32, MD5, SHA-1, SHA-256, PSCHF。CalcHashEx命令将在windows窗口中显示hash值。

MessageBox "Caution"
显示信息对话框,并且提供ok和cancel两个按钮。按下cancel按脚本本。

ExecuteScript "ScriptName"
在脚本的当前运行处运行另一个脚本。调用其他外部脚本可以镶套使用。当被调用的脚本执行完成以后,脚本继续执行下面的命令。这个特征可以帮助用户清楚的了解脚本的结构。

Turbo On
Turbo Off
In turbo mode, most screen elements are not updated during script execution and you are not able
to abort (e.g. by pressing Esc) or pause. This may accelerate script execution if a lot of simple
commands such as Move and NextObj are executed in a loop.

Debug
用户可以利用该命令确定脚本中的每一条命令都是否有效。

UseLogFile
错误信息被写入当前文件夹下的日志文件“scripting.log”。这些信息不会显示在信息对话框中。非常有用,特别在运行的脚本主机无法远程连接的时候。

CurrentPos
GetSize
unlimited
以上三个是WinHex脚本中的关键字,可以被使用在应用数字参数的地方。在脚本执行过程中,CurrentPos表示当前活动文件或者磁盘窗口中光标的偏移地址,GetSize表示了它的大小。unlimited实际上表示的是整数2,147,483,647

 

WinHex数据结构模板

  一、模板概述
  定制数据结构模板,这当然比直接分析16进制的原始数据要方便得多,而且不容易出错。你编辑好数据结构模板保存后,数据模板就生效了。这样你就可以分析来自硬盘、内存等一些数据,这些数据将套用你数据结构模板来显示数据了。例如:这样你可以定制一个模板来查阅数据库记录。
  模板本身是个带扩展名TPL的文本文件。WINHEX提供的模板编辑器可以让您写模板的定义,并提供语法检查. 模板的定义,主要包含变量声明,类似于源代码的编程语言. 支持的数据类型包括所有的共同整数,浮点和布尔类型,日期类型, hex值,二进制,文字, 串型. 数组变量和一组变量,都可以使用.能自由移动,前移和后移的数据,使得使用模板的特别灵活:
  1.同一个变量可以有多种用途
  2.你不关心的数据部分可以跳过
  模板管理器列出所有的模板的winhex目录,包含模板定义、标题、附加说明、文件名,点击应用按钮,显示模板选用模板定义的数据,在当前编辑窗在目前的数据解释. 你也可以创造一个新的模板定义,删除或编辑一个现有winhex提供的几个模板样例.
  二、模板定义
  模板由头部和主体两部分组成,模板头部定义的格式如下:
  template "title"     //模板标题
  [description "description"]   //说明
  [applies_to (file/disk/RAM)]   //应用到文件、磁盘还是内存
  [fixed_start offset]         //固定的起始偏移值
  [sector-aligned]           //扇区对齐
  [requires offset "hex values"]//要求偏移的HEX值相等
  [big-endian]              //高字节优先
  [hexadecimal/octal]
  [read-only]              //只读
  [multiple [fixed overall size]]
  // Put any general comments to the template here.
  begin
  variable declarations ...
  end
  中括号代表是该项是可选的.   表达式里面含有空格的话就要用双引号引起来. 评论会出现在模板的定义. 字继双斜线被忽略的解析器. 注释可以写在任何地方,在注释前要“//”号。
  1.关键字" applies_to "必须跟着一个只有一个文件,磁盘或内存 . 如果你是用一个模板解析的数据和用此关键字定义的数据来源不相同的话,winhex会发出一个警告。
  2.当模板解释这些数据时默认是从当前的光标位置处开始的,一旦使用fixed_start声明位置,解释将总是以指定的偏移位置处开始解释.
  3.如果模板应用于磁盘的情况下, 关键字"sector-aligned"确保模板从当前的扇区的开始处进行解释, 而不管确切的光标在当前扇区的确切位置.
  4."requires"的声明与"applies_to "声明有点类似,"requires" 声明使WinHex 防止模板定义对不匹配的数据做错误解释。指定一个偏移量和一个任意长度HEX串(十六进制串)来进行匹配。例如,一个有效的主引导记录,可以确认的hex串值“55AA”在偏移0x1fe处 ; 一个可执行文件的hex串值 " mz "在偏移0x0处 . 有许多" appliesto "声明的模板定义头部 ,都是考虑.
  5.关键字"big-endian"导致模板定义所有多字节整数和布尔变量是以big-endian顺序(高字节为优先)的读写   .  
  6. 关键字" hexadecimal "使模板定义的所有整数变量的以十六进制记法显示 .
  7.关键字"read-only"确保模板只能用来显示数据. 数据将成灰色,就不能修改数据如果在头部设定"multiple"关键字 , winhex允许浏览到相邻的数据记录在同个模板. 这就要求winhex要知道的记录的大小. 如果"multiple"关键字没有指定为尺寸参数,winhex 计算模板结构总尺寸( = record )来解释当前位置到模板的对应的末尾. 如果这是一个可变尺寸, 即数组大小或移动参数来动态决定 winhex不能浏览先前数据记录.
  三、变量声明
  模板主体的定义主要包括变量声明,类似于编程语言. 下面是变量声明的基本形式
  type "title"//类型 标题
  下面是类型:
  int8, uint8 = byte, int16, uint16, int24, uint24, int32, uint32, int64,
  uint_flex
  binary,
  float = single, real, double, longdouble = extended,
  char, char16, string, string16,
  zstring, zstring16,
  boole8 = boolean, boole16, boole32hex,
  DOSDateTime, FileTime, OLEDateTime, SQLDateTime, UNIXDateTime = time_t, JavaDateTime
  "title"只能包含在引号中若含空字符. "title"绝不能仅由数字组成. winhex不区分大小写字符称. 最多有41字符.
  在类型之前可以跟以下关键字
  big-endian(高字节优先  little-endian (低字节优先) 
  hexadecimal(十六进制)  decimal(十进制) octal(八进制)
  read-only(只读)  read-write(可读写)
  这些修正只影响紧随其后的变量. 他们是多余的,如果他们出现在头已经定义数据类型后面的数据代表占用空间大小的位数,char16和string16是一样的,winhex支持Unicode字符和字符串. 但是, Unicode字符以外的256个第一的ANSI等价字都不支持. 最高字符串大小,可以修改用模板是8192字节.
  各类串, string16 , hex需要额外参数,明确了一些内容. 这个参数可以是一个常数或一个先前宣布变数或数学表达(见下文) . 如果它是一个常数,可以指定十六进制格式, 这是公认的,如果号码是先0x .
  你可以声明变量数组,把数组大小括号旁边的种类或 称号. 以下两行宣布可变大小的 ascii字符串,其长度取决于前变: 
  uint8  "len"
  char[len] "A string"
  同样的功能可以通过以下两句来定义:
  byte  "len"
  string len "A string"
  字符"~ "可以作为一个占位后更换与实际的数组元素的数目(见高级 命令) . 这并不适用于数组char变数,因为它们会自动被翻译成一个字符串. 字符串的参数,整型变量数据大小的表达式,可在指定的数学符号. 他们将处理的综合公式解析器. 这些用语须圆括号. 他们不能含有空字符. 他们可利用先前宣布整型变量的名字不包含空字符. 支持的行动,另外, ( + ) ,减法( - ) ,乘法( * ) ,整除( / ) ,取模( % ) , 位与 ( & ) , 位或 ( | ) , and 异或 ( ^ ) . 有效的数学公式所举例( 5 * 2+1 )或( len1 / ( len2 +4 ) ) . 结果总是一个整数,必须是一个正数.
  zstring和zstring16都是NULL结尾的字符串,其大小取决于动态地在运行决定.
  四、高级命令
  当附背带,若干变量声明包含一个块,可以反复使用作为一个整体. 但是请注意,块不能嵌套在当前的执行工作. " ~ "字符可以用一个变量的名字作为占位符后更换为实际计数. 择" numbering "声明界定在哪里开始计数( 0 by default )
    numbering  1
    { tab byte  "len"
     string len "String No. ~"
    } [10]
  在这个例子实际变量的名字放在模板将"String No. 1", "String No. 2", ..., "String No. 10". 而不是一个固定的重复数目 ( 10在这个例子中) ,您可能还注明是"无限" . 在这种情况下winhex将重复块到年底档案遭遇. " exitloop "可以用来走出这条回路在任何时间
  " ifequal "是有用的比较两个表达式. operands可分为两个数值,是恒定值十进制,整型变量或公式, 或者字节序列作文字或hex值是比较byte字节. ascii字符串表达式必须加上引号, hex序列必须prreced了" 0x "标识. 公式须括弧.
  { r byte  Value
   IfEqual Value 1
     ExitLoop
   EndIf
  } [10]
  " ifequal " 以结束" endif "的声明. 如果比较表达都是相等的,模板的解释后继续" ifequal " . optionally , " ifequal "可以遵循的不等的声明. 模板处理器支进入" else "区块,如果表达不能划等号. " ifequal "命令不能嵌套. " ifgreater "类似于" ifequal " . 条件是正确的,如果第一表达的是大于二. 字符串按词典顺序进行比较.
  为了便于阅读和导航模板 你可确定一组的变量,在对话框中会在不同组的变量用空间分开:
  section "...Section Title..."
  ...variable declaractions...
  endsection
  "section", "endsection", 和 "numbering"关键字都没有与当前位置的解释有
关。
  有两个命令也不做变量声明,但被明确用来改变目前的位置. 可以跳过无关紧要的数据(向前移动)或能取得一定的变量不止一次 由于不同类型(反向运动) . 用" move n "声明中跳过n字节,由目前的位置,其中N可说是消极的. " goto n " 到指定绝对位置,从一开始的模板解释(必须是位置) . :
  int32  "Disk serial number (decimal)"
  move -4
  hex 4  "Disk serial number (hex)"

如何使用WinHex脚本自动修复NTFS文件系统DBR

        DBR(DOS BOOT RECORD,DOS引导记录),位于柱面0,磁头1,扇区1,即逻辑扇区0。DBR分为两部分:DOS引导程序和BPB(BIOS参数块)。其中DOS引导程序完成DOS系统文件(IO.SYS,MSDOS.SYS)的定位与装载,而BPB用来描述本DOS分区的磁盘信息,BPB位于DBR偏移0BH处,共13字节。 它包含逻辑格式化时使用的参数,可供DOS计算磁盘上的文件分配表,目录区和数据区的起始地址,BPB之后三个字提供物理格式化(低格)时采用的一些参数。引导程序或设备驱动程序根据这些信息将磁盘逻辑地址(DOS扇区号)转换成物理地址(绝对扇区号)。

 

Assign Mouse CurrentPos
Assign ParSize GetSize
Assign SecSize 512
Goto 0x000
Write 0xEB52904E54465320202020
Write SecSize
Write 0x00
Write 0x0000
Write 0x000000
Write 0x0000
Write 0xF8
Write 0x0000
Write 0x3F00
Write 0xFF00
Write 0x00000000
Write 0x00000000
Write 0x80008000
Write 0x0000000000000000
Write 0x0000000000000000
Write 0x0000000000000000
Write 0xF6
Write 0x000000
Write 0x01
Write 0x000000a
Write 0x1C5B596481596420
Write 0x0000
{
Write 0x00
}[428]
Write 0x55AA

//Goto Mouse //移动到光标点击位置,提高搜索效率。
Goto 0x200 //从头扫描。
Find 0x100000006000000000001800000000004800000018000000 Down
IfFound
Move -56
Assign MFT CurrentPos
Move 272
Read QSVCN 8
Read JSVCN 8
Move 8
Read FileSize 8
EndIF
Goto 0x00D
Write ((FileSize/(JSVCN-QSVCN+1))/SecSize)
Goto 0x00D
Read CDX 1
Goto 0x030
Write (MFT/SecSize/CDX)
Goto (MFT+1354)
Read MFTMirr 6
Goto 0x038
Write MFTMirr
Goto 0x028
Write ((ParSize/SecSize)-1)
MessageBox "DBR修复完成!"