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
在方括號(hào)里的標(biāo)簽表示為可選項(xiàng)。標(biāo)簽的順序沒(méi)有硬性的規(guī)定,用戶可以隨意的更改他們的順序。表達(dá)式中如果有空格則必須用雙引號(hào)括起來(lái)。模板文件中的注釋以為雙斜杠開(kāi)頭。
關(guān)鍵字“applies_to”后必須跟著“file,disk,或RAM”中的一個(gè)。模板應(yīng)用于不同的介質(zhì)的時(shí)候,winhex將發(fā)出錯(cuò)誤警告。
默認(rèn)的情況下,模板將從窗口中光標(biāo)的位置處執(zhí)行,使用“fixed_start”選項(xiàng)將讓模板從磁盤(pán)或文件的偏移量的絕對(duì)開(kāi)頭處運(yùn)行。
應(yīng)用于磁盤(pán)的模板,關(guān)鍵字“sector-aligned”將讓模板從當(dāng)前扇區(qū)的開(kāi)頭處運(yùn)行,而忽略光標(biāo)的當(dāng)前位置。
關(guān)鍵字“requires”同“applies_to”的功能類似,都是為了避免模板定義的數(shù)據(jù)和應(yīng)用程序的數(shù)據(jù)不匹配而引發(fā)的錯(cuò)誤。可以利用“requires”事先指定好特征碼。比如,一個(gè)有效的主引導(dǎo)扇區(qū)偏移量0x1FE位置必須為“55 AA”(也就是扇區(qū)的最后兩個(gè)字節(jié)),而一個(gè)有效的可執(zhí)行文件在偏移量0x0位置必須為“4D 5A”(“MZ”)。模板頭中可以定義多行“ applies_to”。
關(guān)鍵字“big-endian”使模板中讀到的字節(jié)以big-endian順序排列(高位字節(jié)開(kāi)頭,intel平臺(tái)中一般都是little-endian,蘋(píng)果機(jī)中通常為big-endian,在windows下分析mac文件可能會(huì)用到此關(guān)鍵字)
關(guān)鍵字“hexadecimal”使模板中獨(dú)到的數(shù)據(jù)都以16進(jìn)制方式顯示。
關(guān)鍵字“read-only”使模板執(zhí)行后顯示的模板面板為只讀模式,不可通過(guò)模板面修改數(shù)據(jù)。
關(guān)鍵字“multiple”可以讓模板直接讀取臨近的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(只適用于數(shù)據(jù)大小固定的情況下)。(可以參考winhex下的“FAT Directory Entry”模板)
2 主干:變量申明
模板文件的主干部分同其他編程語(yǔ)言一樣,主要由變量申明組成。申明的基礎(chǔ)形式如下:
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”包括空格就必須使用雙引號(hào)括起來(lái)(“title”不能全都是數(shù)字,并且“title”部分大小寫(xiě)不敏感)。最多可以包含41個(gè)字符。
“type”部分至少可以使用下列的一個(gè)關(guān)鍵字來(lái)修飾:
big-endian????little-endian
hexadecimal?? decimal??????????octal
read-only???? read-write
這些關(guān)鍵字會(huì)直接作用于其后的變量。如果他們?cè)陬^部已經(jīng)定義過(guò)了,那么在主干部分再重復(fù)定義就顯的多余了。(在頭部定義后作用于全局)
在“type”之后的數(shù)字表示變量的長(zhǎng)度(數(shù)值則為字節(jié),字符串則為字符,在模板中可編輯的長(zhǎng)度最多為8192個(gè)字節(jié))。在winhex中使用“char16”,“string16”以及“hex”可以支持使用unicode字符和字符串,但不支持unicode字符開(kāi)頭的256個(gè)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.
用戶可以申明一個(gè)將數(shù)組變量,并且將數(shù)組變量的大小放在后面的方括號(hào)里(如果指定為“unlimited”,則模板會(huì)執(zhí)行直到文件結(jié)尾處)。以下兩行代碼申明了一個(gè)動(dòng)態(tài)的ASCII字符串,其長(zhǎng)度取決于之前的變量大小:
uint8??????"len"
char[len]??"A string"
以下兩句功能相同
byte?????? "len"
string len "A string"
字符“~”表示數(shù)組編號(hào)的占位符(請(qǐng)看下面)。這個(gè)字符對(duì)“char”數(shù)據(jù)類型的變量無(wú)效,因此會(huì)自動(dòng)的解析成字符串類型。
string,string16和hex類型的變量大小,可以通過(guò)數(shù)學(xué)表達(dá)式來(lái)表示,數(shù)學(xué)表達(dá)式需要用括號(hào)括起來(lái),并且表達(dá)式中不能包含空格。同樣也可以將變量帶入數(shù)學(xué)表達(dá)式中(同樣變量名不能有空格)。支持的操作有,加法(+),減法(-),乘法(*),整除(/),模除(%),邏輯運(yùn)算符AND(&),OR(|),以及XOR(^)。比如:(5*2+1),(len1/(len2+4))。注意:結(jié)果必須為正整數(shù)。
3 主干:高級(jí)命令
當(dāng)我們用大括號(hào)將一個(gè)代碼塊設(shè)置循環(huán)運(yùn)行時(shí),我們可以用占位符“~”來(lái)確定循環(huán)的次數(shù),下列代碼中“numbering”定義了初始值為1(默認(rèn)為0)。
numbering??1
{
byte?????? "len"
string len "String No. ~"
}[10]
上面代碼在模板中的運(yùn)行結(jié)果將顯示:“String No. 1”, “String No. 2”...“String No. 10”。用戶可以使用“unlimited”代替方括號(hào)中的10,這樣winhex就會(huì)循環(huán)執(zhí)行直到文件結(jié)尾部分。或者使用“ExitLoop”強(qiáng)迫循環(huán)終止。
在比較兩個(gè)值是否相等方面,winhex模板給出了一個(gè)非常有用的命令“IfEqual”。“IfEqual”操作的兩個(gè)表達(dá)式可以是10進(jìn)制常量,整數(shù)變量或數(shù)學(xué)表達(dá)式,或者字符串(文本或16進(jìn)制值(winhex將逐字節(jié)的進(jìn)行比較))。ASCII字符串必須用雙引號(hào)括起來(lái)。而16進(jìn)制數(shù)必須用“0x”開(kāi)頭。公式需要用括號(hào)括起來(lái)。
{
byte?? Value
IfEqual??Value 1
ExitLoop
EndIf
} [10]
“IfEqual”命令以“EndIf”語(yǔ)句作為結(jié)尾。如果表達(dá)式的值是相同的則繼續(xù)運(yùn)行。還可以在語(yǔ)句中插入“Else”語(yǔ)句,這樣當(dāng)“IfEqual”的兩個(gè)表達(dá)式不相同時(shí),跳轉(zhuǎn)到“Else”下繼續(xù)執(zhí)行。“IfEqual”語(yǔ)句不可以鑲套使用。“IfGeater”語(yǔ)句和“IfEqual”的用法相似。只是“IfGeater”是用來(lái)比較第一個(gè)表達(dá)式的值是否大于第二個(gè)表達(dá)式的值。字符串和16進(jìn)制值將按照字典順序排列。
為了方便閱讀和查看模板文件,你可以將某些變量捆綁為一組,單獨(dú)的顯示在模板面板上:
section????"...Section Title..."
...
endsection
“move”和“goto”命令不用來(lái)申明變量,但是可以精確的改變當(dāng)前位置,跳過(guò)無(wú)關(guān)的數(shù)據(jù)。使用move n語(yǔ)句可以從當(dāng)前位置條國(guó)n個(gè)字節(jié)到下一個(gè)位置,n可以為負(fù)值(正即向前跳,負(fù)即向后跳)。而goto n語(yǔ)句中的n則表示了從模板開(kāi)始解釋的地方到n的絕對(duì)位置(此時(shí)的n必須為正數(shù))
下面的例子演示了如何將一個(gè)變量作為整數(shù)和16進(jìn)制數(shù)值查看的方法:
int32??????"Disk serial number (decimal)"
move -4
hex 4??????"Disk serial number (hex)"
4 主干:靈活的整數(shù)變量
winhex模板支持的一個(gè)特殊的變量類型是“uint_flex”。
總結(jié)
以上是生活随笔為你收集整理的java winhex_winhex模版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【云原生系列】第二讲:Knative 简
- 下一篇: Amazon Aurora Server