作者归档:Windows Hao

关于Windows Hao

力求做到最好的数据恢复效果,降低数据丢失带来的损失,为您的数据安全保驾护航。

数据恢复

        当存储介质出现损伤或由于人员误操作、操作系统本身故障所造成的数据看不见、无法读取、丢失。工程师通过特殊的手段读取却在正常状态下不可见、不可读、无法读的数据。

 

简介

        电子数据恢复是指通过技术手段,将保存在台式机硬盘、笔记本硬盘、服务器硬盘、存储磁带库、移动硬盘、U盘、数码存储卡、Mp3等等设备上丢失的电子数据进行抢救和恢复的技术。

 

原理
        现实中很多人不知道删除、格式化等硬盘操作丢失的数据可以恢复,以为删除、格式化以后数据就不存在了。事实上,上述简单操作后数据仍然存在于硬盘中,懂得数据恢复原理知识的人只需几下便可将消失的数据找回来,不要觉得不可思议,在了解数据在硬盘、优盘、软盘等介质上的存储原理后,你也可以亲自做一回魔术师。

 

方法
分区
        硬盘存放数据的基本单位为扇区,我们可以理解为一本书的一页。当我们装机或买来一个移动硬盘,第一步便是为了方便管理--分区。无论用何种分区工具,都会在硬盘的第一个扇区标注上硬盘的分区数量、每个分区的大小,起始位置等信息,术语称为主引导记录(MBR),也有人称为分区信息表。当主引导记录因为各种原因(硬盘坏道、病毒、误操作等)被破坏后,一些或全部分区自然就会丢失不见了,根据数据信息特征,我们可以重新推算计算分区大小及位置,手工标注到分区信息表,“丢失”的分区回来了。

文件分配表
        为了管理文件存储,硬盘分区完毕后,接下来的工作是格式化分区。格式化程序根据分区大小,合理的将分区划分为目录文件分配区和数据区,就像我们看得小说,前几页为章节目录,后面才是真正的内容。文件分配表内记录着每一个文件的属性、大小、在数据区的位置。我们对所有文件的操作,都是根据文件分配表来进行的。文件分配表遭到破坏以后,系统无法定位到文件,虽然每个文件的真实内容还存放在数据区,系统仍然会认为文件已经不存在。我们的数据丢失了,就像一本小说的目录被撕掉一样。要想直接去想要的章节,已经不可能了,要想得到想要的内容(恢复数据),只能凭记忆知道具体内容的大约页数,或每页(扇区)寻找你要的内容。我们的数据还可以恢复回来。

格式化
        我们向硬盘里存放文件时,系统首先会在文件分配表内写上文件名称、大小,并根据数据区的空闲空间在文件分配表上继续写上文件内容在数据区的起始位置。然后开始向数据区写上文件的真实内容,一个文件存放操作才算完毕。   删除操作却简单的很,当我们需要删除一个文件时,系统只是在文件分配表内在该文件前面写一个删除标志,表示该文件已被删除,他所占用的空间已被"释放", 其他文件可以使用他占用的空间。所以,当我们删除文件又想找回他(数据恢复)时,只需用工具将删除标志去掉,数据被恢复回来了。当然,前提是没有新的文件写入,该文件所占用的空间没有被新内容覆盖。

删除
        格式化操作和删除相似,都只操作文件分配表,不过格式化是将所有文件都加上删除标志,或干脆将文件分配表清空,系统将认为硬盘分区上不存在任何内容。格式化操作并没有对数据区做任何操作,目录空了,内容还在,借助数据恢复知识和相应工具,数据仍然能够被恢复回来。   注意:格式化并不是100%能恢复,有的情况磁盘打不开,需要格式化才能打开。如果数据重要,千万别尝试格式化后再恢复,因为格式化本身就是对磁盘写入的过程,只会破坏残留的信息。

