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脚本开发指令