X‘moe Project » 日志
[风雨来记3]封包破解
2015-3-14 12:01 /
前面的废话就懒得扯了 直接主题
游戏引擎见过各种各样的 但是就是没见过这么奇葩的。
(你这tm几个意思 WIN32和你有仇么)
这个游戏应该是主机移植的,也不至于这样啊==
打开游戏封包以后。发现文件封包没有Header 或者看不出Header
嗯,追一追,发现读取是这样的。
GrpFile就是Grp_01 到 Grp_09的Header(下面称为Map文件)
加密也是弱爆了,都是简单的NOT
于是得出Header的结构:
其中文件名的长度是变化的,由FileNameLength来指定
FilePart就是封包序号。(比如 Grp_01 Grp_02
全部的DWORD都需要反转:
Map文件和封包文件都需要解密,而且是整个文件:
结构到此位置 提取什么的 自己去动手,很简单的
游戏引擎见过各种各样的 但是就是没见过这么奇葩的。
(你这tm几个意思 WIN32和你有仇么)
这个游戏应该是主机移植的,也不至于这样啊==
打开游戏封包以后。发现文件封包没有Header 或者看不出Header
嗯,追一追,发现读取是这样的。
GrpFile就是Grp_01 到 Grp_09的Header(下面称为Map文件)
加密也是弱爆了,都是简单的NOT
于是得出Header的结构:
struct FileMap
{
DWORD FileNameLength;
char FileName[MAX_PATH];//big enough
DWORD FilePart; //eg : Grp_01
DWORD Unknown; //0
DWORD Offset;
//DWORD SeekCur; //注意这个DWORD 在某些封包中(如脚本是没有这个记录的
DWORD Length;
}
其中文件名的长度是变化的,由FileNameLength来指定
FilePart就是封包序号。(比如 Grp_01 Grp_02
全部的DWORD都需要反转:
DWORD flip(DWORD x)
{
return (x >> 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x << 24);
}
Map文件和封包文件都需要解密,而且是整个文件:
void Decode(unsigned char* pBuffer, DWORD len)
{
for (int i = 0; i < len; i++)
{
pBuffer[i] = ~pBuffer[i];
}
}
结构到此位置 提取什么的 自己去动手,很简单的