嘛,一般你會看到這樣的資訊:
程式破解員:
分析遊戲的加密方式,能寫基本的檔案解包工具和打包工具,能對加了密的遊戲文本進行抽取,還原並進行編輯。懂得彙編和反組譯碼以及一門熟悉的程式設計語言,懂得一些常見的壓縮演算法(如:LZ777,ZLIB等)
日本的遊戲不管是PC還是掌機都會因為著作權的問題將除去遊戲架構以外的資源檔單獨歸檔加密儲存
我們討論 最常見的 最簡單日本遊戲常用的壓縮和密碼編譯演算法
這裡不是密碼學/壓縮課程,如果需要瞭解更多 去買本書吧
簡單加密
虛擬碼:(我懶得寫讀寫檔案部分,自己寫去)
while (!fileEnd) { // 遍曆檔案
byte dataByte = readByte(); // 讀入一個位元組
加密方法(加密內容,加密key);
writeByte(dataByte); // 寫到新檔案裡
}
加密方法
方法1:直接進行一些簡單運算:
dataByte=-dataByte;
dataByte=+1;
方法2:XOR
至今我見過的一些加密技術都是基於XOR操作符的
比如明天天晴,染紅
A XOR B=C,則有C XOR B=A,或C XOR A=B
當然這隻是最簡單的加密,但是這個方法雖然簡單,但是仍然有人使用,畢竟遊戲速度還是很必要的
除了XOR 某個字元,XOR檔案內的位移地址也很常用,比如遊魂
寫出來很簡單:
dataByte ^= 0xaa;//染紅加密方式XOR 16進位的AA,明天天晴是FF
一些變種的XOR方法
// rsftrx
static void decode_rem_shiftr_xor(BYTE *buf, unsigned int len, DWORD key)
{
BYTE xor = (BYTE)key;
for (unsigned int i = 0; i < len; i++)
buf[i] ^= key >> (i % 5);
}
// xror
static void decode_xor_ror(BYTE *buf, unsigned int len, DWORD key)
{
BYTE shift, xor;
shift = (BYTE)key;
xor = (BYTE)((key >> 8) & 0xff);
if (!shift)
shift = 15;
if (!xor)
xor = 0xf0;
shift &= 7;
for (unsigned int i = 0; i < len; i++) {
buf[i] ^= xor;
buf[i] = (buf[i] >> shift) | (buf[i] << (8 - shift));
}
}
// nxorn
static void decode_not_xor_not(BYTE *buf, unsigned int len, DWORD key)
{
BYTE xor = (BYTE)key;
for (unsigned int i = 0; i < len; i++)
buf[i] = ~(buf[i] ^ ~xor);
}
// ixorn
static void decode_inc_xor_not(BYTE *buf, unsigned int len, DWORD key)
{
BYTE xor = (BYTE)key;
for (unsigned int i = 0; i < len; i++)
buf[i] = ~(buf[i] ^ (xor + 1));
}
// xorinc
static void decode_xor_inc(BYTE *buf, unsigned int len, DWORD key)
{
BYTE xor = (BYTE)key;
for (unsigned int i = 0; i < len; i++)
buf[i] = (buf[i] ^ 0xaf) + 1;
}
// sftrx
static void decode_shiftr_xor(BYTE *buf, unsigned int len, DWORD key)
{
for (unsigned int i = 0; i < len; i++)
buf[i] = buf[i] ^ (BYTE)(key >> 3);
}
Crypto Checker
一個簡單的命令列工具,用於剖析器用了什麼密碼編譯演算法.
下面介紹的加密網路上有現成的代碼
.net java有現成類庫 如果不清楚怎麼用去查baidu
MD5加密
EGO 山本大媽後期遊戲指令碼使用MD5 加密
簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函數。遊戲中也經常使用key函數來快速定位需要讀取的資料在資源檔中的位置。
http://baike.baidu.com/view/604021.htm
BlowFish加密
BlowFish是對稱式加密演算法的其中一種,與前面介紹的單向散列函數不同,BlowFish加密後的資料是可逆的。由於BlowFish加密/解密速度快,更重要的是任何人都可以免費使用不需要繳納著作權費,所以有不少遊戲都採用BlowFish加密資源檔資料。
比如: ef - the first tale.
介紹: http://baike.baidu.com/view/2208941.htm
CRC
嚴格說CRC 不是加密,是一種校正手段,反正就是防止你修改他的東西
很多遊戲的Patch 比如C3 1.10Patch的就是有CRC
介紹:http://baike.baidu.com/view/80377.htm
壓縮部分
多數商業遊戲並不會將圖片資源以可以直接開啟的常用格式存放,而是會做一定的壓縮處理,這樣做有兩個好處:其一,圖片不易被使用者直接修改或用於其他用途;其二,減小遊戲圖片資源所佔用的磁碟空間。
現在的壓縮演算法很多,選擇那一種好呢?大家一定會想到在網頁上常用到的JPEG格式和GIF格式,但是這兩種演算法都不適合在遊戲中使用。就遊戲開發來說,我們必須選擇一種壓縮率高、解碼速度又快的演算法。如果採用JPEG無損壓縮演算法,那麼壓縮率就不高,採用有損壓縮的話雖然壓縮率很高但在遊戲中映像是不能有所損壞的。還有,JPEG演算法的一個最大缺點就是解碼速度太慢。GIF演算法效能很高,壓縮率高解碼又快,只可惜它不能壓縮超過256色的映像。但如果您做的遊戲是 256色的話,那麼使用GIF演算法是再好不過的了。
一般 遊戲採用PNG和BMP
其中PNG使用類似Zlib壓縮演算法
Lz77,Huffman,Lzw,rle都是經典的壓縮演算法~
網路上有現成的代碼
我遇到有
Huffman 壓縮演算法
遊魂就採用這個
Huffman+LZW演算法
一般來說日本遊戲最常見的兩種莫過於LZSS和Zlib
LZSS
http://zh.wikipedia.org/zh-cn/LZ77%E4%B8%8ELZ78
http://en.wikipedia.org/wiki/LZSS
採用LZSS實現的範例:
微軟以前常使用的compress.exe/expand.exe
Gba的bios裡用的壓縮演算法就是Lz77的變種演算法LzSS
這裡 直接給大家一個庫 方便大家使用
也就是NDS GBA內建演算法 http://download.csdn.net/source/1425147
需要注意的是LZSS LZ77都有很多變種演算法,要具體分析 比如LZSS+Huffman
Zlib
http://baike.baidu.com/view/2258413.htm
獲得zlib
zlib的首頁是:http://www.zlib.net/
使用Zlib壓縮的遊戲:妹汁
對於Java
zlib is already included as part of the Java SDK in the java.util.zip package
C# 可以用這個:
http://blog.csdn.net/luozhuang/archive/2008/11/30/3415669.aspx
zip壓縮
這個應該不太常見,但不是沒有人用 戰地風雲2就是用ZIP(11區遊戲扯到那個國家去了)
C# 沒有內建壓縮解壓縮ZIP的類庫
方法有幾個:
1 使用國外開源加壓解壓庫ICSharpCode.SharpZipLib實現加壓,該庫的官方網站為
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
2 使用winrar
winrar有個命令列工具,國內某個著名公司軟體就用這種方法,不過壓縮的是RAR格式
3
http://dotnetzip.codeplex.com/