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