覆盖
        数据恢复工程师常说:“只要数据没有被覆盖,数据就有可能恢复回来”。

        因为磁盘的存储特性,当我们不需要硬盘上的数据时,数据并没有被拿走。删除时系统只是在文件上写一个删除标志,格式化和低级格式化也是在磁盘上重新覆盖写一遍以数字0为内容的数据,这就是覆盖。

        一个文件被标记上删除标志后,他所占用的空间在有新文件写入时,将有可能被新文件占用覆盖写上新内容。这时删除的文件名虽然还在,但他指向数据区的空间内容已经被覆盖改变,恢复出来的将是错误异常内容。同样文件分配表内有删除标记的文件信息所占用的空间也有可能被新文件名文件信息占用覆盖,文件名也将不存在了。

        当将一个分区格式化后,有拷贝上新内容,新数据只是覆盖掉分区前部分空间,去掉新内容占用的空间,该分区剩余空间数据区上无序内容仍然有可能被重新组织,将数据恢复出来。

        同理,克隆、一键恢复、系统还原等造成的数据丢失,只要新数据占用空间小于破坏前空间容量,数据恢复工程师就有可能恢复你要的分区和数据。

 

数据恢复种类
硬件故障数据恢复
        硬件故障占所有数据意外故障一半以上,常有雷击、高压、高温等造成的电路故障,高温、振动碰撞等造成的机械故障,高温、振动碰撞、存储介质老化造成的物理坏磁道扇区故障,当然还有意外丢失损坏的固件BIOS信息等。

        硬件故障的数据恢复当然是先诊断,对症下药,先修复相应的硬件故障,然后根据修复其他软故障,最终将数据成功恢复。   电路故障需要我们有电路基础,需要更加深入了解硬盘详细工作原理流程。机械磁头故障需要100级以上的工作台或工作间来进行诊断修复工作。另外还需要一些软硬件维修工具配合来修复固件区等故障类型。

磁盘阵列RAID数据恢复
        磁盘阵列的存储原理这里不作讲解,可参看本站阵列知识文章,其恢复过程也是先排除硬件及软故障,然后分析阵列顺序、块大小等参数,用阵列卡或阵列软件重组,重组后便可按常规方法恢复数据。

 

数据恢复方法
硬盘数据恢复
        硬盘软故障:系统故障:系统不能正常启动、密码或权限丢失、分区表丢失、BOOT区丢失、MBR丢失; 文件丢失:误操作、误格式化、误克隆、误删除、误分区、病毒破坏、黑客攻击、PQ操作失败、RAID磁盘阵列失效等; 文件损坏:损坏的Office系列Word、Excel、Access、PowerPoint文件Microsoft SQL数据库复、Oracle数据库文件修复、Foxbase/foxpro的dbf数据库文件修复;损坏的邮件Outlook Express dbx文件,Outlook pst文件的修复;损坏的MPEG、asf、RM等媒体文件的修复。

硬盘物理故障
        CMOS不认盘; 常有一种“咔嚓咔嚓”的磁头撞击声; 电机不转,通电后无任何声音; 磁头错位造成读写数据错误; 启动困难、经常死机、格式化失败、读写困难; 自检正常,但“磁盘管理”中无法找到该硬盘; 电路板有明显的烧痕等。 磁盘物理故障分类: 盘体故障:磁头烧坏、磁头老化、磁头芯片损坏、电机损坏、磁头偏移、零磁道坏、大量坏扇、盘片划伤、磁组变形; 电路板故障:电路板损坏、芯片烧坏、断针断线。 固件信息丢失、固件损坏等。

