序列號格式
VMProtect 是新一代軟件盜版保護解決方案。VMProtect 是目前強大的反盜版解決方案之一,許多領先的軟件發行商都在使用它。VMProtect允許保護可執行文件(EXE,SCR),動態鏈接庫(DLL,OCX,BPL)和驅動程序(SYS)。
加密解密技術交流群(766135708)
序列號結構
序列號由塊組成。每個區塊從一個標識符字節開始,表示該區塊的內容和可能的長度。最后一個區塊有255個標識符,包含除最后一個區塊外的序列號的校驗。
根據塊的類型,它可以有恒定的或可變的長度。在后一種情況下,長度在塊標識符之后的字節中指定。每個區塊的確切格式在下面描述。
區塊格式
ID | Name | Size (byte) | Description | Example |
---|---|---|---|---|
0×01 | Version | 1 | 該塊包含一個版本的序列號,1字節大小。該版本應是1。 | 01 01 |
0×02 | User name | 1 + N | 該塊包含一個UTF-8編碼的用戶名。在用戶名之前,有1個字節保存著用戶名的長度。因此,一個用戶名的總長度不能超過255字節。不需要尾部的0。 | 02 04 4A 5F 48 4E |
0×03 | 1 + N | 該塊包含一個UTF-8編碼的用戶的電子郵件。在電子郵件之前,有1個字節用來表示長度。因此,一封電子郵件的總長度不能超過255字節。不需要尾部的0。 | 03 07 61 40 62 2E 63 6F 6D | |
0×04 | Hardware identifier | 1 + N | 該塊包含由VMProtectGetCurrentHWID()函數返回的硬件標識符。該函數返回一個base-64的字符串。該字符串的解碼版本被放到序列號中。數據塊的長度應是4的倍數,數據塊前有一個長度字節。最大的數據塊長度是32字節。 | 04 08 E1 E2 E3 E4 A1 A2 A3 A4 |
0×05 | License expiration date | 4 | 該區塊包含序列號過期日期 日期格式描述如下。 | 05 01 0A 07 DA |
0×06 | Maximum operation time | 1 | 該塊包含1個字節,保存程序可以運行的時間(分鐘)。因此,最大的時間可以是255分鐘。 | 06 05 |
0×07 | Product code | 8 | 該塊包含一個產品代碼--由VMProtect創建的8個字節,與產品參數一起導出。這些數據是以base-64編碼導出的,在放到序列號之前必須解碼為一個字節數組。該數組的大小應正好是8個字節。 若缺失,受保護的程序將不能正常工作。 | 07 01 02 03 04 05 06 07 08 |
0×08 | User data | 1 + N | 該塊最多包含255字節的自定義用戶數據。許可證系統不分析這些數據,當調用VMProtectGetSerialNumberData()函數時,會返回這些數據。在數據塊之前,有一個字節保存著用戶數據的大小。 | 08 05 01 02 03 04 05 |
0×09 | Maximum build date | 4 | 該塊包含應用程序的最大構建日期。其格式描述如下。 | 09 01 0A 07 DA |
0xFF | Checksum | 4 | 該區塊包含序列號校驗和。該區塊位于最后一個區塊之前,校驗和是針對之前所有區塊計算的。下面描述了校驗和的計算機制。 | FF 01 02 03 04 |
日期存儲格式
日期以雙字的形式存儲在序列號中 - 0xYYYYMMDD。高階字包含年,低階字包含日和月。字節遵循小尾數表示法--從低到高。如果有一個指向記錄的第一個字節的指針,可以用下面的代碼讀取或寫入日期:
byte *pDate = 0xNNNNNN; // date address
*(DWORD *)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010
DWORD dwExp = *(DWORD *)pDate;
校驗和計算
序列號的校驗和是使用SHA-1散列算法計算的。其結果是五個32位的字組成。第一個字既被用作序列號的校驗和又是小端數(從低到高)。SHA-1散列的字符串表示法使用的是Big Endian - 數字從高字節到低字節,所以如果SHA-1散列是由字符串函數生成的(比如在PHP中),散列的前四個字節應顛倒過來。
其他信息
許可證系統會忽略那些編號不在上面的區塊。在較新的版本中可能會增加新的區塊。我們不建議使用非占用的標識符創建新的區塊! 首先,這可能使密鑰在較新版本的授權系統中失去功能。其次,受保護的程序無論如何也無法讀取這些區塊的值。要在密鑰中存儲額外的信息,請通過用戶數據字段來代替。
序列號沒有SALT,這是一種隨機信息,旨在提供相同輸入數據的密鑰。這個任務是強加給加密算法的。例如,在向一個組織出售一系列密鑰時,你可以在用戶名字段中添加單獨的索引("公司 "LLC,10個密鑰中的1個),或者以任何適當的格式將這些信息插入到用戶數據字段中。