1.Assign命令聲明變量
按常理說(shuō),變量聲明在任何編程語(yǔ)言中都是最最基礎(chǔ)的語(yǔ)法,但在WinHex腳本中并非如此,因?yàn)槠渲杏泻芏嗝疃伎梢栽趫?zhí)行功能的同時(shí)順帶創(chuàng)建變量。
其語(yǔ)法為:
Assign變量名稱初始值。
官方文檔對(duì)Assign的描述非常詳細(xì),我們應(yīng)該仔細(xì)看看:
聲明一個(gè)變量,賦予十進(jìn)制常量12345。
Assign MyVariable 12345
聲明一個(gè)變量,賦予十六進(jìn)制常量0x0D0A。
Assign MyVariable 0x0D0A
聲明一個(gè)變量,賦予字符串常量”I likeWinHex”。
Assign MyVariable "I likeWinHex"
聲明一個(gè)變量,將另一個(gè)變量的值賦給它。
Assign MyVariable MyOtherVariable
2.用ForAllObjDo命令做并行
ForAllObjDo和EndDo之間的腳本命令將作用于所有已經(jīng)打開(kāi)的訪問(wèn)對(duì)象,通俗地講,就是在所有窗體中執(zhí)行。聰明的朋友一定會(huì)由衷贊嘆:“莫非是一種并行特性?”這雖然只是一種“偽并行”,但已經(jīng)難能可貴。
其語(yǔ)法為:
ForAllObjDo ......語(yǔ)句...... EndDo
該命令使用起來(lái)非常簡(jiǎn)單,將代碼放置在其中即可。
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個(gè)窗體發(fā)生了同樣的事情:被循環(huán)寫(xiě)0x55AA。
使用時(shí)要切記:ForAllObjDo針對(duì)的是已經(jīng)打開(kāi)的窗體,是對(duì)現(xiàn)有編輯區(qū)數(shù)據(jù)的處理。腳本 中有一些命令在執(zhí)行時(shí)恰恰不需要現(xiàn)有窗體,如Create、Open等,它們都不適合與ForAllObjDo搭配使用。
通過(guò)觀察,我們發(fā)現(xiàn)ForAllObjDo會(huì)首先在第一個(gè)窗體執(zhí)行代碼,完畢后才跳轉(zhuǎn)到第二個(gè)窗 體,以此類推。所以這種并行與操作系統(tǒng)內(nèi)核中進(jìn)程和線程分配、搶占CPU時(shí)間片的做法截然不 同,是徹頭徹尾的“偽并行”。
3.Label和JumpTo命令
Label和JumpTo用來(lái)在程序中標(biāo)記位置并進(jìn)行跳轉(zhuǎn),其功能幾乎等同于C語(yǔ)言中的goto關(guān) 鍵字。很多程序設(shè)計(jì)書(shū)籍都告誡大家不要使用類似goto的語(yǔ)法,因?yàn)樗徒Y(jié)構(gòu)化、模塊化的程序 設(shè)計(jì)思想相悖,容易形成混亂難以理解的代碼邏輯。但作者認(rèn)為,存在即是合理,只要不濫用, goto可以為程序設(shè)計(jì)帶來(lái)不少便利,Linux源碼中就存在大量的goto使用案例,但并不影響其閱 讀和發(fā)展。
可以說(shuō)goto是匯編語(yǔ)言遺留給C語(yǔ)言的“黑巫術(shù)”。因?yàn)樵趨R編語(yǔ)言中,程序靠大量的跳轉(zhuǎn) 指令來(lái)安排流程,雖然難以學(xué)習(xí),但靈活度是C語(yǔ)言望塵莫及的。WinHex欣然接受了 goto,衍 生出 Label 和 JumpTo。
Label語(yǔ)法為:
Label標(biāo)記名稱。
JumpTo語(yǔ)法為:
JumpTo標(biāo)記名稱。
很多情況下,Label和JumpTo可以代替循環(huán)。
Label gzp
Find 0x55AA down
IfFound
Assign love1 CurrentPos
MessageBox "找到了"
goto (love1+2)
Else
MessageBox "循環(huán)終止"
EndIf
JumpTo gzp
4.Find搜索命令
Find是WinHex腳本中最重要的關(guān)鍵字,這么說(shuō)一點(diǎn)都不過(guò)分,因?yàn)閿?shù)據(jù)恢復(fù)和電子取證的 過(guò)程,往往就是對(duì)關(guān)鍵數(shù)據(jù)搜索的過(guò)程。強(qiáng)大的搜索功能猶如一張巨大的淘沙密網(wǎng),去糟粕,存 精華。Find的語(yǔ)法格式大體如下。
其語(yǔ)法為:Find “John” [MatchCase MatchWord Down Up BlockOnly SaveAllPos Unicode Wildcards],其中“John”是搜索標(biāo)的數(shù)據(jù),這里為字符串。
Find 0x1234 [Down Up BlockOnly SaveAllPos Wildcards],其中 0x1234 為搜索標(biāo)的數(shù)據(jù),為十六進(jìn)制數(shù)值。
中括號(hào)內(nèi)是查找參數(shù),有大小寫(xiě)敏感、全局搜索、全字匹配、向下向上、僅作用于選塊中、 保存所有搜索結(jié)果、搜索Unicode字符、使用通配符等。參數(shù)可以有一個(gè)也可以同時(shí)跟隨多個(gè)。
而IfFound關(guān)鍵字是WinHex腳本流程控制的核心指令之一,它表達(dá)了如果找到則執(zhí)行某條 語(yǔ)句的意思。比如找到55AA則將該扇區(qū)讀入變量,找到46494C45則跳轉(zhuǎn)到屬性列表,找到DBR 備份則復(fù)制到剪切板等。這和C語(yǔ)言的條件判斷有一定相似之處,但功能更為專注。
在前面的實(shí)例中,幾乎無(wú)一例外地用到了 Find…Iffound組合,這里我們先簡(jiǎn)單演示,讓大家徹底清晰起來(lái)。
Find 0xeb52904e
IfFound
Read love1 512
Messagebox love1
EndIf
?5.Block選塊命令
Block確定需要操作的數(shù)據(jù)的范圍,是使用頻率較高的命令。Block往往和其它命令配合使用,如Find、CreateIntoFile等。
其語(yǔ)法為:Block 起始偏移地址 結(jié)束偏移地址。其中起始偏移地址和結(jié)束偏移地址可以是常量也可以是變量。
Block 0x100 0x200 Block Addr1 Addr2
6.Move移動(dòng)光標(biāo)命令
Move命令和Goto命令的區(qū)別就是在于前者是相對(duì)跳轉(zhuǎn),而后者是絕對(duì)跳轉(zhuǎn)。Move 512表示從當(dāng)前位置前進(jìn)512,而Goto 512表示跳轉(zhuǎn)到整個(gè)可訪問(wèn)對(duì)像的512偏移處。
其語(yǔ)法為:Move 數(shù)量。其中“數(shù)量”可以是正整數(shù)也可以是負(fù)整數(shù),正整數(shù)表示前進(jìn)n字節(jié),負(fù)整數(shù)表示后退n字節(jié)。例如:
Move 100 Move -50
轉(zhuǎn)載請(qǐng)注明:成都千喜數(shù)據(jù)恢復(fù)中心 » WinHex腳本開(kāi)發(fā)指令