U盘数据恢复
        U盘,优盘,XD卡,SD卡,CF卡,MEMORY STICK,,SM卡,MMC卡,MP3,MP4,记忆棒,数码相机,DV,微硬盘,光盘,软盘等各类存储设备。硬盘,移动盘,闪盘,SD卡、CF卡等数据介质损坏或出现电路板故障、磁头偏移、盘片划伤等情况 下,采用开体更换,加载,定位等方法进行数据修复。

        数码相机内存卡,如,SD卡,CF卡,记忆棒等,U盘,甚至最新的SSD固态硬盘。由于没有盘体,没有盘片,存储的数据是FLASH芯片。如果出现硬件故障,目前只有极少数数据恢复公司可以恢复此类介质,这是由于一般的数据恢复公司做此类介质时,需要匹配对应的主控芯片,而主控芯片在买来备件后需要拆开后才能知道,备件一拆,立马毁了,如果主控芯片不能配对,数据仍然无法恢复。即使碰巧配上主控型号,也不代表一定可以读出数据,因此恢复的成本和代价非常之高。一般的数据恢复公司碰上此类介质,成功率非常低,基本上放弃,这种恢复技术和原理是目前大多数数据恢复的做法。但是,对于恢复FLASH类的介质,已经新出一种数据恢复技术,可以不需要配对主控芯片,通过一种特殊的硬件设备,直接读取FLASH芯片里的代码,然后配上特殊的算法和软件,通过人工组合,直接重组出FLASH数据。这种恢复方法和原理,成功率几乎接近100%。但是受制于此类设备的昂贵,同时对数据恢复技术要求很高,工程师不但要精通硬件,还需要软件,更要精通文件系统,因此目前全国只有极个别的数据恢复公司可以做到成功率接近100%,有些公司花了很高代价采购此设备后,由于工程师技术所限,不会使用,同样无法恢复。虽然从技术上解决了FLASH恢复的难题,但是对客户而言,此类恢复的成本非常之高,比硬盘的硬件故障恢复价格要高。2G左右的恢复费接近千元,32G,64G容量的恢复费用基本上在3000-5000。

Unix数据恢复
  基于Solaris SPARC 平台的数据恢复,基于INTEL 平台的Solaris 数据恢复,可恢复SCO OPERNSERVER数据,HP-UNIX的数据恢复,IBM-AIX的数据恢复。

        Linux数据恢复Linux操作系统中的数据备份工作是Linux系统管理员的重要工作和职责。传统的Linux服务器数据备份的方法很多,备份的手段也多种多样。常见的Linux数据恢复备份方式仅仅是把数据通过TAR命令压缩拷贝到磁盘的其它区域中去。还有比较保险的做法是双机自动备份,不把所有数据存放在一台计算机上,否则一旦这台计算机的硬盘物理性损坏,那么一切数据将不复存在了。所以双机备份是商业服务器数据安全的基本要求。

        RAID恢复SCSI开盘恢复服务器数据恢复数据库数据恢复。

 

数据恢复的技巧
        1.不必完全扫描

        如果你仅想找到不小心误删除的文件,无论使用哪种数据恢复软件,也不管它是否具有类似EasyRecovery快速扫描的方式,其实都没必要对删除文件的硬盘分区进行完全的簇扫描。因为文件被删除时,操作系统仅在目录结构中给该文件标上删除标识,任何数据恢复软件都会在扫描前先读取目录结构信息,并根据其中的删除标志顺利找到刚被删除的文件。所以,你完全可在数据恢复软件读完分区的目录结构信息后就手动中断簇扫描的过程,软件一样会把被删除文件的信息正确列出,如此可节省大量的扫描时间,快速找到被误删除的文件数据。

        2.尽可能采取NTFS格式分区

        NTFS分区的MFT以文件形式存储在硬盘上,这也是EasyRecovery和Recover4all即使使用完全扫描方式对NTFS分区扫描也那么快速的原因——实际上它们在读取NTFS的MFT后并没有真正进行簇扫描,只是根据MFT信息列出了分区上的文件信息,非常取巧,从而在NTFS分区的扫描速度上压倒了老老实实逐个簇扫描的其他软件。不过对于NTFS分区的文件恢复成功率各款软件几乎是一样的,事实证明这种取巧的办法确实有效,也证明了NTFS分区系统的文件安全性确实比FAT分区要高得多,这也就是NTFS分区数据恢复在各项测试成绩中最好的原因,只要能读取到MFT信息,就几乎能100%恢复文件数据。

        3.巧妙设置扫描的簇范围

        设置扫描簇的范围是一个有效加快扫描速度的方法。像EasyRecovery的高级自定义扫描方式、FinalData和File Recovery的默认扫描方式都可以让你设置扫描的簇范围以缩短扫描时间。当然要判断目的文件在硬盘上的位置需要一些技巧,这里提供一个简单的方法,使用操作系统自带的硬盘碎片整理程序中的碎片分析程序(千万小心不要碎片整理啊,只是用它的碎片分析功能),在分区分析完后程序会将硬盘的未使用空间用图形方式清楚地表示出来,那么根据图形的比例估计这些未使用空间的大致簇范围,搜索时设置只搜索这些空白的簇范围就好了,对于大的分区,这确实能节省不少扫描时间。

        4.使用文件格式过滤器

        以前没用过数据恢复软件的朋友在第一次使用时可能会被软件的能力吓一跳,你的目的可能只是要找几个误删的文件,可软件却列出了成百上千个以前删除了的文件,要找到自己真正需要的文件确实十分麻烦。这里就要使用EasyRecovery独有的文件格式过滤器功能了,在扫描时在过滤器上填好要找文件的扩展名,如“*.doc”,那么软件就只会显示找到的DOC文件了;如果只是要找一个文件,你甚至只需要在过滤器上填好文件名和扩展名(如important.doc),软件自然会找到你需要的这个文件,很是快捷方便。

 

