虽然大概没什么人来看这个blog,但还是要稍微更新一下的。
前段时间被人摆脱去搞gift程序的破解,结果因为自己深陷数坑,搞了这么久才提出对白。Gift的脚本文件封装在一个pak文件里面再用zlib压缩,于是textdata.z就是脚本文件。自己用zlib写个程序解压后得到的pak文件就可以解包了。
值得一提的是虽然解压得出PAK文件里面第一个文件头结构就有指出脚本文件的个数,但实际上在后面还是有很多的空字节,因此用一些提取工具来提取会提取出错误的脚本,以下是自己写的提取脚本程序,代码很挫,没错误处理。
#include "windows.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
struct filehead{
char name[0x30];
DWORD offset1;
DWORD offset2;
DWORD size;
DWORD unknown;
};
int chr='\\';
char path[256];
int main(int argc, char* argv[])
{
fstream is("textdata.z.pak",ios::in|ios::binary);
char *buff=new char [0x1f400];
is.read(buff,0x1f400);
filehead *p=(filehead*)buff;
int i=1;
while(p[i].size!=0)
{
char *pos1,*pos2;
char *temp=new char [p[i].size];
is.read(temp,p[i].size);
if((pos1=strchr(p[i].name,chr))!=NULL)
{
GetCurrentDirectory(256,path);
char *fuck=new char [pos1-p[i].name+2];
ZeroMemory(fuck,pos1-p[i].name+2);
memcpy(fuck,p[i].name,pos1-p[i].name+1);
lstrcat(path,"\\");
lstrcat(path,fuck);
CreateDirectory(path,NULL);
delete []fuck;
if((pos2=strchr(pos1+1,chr))!=NULL)
{
fuck=new char [pos2-pos1+1];
ZeroMemory(fuck,pos2-pos1+1);
memcpy(fuck,pos1+1,pos2-pos1);
lstrcat(path,fuck);
CreateDirectory(path,NULL);
delete []fuck;
}
}
fstream write(p[i].name,ios::out|ios::binary);
write.write(temp,p[i].size);
write.close();
delete []temp;
i++;
}
delete []buff;
is.close();
return 0;
}
提取出来的脚本有两种,一种是scn脚本,一种是tbl脚本,scn内含控制符以及对白,tbl则是对应scn脚本的索引。然后就可以写程序提取对白出来进行翻译了。