winhex模版

1 模板頭
模板頭的格式:

template "title"
[description "description"]
[applies_to (file/disk/RAM)]
[fixed_start offset]
[sector-aligned]
[requires offset "hex values"]
[big-endian]
[hexadecimal/octal]
[read-only]
[multiple [fixed overall size]]
// Put any general comments to the template here.
begin
  variable declarations
end

在方括號裏的標籤表示爲可選項。標籤的順序沒有硬性的規定,用戶可以隨意的更改他們的順序。表達式中如果有空格則必須用雙引號括起來。模板文件中的註釋以爲雙斜槓開頭。

關鍵字“applies_to”後必須跟着“file,disk,或RAM”中的一個。模板應用於不同的介質的時候,winhex將發出錯誤警告。

默認的情況下,模板將從窗口中光標的位置處執行,使用“fixed_start”選項將讓模板從磁盤或文件的偏移量的絕對開頭處運行。

應用於磁盤的模板,關鍵字“sector-aligned”將讓模板從當前扇區的開頭處運行,而忽略光標的當前位置。

關鍵字“requires”同“applies_to”的功能類似,都是爲了避免模板定義的數據和應用程序的數據不匹配而引發的錯誤。可以利用“requires”事先指定好特徵碼。比如,一個有效的主引導扇區偏移量0x1FE位置必須爲“55 AA”(也就是扇區的最後兩個字節),而一個有效的可執行文件在偏移量0x0位置必須爲“4D 5A”(“MZ”)。模板頭中可以定義多行“ applies_to”。

關鍵字“big-endian”使模板中讀到的字節以big-endian順序排列(高位字節開頭,intel平臺中一般都是little-endian,蘋果機中通常爲big-endian,在windows下分析mac文件可能會用到此關鍵字)

關鍵字“hexadecimal”使模板中獨到的數據都以16進制方式顯示。

關鍵字“read-only”使模板執行後顯示的模板面板爲只讀模式,不可通過模板面修改數據。

關鍵字“multiple”可以讓模板直接讀取臨近的數據的數據結構(只適用於數據大小固定的情況下)。(可以參考winhex下的“FAT Directory Entry”模板)

2 主幹:變量申明
模板文件的主幹部分同其他編程語言一樣,主要由變量申明組成。申明的基礎形式如下:

type "title"

類型可以是以下類型的任意一種:
int8,  uint8  = byte, int16, uint16, int24, uint24, int32, uint32, int64,  
uint_flex
binary,
float = single, real, double, longdouble = extended,
char, char16, string, string16,   zstring, zstring16,
boole8 = boolean, boole16, boole32
hex,
DOSDateTime, FileTime, OLEDateTime, SQLDateTime, UNIXDateTime = time_t, JavaDateTime

如果“title”包括空格就必須使用雙引號括起來(“title”不能全都是數字,並且“title”部分大小寫不敏感)。最多可以包含41個字符。

“type”部分至少可以使用下列的一個關鍵字來修飾:

big-endian    little-endian
hexadecimal   decimal          octal
read-only     read-write

這些關鍵字會直接作用於其後的變量。如果他們在頭部已經定義過了,那麼在主幹部分再重複定義就顯的多餘了。(在頭部定義後作用於全局)

在“type”之後的數字表示變量的長度(數值則爲字節,字符串則爲字符,在模板中可編輯的長度最多爲8192個字節)。在winhex中使用“char16”,“string16”以及“hex”可以支持使用unicode字符和字符串,但不支持unicode字符開頭的256個ANSI字符。

“string”,“string16”以及“hex”類型
The types string,  string16, and  hex require an additional parameter that specifies the
number of elements. This parameter may be a constant or a previously declared variable. If it is a
constant, it may be specified in hexadecimal format, which is recognized if the number is
preceded by 0x.

用戶可以申明一個將數組變量,並且將數組變量的大小放在後面的方括號裏(如果指定爲“unlimited”,則模板會執行直到文件結尾處)。以下兩行代碼申明瞭一個動態的ASCII字符串,其長度取決於之前的變量大小:

uint8      "len"
char[len]  "A string"

以下兩句功能相同

byte       "len"
string len "A string"

字符“~”表示數組編號的佔位符(請看下面)。這個字符對“char”數據類型的變量無效,因此會自動的解析成字符串類型。

string,string16和hex類型的變量大小,可以通過數學表達式來表示,數學表達式需要用括號括起來,並且表達式中不能包含空格。同樣也可以將變量帶入數學表達式中(同樣變量名不能有空格)。支持的操作有,加法(+),減法(-),乘法(*),整除(/),模除(%),邏輯運算符AND(&),OR(|),以及XOR(^)。比如:(5*2+1),(len1/(len2+4))。注意:結果必須爲正整數。

3 主幹:高級命令
當我們用大括號將一個代碼塊設置循環運行時,我們可以用佔位符“~”來確定循環的次數,下列代碼中“numbering”定義了初始值爲1(默認爲0)。

numbering  1
{
byte       "len"
string len "String No. ~"
}[10]

上面代碼在模板中的運行結果將顯示:“String No. 1”, “String No. 2”...“String No. 10”。用戶可以使用“unlimited”代替方括號中的10,這樣winhex就會循環執行直到文件結尾部分。或者使用“ExitLoop”強迫循環終止。

在比較兩個值是否相等方面,winhex模板給出了一個非常有用的命令“IfEqual”。“IfEqual”操作的兩個表達式可以是10進制常量,整數變量或數學表達式,或者字符串(文本或16進制值(winhex將逐字節的進行比較))。ASCII字符串必須用雙引號括起來。而16進制數必須用“0x”開頭。公式需要用括號括起來。

{
byte   Value
IfEqual  Value 1
    ExitLoop
EndIf
} [10]

“IfEqual”命令以“EndIf”語句作爲結尾。如果表達式的值是相同的則繼續運行。還可以在語句中插入“Else”語句,這樣當“IfEqual”的兩個表達式不相同時,跳轉到“Else”下繼續執行。“IfEqual”語句不可以鑲套使用。“IfGeater”語句和“IfEqual”的用法相似。只是“IfGeater”是用來比較第一個表達式的值是否大於第二個表達式的值。字符串和16進制值將按照字典順序排列。

爲了方便閱讀和查看模板文件,你可以將某些變量捆綁爲一組,單獨的顯示在模板面板上:

section    "...Section Title..."
...
endsection

“move”和“goto”命令不用來申明變量,但是可以精確的改變當前位置,跳過無關的數據。使用move n語句可以從當前位置條國n個字節到下一個位置,n可以爲負值(正即向前跳,負即向後跳)。而goto n語句中的n則表示了從模板開始解釋的地方到n的絕對位置(此時的n必須爲正數)

下面的例子演示瞭如何將一個變量作爲整數和16進制數值查看的方法:

int32      "Disk serial number (decimal)"
move -4
hex 4      "Disk serial number (hex)"

4 主幹:靈活的整數變量
winhex模板支持的一個特殊的變量類型是“uint_flex”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章