数据恢复需要的技能
        数据恢复是一个技术含量比较高的行业,数据恢复技术人员需要具备汇编语言和软件应用的技能,还需要电子维修和机械维修以及硬盘技术。

        第一:软件应用和汇编语言基础

        在数据恢复的案例中,软件级的问题占了三分之二以上的比例,比如文件丢失、分区表丢失或破坏、数据库破坏等,这些就需要具备对DOS、Windows、Linux以及Mac的操作系统以及数据结构的熟练掌握,需要对一些数据恢复工具和反汇编工具的熟练应用。

        第二:电子电路维修技能

        在硬盘的故障中,电路的故障占据了大约一成的比例,最多的就是电阻烧毁和芯片烧毁,作为一个技术人员,必须具备电子电路知识已经熟练的焊接技术。

        第三:机械维修技能

        随着硬盘容量的增加,硬盘的结构也越来越复杂,磁头故障和电机故障也变的比较常见,开盘技术已经成为一个数据恢复工程师必须具备的技能。

        第四:硬盘固件级维修技术

        硬盘固件损坏也是造成数据丢失的一个重要原因,固件维修不当造成数据破坏的风险相对比较高,而固件级维修则需要比较专业的技能和丰富的经验。

如何使用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修复完成!"

FAT32、NTFS、exFAT:试看分区格式与固态硬盘性能

固态硬盘迅速普及,相关应用问题也逐渐多了起来,尤其是如何做到性能的最优化?Tom'sHardware今天做了一个很特别的评测,考察了固态硬盘在FAT32、NTFS、exFAT三种不同分区格式行下的性能差异。或许很多玩家根本还没注意到这方面的影响吧。

FAT32:

1997年的Windows 95 OSR2第二版系统中首次引入,至今依然很流行,特别是低容量设备上,因为支持实在太过广泛,技术所有的主流操作系统都可以创建、读取、写入FAT32分区。

因为是32位文件系统,FAT32分区的最大容量只有2TB,8KB簇下也不过32TB,单个文件体积更是不能超过4GB,文件名长度也不可以超过255个字符。

另外,FAT32不支持日志、版权管理等高级技术,安全性也很差。

NTFS:

全称New Technology File System(新技术文件系统),Windows NT的新特性,属性类似IBM HPFS。文件体积最大16TB(理论上16EB),分区容量最大256TB,不过文件名还是最多255个字符。

NTFS还支持LZ77压缩、文件级加密(一般是AES)、访问控制(ACL),簇尺寸减小到4KB(这一点对固态硬盘很重要)。主文件表(MFT)负责存储稳健的属性、位置、访问信息。

exFAT:

