Winhex腳本是運行於winhex的一種腳本語言,用於數據的批量搜尋、定位、修改。
基本介紹
- 中文名:winhex腳本
- 運行環境:winhex
- 用途:數據的批量搜尋、定位等
- 特點:複雜繁瑣的數據分析過程智慧型化
腳本分析,變數,操作符,關鍵字,函式,語句,一個簡單的例子,
腳本分析
Winhex腳本是運行於winhex的一種腳本語言,用於數據的批量搜尋、定位、修改。他服務於底層數據,對用戶來說,就是將原本複雜繁瑣的手工數據分析過程智慧型化,這和開發一個全新的數據恢復軟體是一樣的。我們只需一次告訴WINHEX要乾什麼,剩下的由winhex自動執行。它WINHEX內部函式功能的高度濃縮。同時,一旦脫離了底層數據,它就喪失其根本目標。也就是說,沒有硬碟,沒有檔案,沒有記憶體,這個語言就失去了運行基礎。
變數
Winhex的變數類似於javascript,並不需要指明變數的類型,直接賦值給變數就能讓變數表達相應類型
Assign MyVariable 12345
Assign MyVariable 0x0D0A
Assign MyVariable "I like WinHex"
Assign MyVariable MyOtherVariable
將整數,二進制數值,ASCII文本,或其他變數內容保存到“MyVariable”變數中。如果這個變數不存在,將會被自動創建。其他的創建變數的方法:Read,GetUserInput,InttoStr。同時可以允許有48個變數存在。
Release MyVariable
刪除一個已存在的變數,因為winhex腳本中只支持48個變數存在,所以用過的不再使用變數我們可以將其刪除以釋放變數空間。
GetUserInput MyVariable "Please enter your name:"
在腳本運行期間,保存用戶指定的ASCII文本或二進制數據(0x...)到變數“MyVariable”中。第二個參數給除了用戶提示。如果變數不存在,它將重新創建一個。其他創建變數的方式:Assign,Read。
GetUserInputI MyIntegerVariable "Please enter your age:"
與GetUserInput功能相同,但是只允許整數型變數。
Inc MyVariable
將變數解釋為整數(不大於8位)並且每運行一次變數自動加1。在循環中有用。
Dec MyVariable
將變數解釋為整數(不大於8位)並且每運行一次變數自動減1。在循環中有用。
IntToStr MyStr MyInt
IntToStr MyStr 12345
將第一個變數中的ASCII文本轉換成整數並保存到第二個變數中。
StrToInt MyInt MyStr
將第一個變數中的整數轉換成ASCII文本並保存到第二個變數中。
操作符
加法(+),減法(-),乘法(*),整除(/),模除(%),邏輯運算符AND(&),OR(|),以及XOR(^)。
以下是有效的數學表達式:
(5*2+1)
(MyVar1/(MyVar2+4))
or (-MyVar)。
關鍵字
getsize getsize 表示檔案大小
unlimited unlimited 無限語句
函式
Create "D:\My File.txt" 1000
創建一個1000位元組的新檔案,如果已經存在同名檔案,則將其覆蓋。
Open "D:\My File.txt"
Open "D:\*.txt"
打開指定格式的檔案,如果通配符為“?”則winhex會讓用戶選擇要打開的檔案。
Open C:
Open D:
Open 80h
Open 81h
Open 9Eh
打開指定的物理介質。軟碟的為00h,硬碟與u盤為80h,光碟為9Eh。
可以增加第二個參數來設定檔案或者介質的編輯模式(“in-place”或者“read-only”)
CreateBackup
為活動檔案的當前狀態創建WHX備份。
CreateBackupEx 0 100000 650 true "F:\My backup.whx"
如果備份檔案不需要分割,則第三個參數的數值該為0即可。如果不啟動壓縮功能則將“true”改為“false”。如果需要自動分配檔案名稱以及檔案路徑則最後的參數表示為“""”即可。
Goto 0x128
Goto MyVariable
Move -100
Write "Test"
Write 0x0D0A
Write MyVariable
在游標當前位置(以覆蓋模式)寫入ASCII字元“Test”或者兩個位元組的16進制數“0D0A”。這裡同樣可以寫入數字變數中的值。同時將游標移動到被覆蓋部分的後面。當到達檔案的結尾時,將在檔案尾部添加空位元組以完成操作。下一個寫命令將不會在檔案尾巴。
Write2
和“Write”的功能類似,當時當到達檔案結尾的時候,不會在檔案添加空位元組。
So it is not safe to assume that Write2 always moves the current position forward by the number of bytes written.
Insert "Test"
功能與“Write”類似,但是在“insert”模式只能套用於檔案。
Read MyVariable 10
ReadLn MyVariable
從當前位置讀入一整行的數據到“MyVariable”變數中直到遇到換行符。如果變數已經存在了,則變數的大小將會被從新調整。
Close
不保存的關閉當前活動視窗。
CloseAll
不保存的關閉所有視窗。
Save
保存當前活動視窗中打開的檔案或磁碟的修改。
SaveAs "C:\New Name.txt"
SaveAll
保存所有視窗中修改。
Terminate
中斷腳本的執行。
Exit
中斷腳本的執行並且關閉winhex。
ExitIfNoFilesOpen
如果在winhex中沒有打開的檔案將終止腳本檔案的執行。
Block 100 200
Block "My Variable 1" "My Variable 2"
Block1 0x100
Block2 0x200
定義一個從開頭到偏移量0x200部分的選塊。同樣可以使用變數。
Copy
Cut
將當前選塊中的檔案剪下到剪下板中。
Remove
將當前選塊中的數據從檔案中移除。
CopyIntoNewFile "D:\New File.dat"
CopyIntoNewFile "D:\File +MyVariable+.dat"
將當前選塊中的數據複製進指定的新檔案,而不複製進剪下板。如果沒有定義選塊,其功能和編輯選單中的複製命令相同。同樣可以複製磁碟扇區中的數據作為一個新檔案。新建的檔案不會自動在winhex的編輯視窗中打開。可以在“+”之間加入變數,變數名將被解釋為不大於2^24(16M)的整數。通常在循環套用以及檔案恢復中比較有用。
Paste
將剪下板中的數據貼上入檔案中,並且不改變游標當前位置。
WriteClipboard
將剪下板中的數據寫入檔案或磁碟扇的當前位置中,不改變游標當前位置,並且覆蓋從當前游標所在位置以後的數據。
Convert Param1 Param2
將當前活動檔案中的數據從一種格式轉換成另一種格式。有效的參數是ANSI,IBM,EBCDIC,Binary,HexASCII,IntelHex,
MotorolaS, Base64, UUCode, LowerCase, 以及UpperCase,與轉換選單中的轉換選單命令功能相同。
AESEncrypt "My Password"
使用AES加密當前活動檔案或者磁碟,或其選塊,使用指定的密鑰(最高32位)。
AESDecrypt "My Password"
解密當前活動檔案或磁碟。
Find "John" [MatchCase MatchWord Down Up BlockOnly SaveAllPos Unicode Wildcards]
Find 0x1234 [Down Up BlockOnly SaveAllPos Wildcards]
分別搜尋當前活動視窗中名為“john”的字元串或16進制值數0x1234,並且在第一個搜尋到的地方停下來。其他的參數是可選的。
默認的winhex搜尋整個檔案或磁碟。其他的可選參數功能和通常的winhex搜尋選項相同。
ReplaceAll "Jon" "Don" [MatchCase MatchWord Down Up BlockOnly Unicode Wildcards]
ReplaceAll 0x0A 0x0D0A [Down Up BlockOnly Wildcards]
在當前活動視窗中使用其他的值替換所有存在上述字元串或16進制數值的地方。在“in-place”模式下只能套用與磁碟。
CopyFile C:\A.dat D:\B.dat
將C:\A.dat檔案中的內容複製到D:\B.dat中。
MoveFile C:\A.dat D:\B.dat
將C:\A.dat檔案轉移到D糟中並命名為D:\B.dat。
DeleteFile C:\A.dat
將C:\A.dat檔案刪除。
InitFreeSpace
InitSlackSpace
使用當前初始化設定清理當前邏輯驅動器中的所有自由空間或鬆散空間,InitSlackSpace將驅動器的模式臨時轉換為“in-place”模式,以保存未保存的修改。
InitMFTRecords
使用當前初始化設定在當前NTFS格式的邏輯驅動器中清理未使用的MFT FILE記錄。對於其他的檔案系統無效。修改立即就會寫入硬碟中。
GetClusterAlloc MyStr
在邏輯卷中,找回哪個檔案被儲存在當前簇中的文本描述,然後將描述保存到指定的變數中。
GetClusterAllocEx IntVar
在邏輯卷中,找回一個整數值指示簇是否被分配,1或者非0,表示該簇已被分配。並且將描述保存在指定變數中。
GetClusterSize IntVar
返回邏輯卷中簇的大小,並將數值保存到指定的變數中。
InterpretImageAsDisk
CalcHash HashType MyVariable
CalcHashEx HashType MyVariable
與工具選單中的hash命令功能相同並且將變數儲存在指定變數中(如果變數不存在,則會自動創建)。HashType參數必須為以下類型中的一種:CS8, CS16, CS32, CS64, CRC16, CRC32, MD5, SHA-1, SHA-256, PSCHF。CalcHashEx命令將在windows視窗中顯示hash值。
MessageBox "Caution"
顯示信息對話框,並且提供ok和cancel兩個按鈕。按下cancel按腳本本。
ExecuteScript "ScriptName"
在腳本的當前運行處運行另一個腳本。調用其他外部腳本可以鑲套使用。當被調用的腳本執行完成以後,腳本繼續執行下面的命令。這個特徵可以幫助用戶清楚的了解腳本的結構。
Turbo On
Turbo Off
管理道模式開關。
Debug
用戶可以利用該命令確定腳本中的每一條命令都是否有效。
UseLogFile
語句
IfFound
如果發現了值則執行下面的命令。
IfEqual MyVariable "Hello World"
IfEqual 0x12345678 MyVariable
IfEqual MyVariable 1000
IfEqual MyVariable MyOtherVariable
IfEqual MyVariable (10*MyOtherVariable)
比較兩個整數值(其中每個值可以是常量,整數變數或者數學表達式)或者兩個變數,ASCII字元串,或16進制數值(2進制模式)。比較兩個對象的2進制數值長度,如果不相同的話則返回結果為false。只有返回值為true時,下面的命令才會被執行。if條件不可以鑲套使用。
IfGreater MyVariable "Hello World"
IfGreater 0x12345678 MyVariable
IfGreater MyVariable 1000
IfGreater MyVariable MyOtherVariable
IfGreater MyVariable (10*MyOtherVariable)
和IfEqual擁有相同的參數。第一個參數大於第二個參數,返回值為true,則下面的命令才能被執行。if條件不可以鑲套使用。
Else
套用在IfFound或IfEqual之後。如果沒有任何對象被搜尋到或者比較的目標不相同,則執行else後面的代碼。
EndIf
結束if條件命令執行(在IfFound或IfEqual之後)。
{...
ExitLoop
...}
退出循環。其後會有一個方括弧來定義其循環次數,可以是變數也可以是關鍵字“unlimited”(無限循環)。winhex腳本中循環只能使用ExitLoop命令來退出。循環不可以鑲套使用。
舉例:
{ Write "Loop" }[10] 將輸出“Loop”字元串10次。
Label ContinueHere
創建一個標籤並命名為“ContinueHere”
JumpTo ContinueHere
腳本跳轉到標籤處繼續執行.
NextObj
循環在所有視窗中進行切換“活動”視窗。如果有三個視窗被打開,並且視窗#3狀態為活動視窗,則“NextObj”命令將會讓視窗#1變為活動視窗。
ForAllObjDo
在ForAllObjDo與EndDo之間的腳本代碼將在所有打開的檔案或者磁碟中執行。
一個簡單的例子
恢復NTFS分區DBR扇區
open :? //打開故障分區(自己選擇)
assign w1 getsize //聲明w1的值為最大(也就當前打開分區的總位元組)
//getsize為最大所以我們要-512位元組才是DBR備份的開始位置
read w2 512 //讀取512個位元組到變數w2 把NTFS備份DBR讀入到變數w2
goto 0x000 //跳轉到開始位置
write w2 //寫入變數w2(把剛才NTFS備份DBR的信息寫入到0號扇區)
save //保存