java winhex_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”的功能類似,都是為了避免模板定義的數據和應用程序的數據不匹配而引發的錯誤??梢岳谩皉equires”事先指定好特征碼。比如,一個有效的主引導扇區偏移量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就會循環執行直到文件結尾部分?;蛘呤褂谩癊xitLoop”強迫循環終止。
在比較兩個值是否相等方面,winhex模板給出了一個非常有用的命令“IfEqual”?!癐fEqual”操作的兩個表達式可以是10進制常量,整數變量或數學表達式,或者字符串(文本或16進制值(winhex將逐字節的進行比較))。ASCII字符串必須用雙引號括起來。而16進制數必須用“0x”開頭。公式需要用括號括起來。
{
byte?? Value
IfEqual??Value 1
ExitLoop
EndIf
} [10]
“IfEqual”命令以“EndIf”語句作為結尾。如果表達式的值是相同的則繼續運行。還可以在語句中插入“Else”語句,這樣當“IfEqual”的兩個表達式不相同時,跳轉到“Else”下繼續執行。“IfEqual”語句不可以鑲套使用?!癐fGeater”語句和“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”。
總結
以上是生活随笔為你收集整理的java winhex_winhex模版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【云原生系列】第二讲:Knative 简
- 下一篇: Amazon Aurora Server