WinHex腳本開發指令

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

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


彩票平台有哪些大台子 66江苏麻将怎么作弊 内蒙古11选五中三个号 二四六精选天天好彩挂牌 正规靠谱的彩票app 2018哈尔滨麻将微信群 真人美女打麻将官网 下载微乐捉鸡麻将 时时彩软件免费下载基地 青海11选5基夲走势图 黑龙江p62今日开奖结果 吉祥棋牌吉祥棋牌免费下载下载 成都麻将打5元算钱规则 闲来个人代理中心 76人雄鹿 手机彩票官方大平台 皮皮游戏星悦广西麻将