仙5卖得真的很火爆啊,我到现在还没拿到货。
于是迫不及待地下载了数字版,安装。
看完了CG过场动画,感慨着女一号竟然在游戏还没有结束就香消玉殒了啊。悲催的小凡子。
然后实在对着这个4GB的家伙没事做了,那就拆解了它吧。
破解就不玩了,一是不怎么合法吧,二是脱壳技术菜,我不知道要脱到猴年马月啊……
听仙5的音乐吧……听音乐它还非要弄个PKG文件。
用WinHex打开呗,标识为PK3.0,这不是zip的吗?直接改ZIP解压错误。
悲剧了,看了下文件大小,转16进制,和第二行的数据好接近啊,那第二行前四字节就是有效数据的大小了吧,接着的四个字节不知道是什么东东……
然后就是一堆一堆数据了。起初打开music.pkg时没有注意细节,以为pkg文件用了压缩算法。
但打开sound.pkg文件,看到了RIFF字符,这不是wav文件的块名吗?于是便在music.pkg里找mp3。
FF FB 90 04就是mp3块的分割长整字节啊。但是这四个字节咋就那么多呢,不能作为一个文件的标识啊。
截出两个文件比较了一下,每个mp3文件FF FB 90 04开头后都会有32个00。
那还说什么,写个程序把所有家伙都搬出来啊。
#include <conio.h>
#include <stdio.h>
#include <alloc.h>
int readdata() {
FILE* f;
FILE* out;
unsigned long p = 0;
int x1,x2;
unsigned long px = 0;
int count = 0, fcount = 0;
char r = 0;
out = fopen("h:\\pal5.txt","wb+");
f = fopen("h:\\game\\pal5\\music.zip","rb");
printf("open pal5.txt to output...\n");
printf("open music.zip to read data...\n");
while(!feof(f)) {
r = fgetc(f);
px++;
if(r==0) {
if(count==0) p=px;
count++;
} else {
if(count==32) {
p=p-5;
fwrite(&p,4,1,out);
fcount++;
}
count = 0;
}
}
fclose(f);
fclose(out);
printf("finish initializing...\n");
return fcount;
}
void outputdata(int n) {
FILE *f,*out,*mc;
char data[1024];
unsigned long p1=0,p2=0;
int i;
char buf[1024] = {0};
mc=fopen("h:\\game\\pal5\\music.zip","rb");
f=fopen("h:\\pal5.txt","rb");
printf("[start output music]\n");
for(i=0;i<n-1;i++) {
printf("%2d ",i);
if((i+1)%10) printf("\n");
sprintf(buf,"h:\\pal5\\%d.mp3",i);
out=fopen(buf,"wb+");
fseek(f,4*i,0);
fread(&p1,4,1,f);
fseek(f,4*i+4,0);
fread(&p2,4,1,f);
fseek(mc,p1,0);
p1=p2-p1;
while(p1>0) {
if(p1>1024) {
fread(data,1024,1,mc);
fwrite(data,1024,1,out);
p1-=1024;
} else {
fread(data,p1,1,mc);
fwrite(data,p1,1,out);
p1=0;
}
}
fclose(out);
}
printf("\n");
fclose(f);
fclose(mc);
}
void main() {
clrscr();
outputdata(readdata());
}
上面程序没有截取最后一个mp3,自己查下pal5.txt的输出,然后从偏移开始到最后把它取出来就ok了。
然后62首mp3就在文件夹里了,开听……
有兴趣还可以搜搜model,毕竟仙5用的ReaderWare嘛……
以上仅供学习使用哦……-_-/// 得支持下正版~~~
J.Y.Liu
2011.07.09