日本游戏常用加密压缩算法

来源:互联网 发布:淘宝怎么修改中差评 编辑:程序博客网 时间:2024/06/07 11:28

嘛,一般你会看到这样的信息:
程序破解员:
分析游戏的加密方式,能写基本的文件解包工具和打包工具,能对加了密的游戏文本进行抽取,还原并进行编辑。懂得汇编和反汇编以及一门熟悉的编程语言,懂得一些常见的压缩算法(如: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/