微软专门为闪存设备设计的文件系统,高容量的SDXC卡默认都是这种格式,但也并不强求。Windows XP SP2、Windows Vista SP1及以上系统都支持,分区最大容量64ZB,文件体积最大16EB。簇尺寸可以大到16MB,访问控制则还是依靠ACL。

exFAT利用剩余空间位图来管理容量分配,提高删除性能,这对改善写入性能非常重要,尤其是对比NTFS。

但要注意的是,在exFAT分区上安装Windows系统是不可能的。Windows Vista/7都非常依赖NTFS的文件许可等特性。

不过由于微软授权机制的限制,exFAT的普及并不广泛,在消费电子领域的应用也不是特别多。

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

测试平台配置:

处理器:Core i5-2500K 3.3GHz
主板:技嘉GA-Z68X-UD3H-B3
内存:海盗船TR3X6G1600C8D DDR3-1333 2GB×2
系统盘:Intel X25-M G1 80GB (固件0701)
测试盘:三星830 256GB、思民F1 240GB
控制器:Intel Z68 SATA 6Gbps
电源:海韵X-760 760W
操作系统:Windows 7 SP1 x64旗舰版
驱动程序:Intel INF 9.2.0.1030、Intel RST 10.5.0.1026

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能
参测固态硬盘之一:三星830 256GB (MCX主控)

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能
参测固态硬盘之二:思民F1 240GB (SandForce SF-2281主控)

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD 4KB随机读写:FAT32上三星830的写入慢了太多,但是思民F1上又是最好的,这似乎不是分区格式本身的问题。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD 4KB随机读写(队列深度64):exFAT都是最好的,NTFS紧随其后,FAT32就完全不行了,不过注意普通桌面应用是极少能涉及到64的队列深度的。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD持续读写:FAT32再次败下阵来,特别是思民F1上惨不忍睹。exFAT、NTFS读取都差不多,但写入得看硬盘。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD访问时间:exFAT、NTFS旗鼓相当,FAT32又一次不济。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD拷贝测试:这个项目更偏向实际情况,NTFS自然是首选,FAT32老了。

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

AS SSD整体得分:exFAT、NTFS彼此彼此,互有高低。

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

CrystalDiskMark 4KB随机读写:FAT32的读取还好,写入就不行了,意料之中。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

CrystalDiskMark 4KB读写(队列深度32):同上。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

CrystalDiskMark 512KB随机读写:exFAT在三星830上很突出,思民F1上则是NTFS略略占优,看来不同固态硬盘的影响也不小。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

CrystalDiskMark持续读写:这次三种各式完全一致,难得。

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

Iometer 4KB随机读写:FAT32还是读取勉强还能凑合,写入就完全不行了。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

Iometer持续读写:几乎完全一样,FAT32只是偶尔稍稍落后一点。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

Iometer数据库模式:FAT32大败,NTFS大胜。

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

Iometer网络服务器模式:FAT32这次还不错。

Iometer工作站模式:FAT32又成了阿斗。

 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

PCMark 7:媒体中心、Windows Media Player添加音乐两个项目都惊人地一致,程序载入、游戏、Windows Movie Maker视频编辑、Windows Defender、系统存储等项目FAT32稍稍落后但不明显,Windows照片库导入图片因为要写入很多数据,FAT32劣势就出来了。

小结:

如果你使用Windows系统,NTFS文件系统显然是上佳之选。这种默认的分区格式在测试的两块固态硬盘上基本都可以带来最好的性能,便利性也是最好的,而且很多非Windows系统也能读取它,有着较好的跨系统兼容性。

FAT32虽然有着最广泛的平台兼容性,但毕竟廉颇老矣,除了小容量U盘之外实在不推荐使用。缺乏各种先进特性,读写性能也是一塌糊涂。

exFAT其实也表现良好,很多时候甚至要比NTFS更好一些,良好的热插拔支持更是使得它非常适合外接USB存储设备,不过内部硬盘最好还是选NTFS,尤其是系统盘只能用NTFS。如果你有多块固态硬盘,内NTFS外exFAT或许是最佳选择。 

FAT32/NTFS/exFAT:试看分区格式与固态硬盘性能

 

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)"