植物大战僵尸资源文件提取 总结
PvZ资源文件提取 总结
参考
- 植物大战僵尸资源文件(main.pak):格式/提取/工具下载[转贴]
- 植物大战僵尸pak资源文件分析
- 植物大战僵尸资源提取
- C/C++中判断某一文件或目录是否存在
- PNG文件格式详解
- C语言创建文件夹
- Big Endian 和 Little Endian 详解
资源文件格式
资源文件名字为main.pak
,与主程序PlantsVsZombies.exe
位于同一目录下,遵循以下加密方式:资源文件分为两个部分,前一部分记录了每一个资源(包括图片、音乐)的名称长度、文件名称(包括所储存的目录)、大小以及其他的标识符,在这里称其为每个文件的信息块,后一部分是文件的数据内容,前一部分的文件顺序与后一部分的数据顺序相同,在这里称其为数据块。如果前一部分的文件的信息块的排布方式是:
A.lengthOfName A.name A.size
B.lengthOfName B.name B.size
C.lengthOfName C.name C.size
...
[仅仅作为示例,不代表真实的信息块数据]
那么后一部分的数据区的文件的数据块的排布顺序与之相同:
A.data
B.data
C.data
...
虽然数据区的文件的数据块都是紧密相连没有空隙的,但是通过前一部分的信息,可以精确地把每一个文件提取出来,并且保持原有的相对目录结构:
/compiled/particles/Award.xml.compiled
/compiled/particles/AwardPickupArrow.xml.compiled
[省略若干文件]
/compiled/particles/Zombie_seaweed.xml.compiled
/compiled/reanim/Blover.reanim.compiled
/compiled/reanim/Cabbagepult.reanim.compiled
[省略若干文件]
/compiled/reanim/Zombie_zamboni.reanim.compiled
/data/BrianneTod12.txt
/data/BrianneTod16.txt
[省略若干文件]
/data/_Pix118Bold.gif
/images/Almanac.png
/images/Almanac_CloseButton.png
[省略若干文件]
/images/Zombie_digger_dirt.png
/particles/AwardGlow.png
/particles/AwardPickupGlow.png
[省略若干文件]
/particles/Zomboss_particles.png
/properties/LawnStrings.txt
/properties/resources.xml
/reanim/AC_RunActiveContent.js
/reanim/anim_sprout.png
[省略若干文件]
/reanim/Zombie_zamboni_wires.png
/sounds
/sounds/awooga.ogg
/sounds/ballooninflate.ogg
[省略若干文件]
/sounds/zombie_falling_2.ogg
/tmp.txt
幻数 Magic number
在资源文件的最开始的9个字节是幻数,用于标记文件,不包含实际的文件数据。
信息块
文件的信息块在资源文件的前一个部分依次排开,每一个信息块包含如下信息:
顺序 | 字长 | 含义 |
---|---|---|
1 | 1 byte | 文件名的长度,注意,文件名不包含**\0** |
2 | x byte | 文件名,长度已给出 |
3 | 4 byte | 对应数据块的长度 |
4 | 8 byte | 无含义 |
5 | 1 byte |
结束字符,如果是0x00 则表示一个信息块的结束,如果是0x80 则表示前一部分结束
|
数据块
由于每一个信息块记录了文件的名称等信息,所以可以根据这些信息将资源文件重新构建出来,例如,第一个文件的信息块内容如下:
25
636f 6d70 696c 6564 5c70 6172 7469 636c 6573 5c41 7761 7264 2e78 6d6c 2e63 6f6d 7069 6c65 64
0504 0000
8543 cfcc 0efc cb01
00
这里已经将信息块的内容按照上表进行了分割,第一行对应文件名的长度,即37(十六进制下25对应的十进制数为37),得出第一个文件名长为37,将后续的37 bytes长度的数据读取出来得到文件名为
compiled\particles\Award.xml.compiled
注意这里包含了目录信息,说明这个文件处在目录下compiled\particles\
,文件名字为Award.xml.compiled
。
后续的8 bytes指明了文件的长度,要注意的的是这里的存储机制是低位编址(little endian),即处在某个数低位的数据储存在地址较小的内存地址中,对应到上述的例子0504 0000,其对应的真正的十六进制数应该是0000 0405,转换为十进制则是1029.
那么后一部分(数据区)的前1029个字节就属于第一个文件,这个文件的名字是Award.xml.compiled
,且位于当前目录下的compiled\particles\
中
对于后续的文件同理。
xor
但是如果我们直接这样处理这个文件,会发现并不能提取出想要的资源文件,那是因为在上述格式的基础上main.pak
还进行了异或加密,即对原有每一个字节与数字0xF7
进行异或运算,而解密只要再将每一位与0xF7
进行一次异或运算即可。
源代码
xor.c 进行异或解密
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>typedef unsigned char byte;int main(void)
{FILE *r = fopen("main.pak", "rb");FILE *w = fopen("main.de.pak", "wb");if (r == NULL || w == NULL){fprintf(stderr, "Fail to open the file...");exit(0);}else{byte tmp = 0;while (feof(r) == 0){fread(&tmp, 1, 1, r);tmp = tmp ^ 0xf7;fwrite(&tmp, 1, 1, w);}fclose(w), fclose(w);fprintf(stdout, "Completed...");}return 0;
}
dec.c 按照既定格式提取文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <direct.h>typedef struct struct_file
{char *name;int length;struct struct_file* next;
} file;
typedef unsigned char byte;void structwrite(file *, FILE *); // write the data specified by the struct into the file
void preppath(char * const); // to check if the directory exists, if not, it creates oneint main(void)
{FILE *fp = fopen("main.de.pak", "rb");if (fp == NULL)fprintf(stderr, "Fail to open main.de.pak...");else{puts("Scanning...");file head = {0, 0, NULL}, *tmp = &head;int flag = 0, len = 0; // length of filenamefseek(fp, 9, SEEK_CUR);while (1){file* file_tmp = malloc(sizeof(file));fread(&len, 1, 1, fp); // get length of filenamefile_tmp->name = malloc(len + 1); // create a space for storing filenamememset(file_tmp->name, 0, len + 1); // set all the bytes in name space 0fread(file_tmp->name, 1, len, fp); // read in the namefile_tmp->length = 0;fread(&(file_tmp->length), 1, 4, fp); // length of filefile_tmp->next = NULL;tmp->next = file_tmp;tmp = file_tmp; // maintain the chain tablefseek(fp, 8, SEEK_CUR); // 0x80 for the end of the head structfread(&flag, 1, 1, fp);if (flag == 0x80)break;flag = 0, len = 0;}puts("Writing...");tmp = head.next;while (tmp != NULL){structwrite(tmp, fp);tmp = tmp->next;}fclose(fp);}return 0;
}void structwrite(file * filefp, FILE *datafp)
{preppath(filefp->name);FILE *tfp = fopen(filefp->name, "wb"); // open the file for writingbyte *buffer = malloc(filefp->length); // create the space for the content of the filefread(buffer, 1, filefp->length, datafp); // read the content from the origin pointerfwrite(buffer, 1, filefp->length, tfp); // write the content to the target filefclose(tfp);
}void preppath(char * path)
{char *end = path;while (*end != '\0') end++;while (*end != '\\') end--;char *tmp = path;while (tmp != end){if (*tmp == '\\'){*tmp = '\0';if (-1 == _access(path, 0))_mkdir(path);*tmp = '\\';}tmp++;}*end = '\0';_mkdir(path);*end = '\\';
}
植物大战僵尸资源文件提取 总结相关推荐
- 植物大战僵尸资源提取
植物大战僵尸是09年非常风靡的一款游戏.虽然是2D画面,但是其游戏性.画面的轻松可爱.恰到好处的音效使人爱不释手. 最近想做一款类似的游戏,想先暂用其图像资源与音乐资源来,而专注于游戏程序编写本身.发 ...
- Cocos2d游戏开发学习记录——4.开发《植物大战僵尸》
文章目录 1.植物大战僵尸 2.开发前导 3.载入页面 4.菜单页面 & 预备战斗页面 5.植物准备页面 6.正式战斗页面 7.战斗逻辑 8.向日葵逻辑 9.进度条逻辑 10.音乐逻辑 11. ...
- 植物大战僵尸超全资源合集
植物大战僵尸资源,包含很多改版以及修改器 自己在网上花50大洋买的现在分享给大家 包含100多款植物大战僵尸版本,包含抖音热门版本和多款植僵修改器以及通关存档. 95版,β版,无名版,都有的,主播玩的 ...
- **C1-1任务解析**——植物大战僵尸-修改游戏进度和金币(用户存档文件)
C1-1任务解析 植物大战僵尸-修改游戏进度和金币(用户存档文件) 一.软件安装准备 1.植物大战僵尸安装包 https://pan.baidu.com/s/1jEhpBlotLbUeCKTWJfOh ...
- C语言实现植物大战僵尸----学习过程
大一下学期c语言课程设计要我们用c语言制作一款游戏,之前网上冲浪时候发现了c语言实现植物大战僵尸的教程,就想来跟着教程做一遍,并记录下自己的学习过程与经验. 前排分享我所学习的视频和文章: [可能是B ...
- 植物大战僵尸 1.0 简体中文版
植物大战僵尸是由PopCap Games开发的一款益智策略类单机游戏,玩家通过武装多种植物切换不同的功能,快速有效地把僵尸阻挡在入侵的道路上.不同的敌人,不同的玩法构成五种不同的游戏模式,加之黑夜.浓 ...
- 植物大战僵尸 “Hex editor” 修改关卡进度和金币数量攻略
一. 任务/目的: 通过修改十六进制控制关卡的地址上的数据,进行修改植物大战僵尸游戏的关卡--(例如. 关卡:8-8) 通过修改十六进制控制金币的地址上的数据,进行修改植物大战僵尸游戏的金币数量--( ...
- 用文件保存游戏服务器数据恢复,玩植物大战僵尸等单机游戏时,存档丢失了怎么数据恢复?...
相信很多人在玩例如植物大战僵尸.使命召唤等游戏时,都遇到到因为游戏奔溃,导致之前的存档丢失的情况.那么这种情况下,这些存档能够找回吗?首先我们要知道,存档在电脑上找不到,并不意味着这些存档的数据消失了 ...
- Win11的几个实用技巧系列之不能玩植物大战僵尸、如何彻底删除360所有文件
目录 Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解决方法 Win11玩不了植物大战僵尸的解决方法 win11如何彻底删除360所有文件?win11彻底删除360所有文件方法分享 ...
最新文章
- linux运维如何月薪过万?(收藏自用)
- 树的子结构 (剑指offer)
- python装饰器改变命运
- 让IE7/8使用CSS中first-child和last-child样式属性
- 【转载】 regsvr32 注册dll
- 网络经济与企业管理(第 1 章:企业管理概论)
- C语言试题八十四之求空间两点之间的距离
- Git如何进行版本回退
- CV Papers|计算机视觉论文推荐周报20200501期
- PHP文件系统-文件路径操作和权限
- JSF配置文件faces-config.xml参数详解
- myeclipse激活+Aptana安装配置
- 视频教程-常见小票打印机打印故障及解决方法汇总视频教程-Windows
- 数据分析 | 全距和四分位距分别是什么
- R语言假设检验完整入门教程
- 甘特图、IPO图、DFD图
- git rebase origin/develop
- _WIN32_WINNT not defined
- 汇编语言中xor指令_XOR寄存器,寄存器(汇编程序)
- 诚迈科技发布OpenHarmony发行版鸿诚志远HongZOS
热门文章
- 各类工控软件图库(组态王,威纶通,西门子,昆仑通泰等通用
- [渝粤教育] 中国地质大学 大学物理(上) 复习题
- 关于使用google map实现周边搜索的功能
- “逻辑和”与 “逻辑或”运算符
- 【vivado IP核学习】DDS complier v6.0使用“SIN/COS LUT only”
- jQuery 实现弹幕效果案例
- 微信小程序连接华为云ModelArts的方法以及一些小坑(一)
- Win10家庭中文版开机后弹窗无法登录到你的账户点注销没用(解决过程记录)
- Python爬虫——爬取股票信息生成csv文件
- 第二章 Binary Search