关于DNF的多媒体包NPK文件的那些事儿(10) - SPK文件
生活随笔
收集整理的這篇文章主要介紹了
关于DNF的多媒体包NPK文件的那些事儿(10) - SPK文件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
因?yàn)镋X收到了解析韓服、日服、美服的DNF客戶端補(bǔ)丁的需求,所以對(duì)SPK文件進(jìn)行了一些探索,似乎基本搞定了(除了NX的意圖)于是就寫了這篇文章。
從官網(wǎng)下載的文件都是SPK格式,SPK格式是對(duì)客戶端文件進(jìn)行一種部分壓縮,是基于BZ2壓縮算法生成的。
接到需求后,首先在CSDN上就發(fā)現(xiàn)了這篇文章: https://blog.csdn.net/u010275932/article/details/76082249
嘛,雖然說只是做參考,這篇文章上也列出了一些作者的一個(gè)示意圖:
當(dāng)然看的我確實(shí)有點(diǎn)一臉ZZ……首先很多地方都不知道,而且分隔符竟然是那么復(fù)雜的一個(gè)東西……雖然說最后靠著split分離出來,也能達(dá)到目的
但是一般來說文件不太可能出現(xiàn)這種花里胡哨的東西,于是就著手深入研究了一下。
首先文件頭問題到不大(唯一奇怪的是長(zhǎng)度表很多數(shù)據(jù)塊的長(zhǎng)度都是0xE1030)
然后文件頭后,發(fā)現(xiàn)了分隔符01 00 00 00,這種東西看起來不像是文件頭的,因此我猜想這個(gè)分隔符不是TAIL,而且01 00 00 00接下來的16字節(jié)很有意思:
首先,第三個(gè)雙字和第四個(gè)雙字分別是第一個(gè)雙字和第二個(gè)雙字按位取反的結(jié)果,第二個(gè)字節(jié)是CSDN這篇文章中提到以“BZh91AY&SY ”為開頭的數(shù)據(jù)開始的字節(jié)長(zhǎng)度,
因此試了下,發(fā)現(xiàn)BZ解壓函數(shù)返回0(說明這段數(shù)據(jù)滿足解壓要求是真實(shí)數(shù)據(jù)),因此猜想第二字節(jié)是真實(shí)數(shù)據(jù)長(zhǎng)度。
至于“BZh91AY&SY??”和這16個(gè)字節(jié)中間還有32個(gè)字節(jié)自然而然就聯(lián)想到哈希了,只是不知道怎么生成的……
于是猜想01 00 00 00并不是TAIL,而是HEAD……
然后順著長(zhǎng)度查找下去,查到了該真實(shí)數(shù)據(jù)的尾部,這里當(dāng)然是第二個(gè)數(shù)據(jù)塊出現(xiàn)了,結(jié)果出現(xiàn)了文章中提到的另一個(gè)分隔符,特長(zhǎng),16字節(jié):
00 00 00 00 00 10 0E 00 FF FF FF FF FF EF F1 FF
后面也沒有"BZh91AY&SY"的字樣了,再往后查也是這個(gè),只不過又多了32字節(jié);
但是文章中發(fā)現(xiàn)以這個(gè)分隔符為開頭總共數(shù)據(jù)文件也是48字節(jié),因此估計(jì)這個(gè)分隔符后面的32字節(jié)也是一段哈希,再往后就是真實(shí)數(shù)據(jù)了。
兩個(gè)數(shù)據(jù)塊都是48字節(jié)的頭帶一段真實(shí)數(shù)據(jù),就讓我不得不懷疑他們有沒有關(guān)系。
突然發(fā)現(xiàn),這個(gè)分隔符也是滿足 第三雙字是第一雙字取反,第四雙字是第二雙字取反 ,又發(fā)現(xiàn)第二雙字不就是等于文件頭內(nèi)長(zhǎng)度表不就是0XE1030嘛,就是第二字節(jié)加上0x30(十進(jìn)制的48)!
也就是說這16字節(jié)和10 00 00 00開頭的唯一不同,就是第一個(gè)雙字!之所以這16個(gè)字節(jié)引人注目,無非是因?yàn)檫@些數(shù)據(jù)的長(zhǎng)度都是0XE1030的緣故,這也解釋了為啥長(zhǎng)度表中那么多0XE1030
因?yàn)椴灰?#34;BZh91AY&SY",于是大膽猜想, 00 00 00 00開頭的數(shù)據(jù)塊不采用BZ壓縮……
最后,果不其然~針對(duì)每個(gè)數(shù)據(jù)塊進(jìn)行或不進(jìn)行BZ壓縮最后組成的數(shù)據(jù),正是該SPK所對(duì)應(yīng)的NPK文件!
這樣文件結(jié)構(gòu)差不多就摸清了~就差不同就是哈希值不知道咋算的了~
這個(gè)靠自己猜想~很容易推斷出,SPK頭部的哈希值是生成后文件的SHA256值,每個(gè)數(shù)據(jù)塊頭部的哈希值是每個(gè)數(shù)據(jù)塊真實(shí)數(shù)據(jù)的SHA256值~
于是就把數(shù)據(jù)段截取出來用SHA256計(jì)算器一算,果然匹配~got IT!
因此,SPK的文件結(jié)構(gòu)是這樣的~
從官網(wǎng)下載的文件都是SPK格式,SPK格式是對(duì)客戶端文件進(jìn)行一種部分壓縮,是基于BZ2壓縮算法生成的。
接到需求后,首先在CSDN上就發(fā)現(xiàn)了這篇文章: https://blog.csdn.net/u010275932/article/details/76082249
嘛,雖然說只是做參考,這篇文章上也列出了一些作者的一個(gè)示意圖:
當(dāng)然看的我確實(shí)有點(diǎn)一臉ZZ……首先很多地方都不知道,而且分隔符竟然是那么復(fù)雜的一個(gè)東西……雖然說最后靠著split分離出來,也能達(dá)到目的
但是一般來說文件不太可能出現(xiàn)這種花里胡哨的東西,于是就著手深入研究了一下。
首先文件頭問題到不大(唯一奇怪的是長(zhǎng)度表很多數(shù)據(jù)塊的長(zhǎng)度都是0xE1030)
然后文件頭后,發(fā)現(xiàn)了分隔符01 00 00 00,這種東西看起來不像是文件頭的,因此我猜想這個(gè)分隔符不是TAIL,而且01 00 00 00接下來的16字節(jié)很有意思:
首先,第三個(gè)雙字和第四個(gè)雙字分別是第一個(gè)雙字和第二個(gè)雙字按位取反的結(jié)果,第二個(gè)字節(jié)是CSDN這篇文章中提到以“BZh91AY&SY ”為開頭的數(shù)據(jù)開始的字節(jié)長(zhǎng)度,
因此試了下,發(fā)現(xiàn)BZ解壓函數(shù)返回0(說明這段數(shù)據(jù)滿足解壓要求是真實(shí)數(shù)據(jù)),因此猜想第二字節(jié)是真實(shí)數(shù)據(jù)長(zhǎng)度。
至于“BZh91AY&SY??”和這16個(gè)字節(jié)中間還有32個(gè)字節(jié)自然而然就聯(lián)想到哈希了,只是不知道怎么生成的……
于是猜想01 00 00 00并不是TAIL,而是HEAD……
然后順著長(zhǎng)度查找下去,查到了該真實(shí)數(shù)據(jù)的尾部,這里當(dāng)然是第二個(gè)數(shù)據(jù)塊出現(xiàn)了,結(jié)果出現(xiàn)了文章中提到的另一個(gè)分隔符,特長(zhǎng),16字節(jié):
00 00 00 00 00 10 0E 00 FF FF FF FF FF EF F1 FF
后面也沒有"BZh91AY&SY"的字樣了,再往后查也是這個(gè),只不過又多了32字節(jié);
但是文章中發(fā)現(xiàn)以這個(gè)分隔符為開頭總共數(shù)據(jù)文件也是48字節(jié),因此估計(jì)這個(gè)分隔符后面的32字節(jié)也是一段哈希,再往后就是真實(shí)數(shù)據(jù)了。
兩個(gè)數(shù)據(jù)塊都是48字節(jié)的頭帶一段真實(shí)數(shù)據(jù),就讓我不得不懷疑他們有沒有關(guān)系。
突然發(fā)現(xiàn),這個(gè)分隔符也是滿足 第三雙字是第一雙字取反,第四雙字是第二雙字取反 ,又發(fā)現(xiàn)第二雙字不就是等于文件頭內(nèi)長(zhǎng)度表不就是0XE1030嘛,就是第二字節(jié)加上0x30(十進(jìn)制的48)!
也就是說這16字節(jié)和10 00 00 00開頭的唯一不同,就是第一個(gè)雙字!之所以這16個(gè)字節(jié)引人注目,無非是因?yàn)檫@些數(shù)據(jù)的長(zhǎng)度都是0XE1030的緣故,這也解釋了為啥長(zhǎng)度表中那么多0XE1030
因?yàn)椴灰?#34;BZh91AY&SY",于是大膽猜想, 00 00 00 00開頭的數(shù)據(jù)塊不采用BZ壓縮……
最后,果不其然~針對(duì)每個(gè)數(shù)據(jù)塊進(jìn)行或不進(jìn)行BZ壓縮最后組成的數(shù)據(jù),正是該SPK所對(duì)應(yīng)的NPK文件!
這樣文件結(jié)構(gòu)差不多就摸清了~就差不同就是哈希值不知道咋算的了~
這個(gè)靠自己猜想~很容易推斷出,SPK頭部的哈希值是生成后文件的SHA256值,每個(gè)數(shù)據(jù)塊頭部的哈希值是每個(gè)數(shù)據(jù)塊真實(shí)數(shù)據(jù)的SHA256值~
于是就把數(shù)據(jù)段截取出來用SHA256計(jì)算器一算,果然匹配~got IT!
因此,SPK的文件結(jié)構(gòu)是這樣的~
附一下尚未整理到庫(kù)里的源碼~(C++ WIN32控制臺(tái))
總結(jié)
以上是生活随笔為你收集整理的关于DNF的多媒体包NPK文件的那些事儿(10) - SPK文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数组替换_Python:替换
- 下一篇: 落地SOA成为中国电信战略转型第一步