WinHex腳本開發指令
WinHex腳本開發指令
1.Assign命令聲明變量
按常理說,變量聲明在任何編程語言中都是最最基礎的語法,但在WinHex腳本中并非如此,因為其中有很多命令都可以在執行功能的同時順帶創建變量。
其語法為:
官方文檔對Assign的描述非常詳細,我們應該仔細看看:
聲明一個變量,賦予十進制常量12345。
聲明一個變量,賦予十六進制常量0x0D0A。
聲明一個變量,賦予字符串常量”I likeWinHex”。
聲明一個變量,將另一個變量的值賦給它。
2.用ForAllObjDo命令做并行
ForAllObjDo和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語法為:
JumpTo語法為:
很多情況下,Label和JumpTo可以代替循環。
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組合,這里我們先簡單演示,讓大家徹底清晰起來。
5.Block選塊命令
Block確定需要操作的數據的范圍,是使用頻率較高的命令。Block往往和其它命令配合使用,如Find、CreateIntoFile等。
其語法為:Block 起始偏移地址 結束偏移地址。其中起始偏移地址和結束偏移地址可以是常量也可以是變量。
6.Move移動光標命令
Move命令和Goto命令的區別就是在于前者是相對跳轉,而后者是絕對跳轉。Move 512表示從當前位置前進512,而Goto 512表示跳轉到整個可訪問對像的512偏移處。
其語法為:Move 數量。其中“數量”可以是正整數也可以是負整數,正整數表示前進n字節,負整數表示后退n字節。例如: