外地客户如不方便将要进行数据恢复的储存设备(如硬盘,U盘等)送到我们数据恢复中心,可以通过快递至我数据恢复中心。

WinHex脚本开发指令

技术文章 7572℃

1.Assign命令声明变量

按常理说,变量声明在任何编程语言中都是最最基础的语法,但在WinHex脚本中并非如此,因为其中有很多命令都可以在执行功能的同时顺带创建变量。

其语法为:

Assign变量名称初始值。

官方文档对Assign的描述非常详细,我们应该仔细看看:

声明一个变量,赋予十进制常量12345。

Assign MyVariable 12345

声明一个变量,赋予十六进制常量0x0D0A。

Assign MyVariable 0x0D0A

声明一个变量,赋予字符串常量”I likeWinHex”。

Assign MyVariable "I likeWinHex"

声明一个变量,将另一个变量的值赋给它。

Assign MyVariable MyOtherVariable

2.用ForAllObjDo命令做并行

ForAllObjDo和EndDo之间的脚本命令将作用于所有已经打开的访问对象,通俗地讲,就是在所有窗体中执行。聪明的朋友一定会由衷赞叹:“莫非是一种并行特性?”这虽然只是一种“伪并行”,但已经难能可贵。

其语法为:

ForAllObjDo
......语句......
EndDo

该命令使用起来非常简单,将代码放置在其中即可。

CloseAll
Create "D:test1.img" 0
Create "D:test2.img" 0
Create "D:test3.img" 0
SaveAll
CloseAll
Open "D:test1.img"
Open "D:test2.img"
Open "D:test3.img"
ForAllObjDo
{
    Write 0x55AA
}[300]
EndDo

从下图我们可以看到,3个窗体发生了同样的事情:被循环写0x55AA。

使用时要切记:ForAllObjDo针对的是已经打开的窗体,是对现有编辑区数据的处理。脚本 中有一些命令在执行时恰恰不需要现有窗体,如Create、Open等,它们都不适合与ForAllObjDo搭配使用。

通过观察,我们发现ForAllObjDo会首先在第一个窗体执行代码,完毕后才跳转到第二个窗 体,以此类推。所以这种并行与操作系统内核中进程和线程分配、抢占CPU时间片的做法截然不 同,是彻头彻尾的“伪并行”。

3.Label和JumpTo命令

Label和JumpTo用来在程序中标记位置并进行跳转,其功能几乎等同于C语言中的goto关 键字。很多程序设计书籍都告诫大家不要使用类似goto的语法,因为它和结构化、模块化的程序 设计思想相悖,容易形成混乱难以理解的代码逻辑。但作者认为,存在即是合理,只要不滥用, goto可以为程序设计带来不少便利,Linux源码中就存在大量的goto使用案例,但并不影响其阅 读和发展。

可以说goto是汇编语言遗留给C语言的“黑巫术”。因为在汇编语言中,程序靠大量的跳转 指令来安排流程,虽然难以学习,但灵活度是C语言望尘莫及的。WinHex欣然接受了 goto,衍 生出 Label 和 JumpTo。

Label语法为:

Label标记名称。

JumpTo语法为:

JumpTo标记名称。

很多情况下,Label和JumpTo可以代替循环。

Label gzp
Find 0x55AA down
IfFound
    Assign love1 CurrentPos
    MessageBox "找到了"
    goto (love1+2)
Else
    MessageBox "循环终止"
EndIf
JumpTo gzp

4.Find搜索命令

Find是WinHex脚本中最重要的关键字,这么说一点都不过分,因为数据恢复和电子取证的 过程,往往就是对关键数据搜索的过程。强大的搜索功能犹如一张巨大的淘沙密网,去糟粕,存 精华。Find的语法格式大体如下。

其语法为:Find “John” [MatchCase MatchWord Down Up BlockOnly SaveAllPos Unicode Wildcards],其中“John”是搜索标的数据,这里为字符串。

Find 0x1234 [Down Up BlockOnly SaveAllPos Wildcards],其中 0x1234 为搜索标的数据,为十六进制数值。

中括号内是查找参数,有大小写敏感、全局搜索、全字匹配、向下向上、仅作用于选块中、 保存所有搜索结果、搜索Unicode字符、使用通配符等。参数可以有一个也可以同时跟随多个。

而IfFound关键字是WinHex脚本流程控制的核心指令之一,它表达了如果找到则执行某条 语句的意思。比如找到55AA则将该扇区读入变量,找到46494C45则跳转到属性列表,找到DBR 备份则复制到剪切板等。这和C语言的条件判断有一定相似之处,但功能更为专注。

在前面的实例中,几乎无一例外地用到了 Find…Iffound组合,这里我们先简单演示,让大家彻底清晰起来。

Find 0xeb52904e
IfFound
    Read love1 512
    Messagebox love1
EndIf

 5.Block选块命令

Block确定需要操作的数据的范围,是使用频率较高的命令。Block往往和其它命令配合使用,如Find、CreateIntoFile等。

其语法为:Block 起始偏移地址 结束偏移地址。其中起始偏移地址和结束偏移地址可以是常量也可以是变量。

Block 0x100 0x200
Block Addr1 Addr2

6.Move移动光标命令

Move命令和Goto命令的区别就是在于前者是相对跳转,而后者是绝对跳转。Move 512表示从当前位置前进512,而Goto 512表示跳转到整个可访问对像的512偏移处。

其语法为:Move 数量。其中“数量”可以是正整数也可以是负整数,正整数表示前进n字节,负整数表示后退n字节。例如:

Move 100
Move -50

 

 

转载请注明:成都千喜数据恢复中心 » WinHex脚本开发指令

喜欢 (8)or分享 (0)
顶部 电话 微信
微信号:18328458868
QQ 地图 底部