WinHex脚本开发指令

2019-01-10 12:43:17 Mark 489

WinHex脚本开发指令


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

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

CloseAllCreate "D:test1.img" 0Create "D:test2.img" 0Create "D:test3.img" 0SaveAllCloseAllOpen "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 gzpFind 0x55AA downIfFoundAssign love1 CurrentPosMessageBox "找到了"goto (love1+2)ElseMessageBox "循环终止"EndIfJumpTo 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 0xeb52904eIfFoundRead love1 512Messagebox love1EndIf

 5.Block选块命令

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

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

Block 0x100 0x200Block Addr1 Addr2

6.Move移动光标命令

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

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

Move 100Move -50