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