spk文件打包解包

合集下载

解包和打包exe文件的方法

解包和打包exe文件的方法

解包和打包exe文件的方法1.引言1.1 概述概述:在软件开发过程中,我们经常会遇到需要解包和打包exe文件的情况。

解包exe文件是指将经过编译的可执行文件进行还原,以获取其中的源代码、资源文件等内容。

而打包exe文件则是将源代码和相关资源文件重新打包成可执行文件。

这两个操作在软件开发、软件逆向工程和软件调试等领域中都有广泛的应用。

解包exe文件的方法可以分为使用解包工具和手动解包两种方式。

使用解包工具是指使用专门的软件工具来进行解包操作,它能够自动分析可执行文件的结构并提取其中的内容。

手动解包则是通过一些常见的手段,如二进制文件编辑器或调试器,以手动的方式逆向还原可执行文件中的内容。

打包exe文件的方法也可以分为使用打包工具和手动打包两种方式。

使用打包工具可以方便地将源代码和相关资源文件打包成可执行文件,它提供了简单易用的图形界面和各种打包选项。

手动打包则需要开发人员手动进行文件的整理和编译操作,相对来说比较繁琐。

总结起来,解包和打包exe文件是软件开发中常见的操作,通过解包我们可以获取到可执行文件中的源代码和资源文件,有助于我们理解和调试软件;而打包exe文件则可以将我们的源代码和资源文件重新打包成可执行文件,方便我们发布和分发软件。

在进行解包和打包操作时,可以根据需要选择使用相应的工具或手动操作的方式,以达到我们的目的。

1.2 文章结构文章结构负责为读者介绍本文的组织和内容安排。

本文主要围绕解包和打包exe文件的方法展开讨论。

在本文中,我们将首先提供一个引言部分,概述本文的背景和目的。

接下来,将详细介绍解包exe文件的方法,包括使用解包工具和手动解包。

然后,我们将探讨打包exe文件的方法,包括使用打包工具和手动打包。

最后,我们将通过总结解包和打包exe文件的方法,提供一些结论和建议。

通过本文的阅读,读者将能够全面了解解包和打包exe文件的技术和方法,并且可以根据自己的需求选择适合的方式进行操作。

路由器固件的解包与打包

路由器固件的解包与打包

路由器固件的解包与打包一、概述当前大学生都被校园网的客户端困扰,然而南京工程学院公布了Linux客户度解决方案,或者Mentohust解决方案,可以在Ubuntu系统的计算机上运行了。

但进一步的工作就是如何令其在路由器上工作,以达到真正的路由功能。

假定笔者已经把电脑上完美运行的客户端进行了交叉编译,生成了要在路由上运行的拨号程序(假定为Client),且笔者的路由器有合适的固件(假定为firm.bin)。

那么要在路由器上运行Client有三种方法:1.可以把Client上传到路由器的/jffs目录下。

(本文不讨论这种情形)2.刷写dd后,由于剩余容量太小导致无法加载jffs,那么每次启动路由后,可以将程序Client 上传到刷写了firm.bin路由的/tmp目录下,然后令其运行。

简单的说,就是在内存里运行Client。

其缺点就是每次路由断电,你必须重新上传。

(本文不讨论这种情形)3.当路由器无法加载jffs时,可以考虑将Client程序增添至固件,并且在自启动命令里输入正确的命令方式,以达到每次路由插上电,都可以自动运行拨号程序的完美效果。

以下讨论的为如何将Client固化至固件的方法。

所需软件为firmware-mod-kit,大致步骤为:1.先用解包软件解包路由器固件将会得到固件核心文件。

2.再把Client复制到固件的某个文件夹内,且注意赋予可执行的权限。

3.用build-ng.sh进行最终的封包,生成新的固件。

操作环境:Ubuntu 11.04版参考资料:/p/mentohust-wrt//p/firmware-mod-kit/ Firmware Modification Kit并感谢第一个项目的作者给我的指导和帮助。

我只是把他没有写明白的步骤,以我自己的理解方式重述而已。

二、详细步骤1.首先下载firmware-mod-kit封包软件,并进行编译,将会得到所需文件。

1.1下载firmware-mod-kit封包软件并在终端窗口里输入以下命令:svn checkout /svn/ firmware-mod-kit-read-only耐心的等待之后,会在你的本地硬盘上生成一个目录firmware-mod-kit-read-only,其中包含branches,tags,trunk,wiki四个文件夹。

路由器固件的解包与打包2024

路由器固件的解包与打包2024

引言概述:路由器固件解包与打包是指将嵌入式设备(如路由器)上的固件进行解开和重新打包的过程。

这个过程对于嵌入式设备的软件开发和定制化非常重要。

本文将详细介绍用于解包和打包固件的工具和步骤。

正文内容:一、解包固件1.1提取固件文件:从路由器设备中提取固件文件,可以使用DD命令或者串口控制台提取。

1.2解压固件文件:使用解压工具,如binwalk,将固件文件进行解压,得到固件的各个组成部分。

1.3分析固件:通过分析解压后的固件文件,了解各个组成部分的结构和功能。

二、打包固件2.1修改固件:根据需求,对固件文件进行修改,如添加新的软件包、修改配置文件等。

2.2重新打包固件:将修改后的文件重新打包成固件格式,可以使用mkimage等工具进行打包。

三、固件的烧录与更新3.1硬件烧录:将打包好的固件通过串口或者JTAG接口烧录到设备的闪存中。

3.2固件更新:将新的固件通过WEB界面或者命令行进行更新,确保设备上的固件是最新版本。

四、错误处理与调试4.1解包错误处理:解包固件时可能会遇到一些错误,如文件损坏或者解压失败,需要进行错误处理。

4.2打包错误处理:打包固件时可能会遇到一些错误,如文件格式不兼容或者依赖关系错误,需要进行错误处理。

4.3调试固件:使用调试工具,如GDB,对固件进行调试,查找和修复潜在问题。

五、固件安全性5.1固件签名:为了确保固件的可靠性和完整性,可以对固件进行签名,防止被篡改或者恶意替换。

5.2固件加密:对固件进行加密,防止固件被逆向工程或者泄露敏感信息。

5.3固件验证:通过验证机制,如校验和或者哈希值等,确保固件在传输和存储过程中的完整性。

总结:路由器固件的解包与打包对于定制化和软件开发非常重要。

通过解包固件,可以深入了解嵌入式设备的软件和硬件组成部分。

通过打包固件,可以将所需的修改和定制化应用到设备上。

固件的烧录与更新、错误处理与调试以及固件的安全性也是不可忽视的。

通过掌握解包与打包固件的技术,可以更好地定制和管理嵌入式设备的固件。

使用tar命令打包和解包文件和

使用tar命令打包和解包文件和

使用tar命令打包和解包文件和tar命令是Linux及Unix系统中常用的文件打包和解包工具之一。

它可以将多个文件或目录打包成一个归档文件,并且可以通过解包还原出原始文件和目录结构。

本文将介绍tar命令的主要用法和一些常见的应用场景。

一、tar命令的基本用法1. 打包文件:要打包文件,可以使用tar命令的-c参数,结合-f参数指定归档文件名。

例如,要将当前目录下的所有文件打包成一个名为archive.tar的归档文件,可以执行以下命令:```shelltar -cf archive.tar *```2. 解包文件:要解包已经打包好的归档文件,可以使用tar命令的-x参数,结合-f 参数指定归档文件名。

例如,要解包名为archive.tar的归档文件,可以执行以下命令:```shelltar -xf archive.tar```3. 查看归档文件内容:要查看归档文件中包含的文件列表,可以使用tar命令的-t参数,结合-f参数指定归档文件名。

例如,要查看名为archive.tar的归档文件中包含的文件列表,可以执行以下命令:```shelltar -tf archive.tar```4. 同时打包和压缩文件:tar命令还支持和gzip、bzip2等压缩工具结合使用,以实现同时打包和压缩文件的功能。

例如,要将当前目录下的所有文件打包成一个名为archive.tar.gz的压缩包,可以执行以下命令:```shelltar -czf archive.tar.gz *```二、tar命令的高级用法1. 打包指定目录:如果只需要打包指定的目录或文件,可以在tar命令中指定路径。

例如,要打包指定目录/dir下的所有文件,可以执行以下命令:```shelltar -cf archive.tar /dir```2. 排除某些文件或目录:有时候我们希望在打包文件时排除某些文件或目录,可以使用tar 命令的--exclude参数。

C语言——文件的打包与解包

C语言——文件的打包与解包

C语⾔——⽂件的打包与解包要求:将多个⽂件打包到同⼀⽂件,然后进⾏解包,解包时如果⽂件名重复进⾏标号。

PS:这⾥只有打包功能,没有对⼤⼩进⾏压缩。

先考虑两个问题:(1)解包时如何将不同⽂件分开?我们可以在写⼊⽂件内容前,提前写⼊⼀个结构体,这个结构体存有⽂件的⼤⼩和⽂件名,这样在解包时,我们总是先读出⼀个结构体,得到下⼀个⽂件的⼤⼩和⽂件名,然后按照⼤⼩读出内容即可。

(2)如何判断⽂件名是否重复?因为是C语⾔,没有map映射,所以⼿搓了⼀个哈希函数进⾏标记(但模数不是很⼤,打包⽂件较多容易冲突)。

⼀些细节的完善请⾃⾏实现。

打包程序如下:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <time.h>5#define USER_NAME_LEN 1006#define EMAIL_LEN 1007#define TIME_BUF_LEN 1008#define FILE_NAME_LEN 3009#define BUF_LEN 2010#define DWORD unsigned long11 typedef struct FileStruct12 {13char fileName[FILE_NAME_LEN];14int fileSize;15 } FileStruct;16char name[FILE_NAME_LEN];17char buf[BUF_LEN];18int getFileSize(char *fileName)19 {20 FILE* fp;21if((fp=fopen(fileName,"rb"))==NULL)22 {23 printf("⽂件打开失败!\n");24return -1;25 }26 fseek(fp,0L,SEEK_END);27int s=ftell(fp);28 fclose(fp);29return s;30 }31int main(void)32 {33 FILE* dfile;34 printf("输⼊⽬标⽂件名(含路径):");35 scanf("%s",name);36if((dfile=fopen(name,"wb"))==NULL)37 {38 printf("⽂件打开失败!\n");39return0;40 }41int kase=0;42 FILE* sfile;43while(1)44 {45 printf("输⼊要打包的#%d⽂件(含路径):",++kase);46 scanf("%s",name);47if(strcmp(name,"exit")==0)break;48if((sfile=fopen(name,"rb"))==NULL)49 {50 printf("⽂件打开失败!\n");51return0;52 }53 FileStruct f;54 f.fileSize=getFileSize(name);55if(f.fileSize==-1)return0;56 strcpy(f.fileName,strrchr(name,'\\')+1);57if(fwrite(&f,sizeof(FileStruct),1,dfile)!=1)printf("file write error!\n");58int len=0;59while((len=fread(buf,1,BUF_LEN,sfile))>=BUF_LEN)60 {61 fwrite(buf,1,BUF_LEN,dfile);62 }63 fwrite(buf,1,len,dfile);64 }65 printf("打包结束!\n");66 fclose(dfile);67 fclose(sfile);68 getchar();69 getchar();70return0;71 }解包程序如下:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <time.h>5#define USER_NAME_LEN 1006#define EMAIL_LEN 1007#define TIME_BUF_LEN 1008#define FILE_NAME_LEN 3009#define BUF_LEN 2010#define DWORD unsigned long11#define ull unsigned long long12 typedef struct FileStruct13 {14char fileName[FILE_NAME_LEN];15int fileSize;16 } FileStruct;17 FileStruct f;18char name[FILE_NAME_LEN];19char buf[BUF_LEN],ans[BUF_LEN];20char dic[FILE_NAME_LEN];21int cnt[19260817];22 ull base=131,mod=19260817;23 ull hashs(char* s)24 {25int len=strlen(s);26 ull ans=0;27for(int i=0;i<len;++i)ans=(ans*base+(ull)s[i])%mod;28return ans;29 }30char* div(char* dname)31 {32 memset(ans,'\0',sizeof(ans));33char* leave;34 leave=strrchr(dname,'.');35int i=0;36while(dname+i!=leave)37 {38 ans[i]=dname[i];39 ++i;40 }41return ans;42 }43int main(void)44 {45 printf("输⼊⽬标⽂件夹:");46 scanf("%s",dic);47 printf("输⼊要解包的⽂件:");48 scanf("%s",name);49 FILE* sfile;50 FILE* dfile;51if((sfile=fopen(name,"rb"))==NULL)52 {53 printf("⽂件打开失败!\n");54 getchar();55 getchar();56return0;57 }58while(fread(&f,sizeof(FileStruct),1,sfile)==1)59 {60char temp[BUF_LEN],part[BUF_LEN]="(0)";61 strcpy(temp,dic);62 strcat(temp,"\\");63 strcat(temp,div(f.fileName));64 ull res=hashs(f.fileName);65if(cnt[res]++)66 {67 part[1]+=cnt[res];68 strcat(temp,part);69 }70 strcat(temp,strrchr(f.fileName,'.'));71if((dfile=fopen(temp,"wb"))==NULL)72 {73 printf("⽂件解包失败!\n");74 getchar();75 getchar();76return0;77 }78int left=f.fileSize;79while(left)80 {81int Size=left>BUF_LEN?BUF_LEN:left;82 fread(buf,Size,1,sfile);83 fwrite(buf,Size,1,dfile);84 left-=Size;85 }86 }87 printf("解包结束!\n");88 fclose(sfile);89 fclose(dfile);90 getchar();91 getchar();92return0;93 }。

hpk文件解压方法

hpk文件解压方法

hpk文件解压方法概述hpk文件是一种常见的压缩文件格式,通常用于打包和分发软件、游戏等应用程序。

本文将介绍hpk文件的解压方法,帮助读者了解如何提取和使用hpk文件中的内容。

解压工具在进行hpk文件解压之前,我们需要准备一个可靠的解压工具。

以下是几个常用且功能强大的解压工具推荐:1.7-Zip:一个免费且开源的解压缩软件,支持多种格式,包括hpk文件。

它提供了直观易用的界面和高度可定制化的选项。

2.WinRAR:一款功能强大而且广泛使用的解压缩软件,同样支持hpk文件。

它具有快速解压速度和稳定性,并提供了丰富的功能和选项。

根据个人需求和偏好选择适合自己的解压工具,并确保已经正确安装和配置。

解压步骤下面是一般情况下使用7-Zip或WinRAR进行hpk文件解压的步骤:1.打开7-Zip或WinRAR软件。

2.在界面中找到并选择要解压的hpk文件。

可以通过点击“浏览”按钮或直接拖放文件到软件窗口来选择文件。

3.点击软件界面上的解压缩按钮或右键点击hpk文件,在弹出的菜单中选择“解压缩到指定文件夹”选项。

4.在解压设置中,可以选择解压缩后的目标文件夹和其他选项。

确保选择一个合适的目标路径,并根据需要进行其他设置。

5.点击“确定”按钮开始解压过程。

软件将会自动将hpk文件中的内容提取到指定的目标文件夹中。

6.解压完成后,可以在目标文件夹中查看和使用解压出来的文件。

注意事项在使用hpk文件解压时,需要注意以下几点:1.确保已经正确安装并配置了相应的解压工具。

如果没有安装相关软件,可以从官方网站下载并按照提示进行安装。

2.选择一个合适的解压路径。

避免将大量文件解压到系统盘或其他重要位置,以免占用过多磁盘空间或覆盖重要数据。

3.如果hpk文件被密码保护,需要提供正确的密码才能成功解压。

确保已经获得了正确的密码,并在解压时输入密码以完成操作。

4.在某些情况下,hpk文件可能由多个部分(例如分卷压缩)组成。

在解压之前,需要确保所有部分都位于同一目录下,并选择其中的一个文件进行解压。

APK应用程序的解包、修改、编辑、汉化、打包及应用

APK应⽤程序的解包、修改、编辑、汉化、打包及应⽤第⼆部分:三星闭源系统apk⽂件的处理,汉化和签名在这⼀部分,我们要进⼊实战。

⾸先,利⽤⼀个具体的例⼦来阐述apk⼯具包的使⽤,对apk⽂件进⾏解包、汉化、打包和签名。

然后,我们来对付三星闭源系统的apk程序,达到我们修改、汉化和美化的⽬的。

我们假定所有apk⽂件都是单个独⽴⽂件,不含odex⽂件(在官版ROM中,通常每个apk都分成两部分,第⼀部分是apk,第⼆部分是odex。

将它们合并是另⼀个题⽬,这⾥不作叙述)。

1. 配置框架(Framework)环境在处理APK⽂件时,apktool需要框架⽂件(framework-res.apk)来解码和打包。

apktool已经包含了标准的框架,所以在⼤多数APK⽂件的解包时,不需要另外提供框架⽂件。

但是,某些制造商(例如三星)使⽤了他们⾃⼰的框架⽂件,为了解包,就不得不从⼿机中或从ROM中把框架⽂件(framework-res.apk)提取出来,然后安装到计算机。

安装命令是:apktool if framework-res.apk安装后就会得到:~\apktool\framework\1.apk注意:三星系统(例如:I897)有两个框架⽂件:framework-res.apk和twframework-res.apk。

在使⽤apktool之前,要安装这两个框架⽂件。

安装⽅法同上:apktool if framework-res.apkapktool if twframework-res.apk安装后就会得到:~\apktool\framework\1.apk和~\apktool\framework\2.apk。

许多⼈拿来apktool⼯具包⽤,说解不开包,运⾏出错。

原因是没有配置框架环境。

2. akp⽂件的汉化和修改我⾸先来讲对⼀般的(⾮三星)apk应⽤程序进⾏解包、汉化和打包。

为你们⽅便和叙述⽬的,我在上传的apktool和apk manager⼯具包⾥都带了⼀个⼩的apk应⽤程序SilentBoot_EN.apk。

打包解包与软件结构教程

我们今天的课程:解包打包与软件结构准备工具:Sis编辑器首先介绍一下我们需要的工具:本站"大罗"开发的sis编辑器,这也是以后我们以后解包打包的必备工具所谓汉化,就是把外文的软件中文化,我们就要修改软件里的语言文件来实现中文化,那么如何得到语言文件呢?这就需Sis编辑器解包出来才能得到解包:大家跟着一起来做,首先打Sis编辑器,按选项→选择打开sis/sisx文件,现在我们看到两个选择盘,打开任意一个会以文件管理方式来显示在我们的眼前如图现在我们以课件里的aRed软件为例,找到之后按选择,选择之后,页面会回到Sis编辑器智能界面如图现在我们看到"程序名称""程序UID""程序版本""程序语言""程序提供""程序提供(本地)""安装类型""创建日期""创建时间""目标设备""文件列表"等如果我们要找到语言文件必须要在"文件列表"里面找,现在我们按选项→编辑,现在出现我们眼前有好几个文件如图在这我必须要说一下,我们要找的语言文件后缀一般都是在rsc里面,语言文件也可以是r01…r16…的情况,r01是英语,r16是俄语,r31是中文,如果你在rsc里面找不到要汉的语言可以在相应的语言后缀里面找找到之后我们可以按左键选项提取出来汉化,提取出来的语言包可以放在C盘E盘,其中File_0.txt文件是安装时弹出的信息,可以提取出来编辑,编辑时可以是本站宣传信息和免责声明如:=掌握智能共享天下本程序由Amril、麦子汉化出品更多精彩请访问:八神智能天下提醒您:本程序不保证能兼容所有手机硬件,您必须自行担负所有可能因使用本程序而发生的风险!打包∶当你汉化完成的时候,需要打包软件才能实现软件安装,现在要做的就是要将你刚才提取出来的语言包并汉化完成的来替换"文件列表"里面相应的文件,然后按返回现在我们主要是修改界面的文字如"程序名称"的"aRed"可以改成"红键切换""程序UID"和"程序版本"不要改,"程序语言"打开可以添加语言,按选项→添加语言→选择中文,然后把光标移到中文按确认,"程序提供"是作者名字,尊重作者不要改"安装类型"有‘标准程序[SA]’‘主题/系统插件[SP]’‘程序升级/补丁[PU]’‘预装程序[PA]’‘预装补丁[PP]’我们要选择的是"标准程序[SA]"其他的等你们慢慢搞明白,剩下的"创建日期"创建时间"目标设备都不要改如图修改完后按选项→保存就算是打包了最后给大家提醒下,汉化测试最重要,汉化也不是单靠翻译还要靠理解,有些单词翻译出来语不成句,我们就要去理解该功能的作用来汉化好了,这节课就讲到这。

文件(含多级子目录)的打包和解包(下)

⽂件(含多级⼦⽬录)的打包和解包(下) 现在咱们说说解包,⼀个.dat⽂件,⾥⾯不知道包含了多少个⽂件/⽂件夹的信息,我们怎么解包呢?⼜怎么保证⽂件与⽂件之间、⽂件与其⼦⽂件之间的分级对应关系呢?下⾯我们来回顾⼀下打包的过程:把⽂件/⽂件夹的外部信息(⽂件名、⽂件名长度、⽂件的长度)/(⽂件夹名、⽂件夹名长度、⽂件的长度、⽂件的相对路径信息、⽂件类型)以结构体的形式存放在.dat⽂件中,内容也保存到.dat⽂件中 解包参数设置: bool UnPackFileAndDirectory(const string& inputzipfile, const string& outputpath) 其中第⼀个参数inputzipfile是要解包哪个⽂件(全路径),第⼆个参数outputpath是解包在哪⼀路径下(给定路径) 解包按照打包接⼝逻辑的话:⽂件、⽂件夹的顺序读取内容即可,当然啦,两边的结构体信息要定义相同,这样⼤家的协议就⼀样,解包便不会出现问题了。

解包流程:1.定位解包⽂件;2.解包⽂件部分(⽂件外部信息+⽂件内容),写⼊到指定路径下;3.解包⽂件夹部分(⽂件夹外部信息,没有内容哈,⽂件夹的内容为0),创建⽂件夹,并建⽴在指定路径下1bool UnPackFileAndDirectory(const string& inputzipfile, const string& outputpath)2 {3 FILE *rfp = NULL;4 rfp = fopen(inputzipfile.c_str(), "rb");5if (rfp == NULL)6 {7 cout << "解包:⽂件打开失败!" << endl;8return false;9 }1011//⽂件部分12int filecount;13 fread(&filecount, sizeof(filecount), 1, rfp);1415for (size_t i = 0; i < filecount; i++)16 {17struct FileInfo packFile;18 fread(&packFile, sizeof(packFile), 1, rfp);1920 cout << "filename:" << packFile.FileName << ", nameLen:" << packFile.fileNameLen << ", fileLen:" << packFile.fileSize << endl;21string path_file = outputpath + '\\' + packFile.FileName; //path_file:全路径2223 FILE *unpackFile = NULL;24 unpackFile = fopen(path_file.c_str(), "wb");25if (unpackFile == NULL)26 {27 cout << "⽂件:⽂件创建失败!" << endl;28 }2930 unsigned char*tmpBu = new unsigned char[packFile.fileSize];31 fread(tmpBu, packFile.fileSize, 1, rfp);//当然也可以不借助缓冲区32 fwrite(tmpBu, packFile.fileSize, 1, unpackFile);3334 }35 cout << endl;3637//⽂件夹部分38int folderCount;39 fread(&folderCount, sizeof(folderCount), 1, rfp);4041for (size_t i = 0; i < folderCount; i++)42 {43struct FolderInfo folder;44 fread(&folder, sizeof(folder), 1, rfp);4546//⽂件夹的基本信息47 cout << "FolderName:" << folder.FolderName << ", nameLen:" << folder.FolderNameLen << ", FolderSize:" << folder.FileSize << ", path:" << folder.Filepath << ", type:" << folder.type << endl; 4849string path_folder = outputpath + '\\' + folder.Filepath; //解包后全路径50const char * Lpath = path_folder.c_str();5152if (folder.type == 0 ) //⽂件类型53 {54 FILE * unpackFolders = NULL;55 unpackFolders = fopen(path_folder.c_str(), "wb");56if (unpackFolders == NULL)57 {58 cout << "⽂件夹:⼦⽂件创建失败!" << endl;59 }6061 unsigned char*readFolder = new unsigned char[folder.FileSize];62 fread(readFolder, folder.FileSize, 1, rfp);63 fwrite(readFolder, folder.FileSize, 1, unpackFolders);6465 }66if (folder.type == 1)//⽂件夹类型67 {68 ::CreateDirectory(Lpath, NULL); //创建⽂件夹69 }70 }7172return true;73 } 细⼼的⼩伙伴都发现了,我在⽂件解包和打包的过程中,都⽤到了临时的缓冲区:unsigned char*tmpBu = new unsigned char[fileSize];我为什么不直接从⼀个⽂件读再写⼊⽬标⽂件呢?主要是我之前就是那么⼲的,结果发现有的⽂件解包出来与原来的⽂件并不⼀致。

pak文件的打包和解包

pak⽂件的打包和解包pak格式的⽂件⼀般游戏有资源游戏素材会打包放进去⽐如游戏语⾳游戏多加点语⾳多加⼀些贴图资源外部⽂件实现的素材--->pak⽂件--->⽤的时候从⽂件中取出来⽂件的打包1 #include<iostream>2 #include<fstream>//观于⽂件的头函数3using namespace std;45struct fileInfo6 {7int fileSize;//⽂件⼤⼩8int fileOff;//⽂件在pak中的偏移9int fileNameSize;//⽂件名的长度10char* fileName;//⽂件名11 };12int main()13 {14 fileInfo pic[4] = { { 0, 0, 0, "背景.jpg" }, { 0, 0, 0, "⼈物.jpg" }, { 0, 0, 0, "箱⼦.jpg" }, { 0, 0, 0, "⽬的地.jpg" } }; 15//初始化结构体给结构体内存放数据16int listNum = 4, listSize = 8;1718 fstream resFile[4];//源⽂件19 fstream srcFile;//打包之后的⽂件20for (int i = 0; i < 4; i++)21 {22 resFile[i].open(pic[i].fileName, ios::in | ios::binary);//打开⽂件⽂本或⼆进制⽂件23 resFile[i].seekg(0, ios::end);//将⽂件指针移动到⽂件末尾end24 pic[i].fileSize = resFile[i].tellg();//得到⽂件的⼤⼩tellg25 pic[i].fileNameSize = strlen(pic[i].fileName);//求⽂件名长度26 listSize += 4 + 4 + 4 + pic[i].fileNameSize;//加上单条索引表的长度27// ⽂件⼤⼩4 +⽂件偏移量4+ ⽂件名⼤⼩4 +⽂件名长度28 }29for (int i = 0; i < 4; ++i)30 {31if (i == 0)//第⼀个⽂件32 {33 pic[i].fileOff = listSize;//第⼀个⽂件的偏移量就是索引表⼤⼩34 }35else36 {37 pic[i].fileOff = pic[i - 1].fileOff + pic[i - 1].fileSize;38//计算后⾯的⽂件偏移量39 }40 }41 srcFile.open("new.pak", ios::out | ios::binary);//准备写⼊⽂件4243 srcFile.write((char*)&listSize, sizeof(int));//写⼊索引表的⼤⼩和索引表的个数44 srcFile.write((char*)&listNum, sizeof(int));4546for (int i = 0; i < 4; ++i)//写索引表47 {48 srcFile.write((char*)&pic[i].fileSize, sizeof(int));49 srcFile.write((char*)&pic[i].fileOff, sizeof(int));50 srcFile.write((char*)&pic[i].fileNameSize, sizeof(int));51 srcFile.write(pic[i].fileName, pic[i].fileNameSize);52 }5354for (int i = 0; i < 4; ++i)//写⼊⽂件内容55 {56 resFile[i].seekg(0, ios::beg);//将⽂件指针移动到⽂件开头57while (!resFile[i].eof())//写⽂件58 {59 srcFile.put(resFile[i].get());60 }61 srcFile.seekp(-1, ios::cur);//删掉⼀个字节避免多写⼊数据62 resFile[i].close();//写完关闭63 }6465 srcFile.close();666768 cin.get();69return0;70 }//运⾏后将⽂件打包到new.pak中⽂件的解包1 #include<iostream>2 #include<fstream>3using namespace std;45struct fileInfo6 {7int fileSize;//⽂件⼤⼩8int fileOff;//⽂件在pak中的偏移9int fileNameSize;//⽂件名的长度10char fileName[128];//⽂件名11 };121314int main()15 {16 fstream file;17 file.open("new.pak", ios::in | ios::binary);//读取⽂件18 fileInfo pic[4];//写⽂件的时候⼤⼩可能不⽌四个19int listSize, listNum;// Num是索引表的个数2021 file.read((char*)&listSize, sizeof(int));//读到索引表的⼤⼩22 file.read((char*)&listNum, sizeof(int));2324//读取每条索引的内容25for (int i = 0; i < listNum; ++i)26 {27 file.read((char*)&pic[i].fileSize, sizeof(int));28 file.read((char*)&pic[i].fileOff, sizeof(int));29 file.read((char*)&pic[i].fileNameSize, sizeof(int));30 file.read(pic[i].fileName, pic[i].fileNameSize);//需要注意\031 pic[i].fileName[pic[i].fileNameSize] = '\0';32 cout << i << "个⽂件的内容------------------" << endl;33 cout << pic[i].fileSize << endl;34 cout << pic[i].fileOff << endl;35 cout << pic[i].fileNameSize << endl;36 cout << pic[i].fileName << endl;37 }38 fstream res[4];//⼤⼩其实⽤vector或者new好⼀点 listNum394041//前⾯有⽂件⼤⼩和⽂件偏移量如果读取特定的⽂件可以直接⽤索引中的⼤⼩和偏移量读取42for (int i = 0; i < listNum; ++i)43 {44 res[i].open(pic[i].fileName, ios::out | ios::binary);45for (int j = 0; j < pic[i].fileSize; ++j)46 {47 res[i].put(file.get());48 }49 res[i].close();50 }515253 file.close();//关闭⽂件54 cin.get();55return0;56 }//运⾏exe⽂件将图⽚⽂件解包。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

spk文件打包解包
123.exe 参数-p打包,参数-u解包。

txt乱码是因为加密的,重新下载明文spk文件来解。

修改掉率
相关文件:item/item_rand.txt,object/cha_drop.txt,item/drop_type/
item_rand.txt是基础掉率文件
id直接关联cha_drop.txt中的怪物掉落。

minroll最小掉落次数
maxroll最大掉落次数
drop_kind掉包种类,1是直接掉物品,2是掉落包,关联item/drop_type/中的包。

drop_id填物品或者包的id
drop_prob掉率该物品/包的概率,所有掉落概率相加不超过1
cha_drop.txt是怪物掉落
feature_drop,world_drop,still_drop三个值都可以添加item_rand.txt中的id item/drop_type/这个文件夹中是掉包文件
field1这个是注释名
field2这个是物品id
field3这个是物品权重,物品权重/权重和=物品在该包中的产出率。

添加宝石
相关文件:item/gem_item.txt,item/gem_item_link.txt,item/gem_variety.txt
gem_item.txt是宝石基础文件
id宝石的id
type填gem_variety.txt中的type值
lootlevel宝石名字显示的颜色,11是绿色,16是金色,17以后是红色
variety填gem_variety.txt中的id值
varlevel宝石的进阶关联。

variety相同的宝石,varlevel决定了宝石的升阶。

tip注释文本
icon图标\zh_cn\bin\data\gui\icon\item\bs\可以自己添加
use_id1021是镶嵌宝石use
bound_mod 0是非绑,2是绑定
requires 100*0是物理宝石,100*1是法术宝石
datas宝石属性,atb\trait_list.txt中的属性
fuse_variety,fuse_varlevel是融合宝石相关设定
gem_item_link.txt是绑定和非绑定宝石关联文件
添加宝石要添加绑定和非绑定两套,然后在这个文件中关联,不然镶嵌宝石或掉落包时可能会跳错。

drop_var是掉落该宝石的包,不用填。

gem_variety.txt是宝石种类设置文件
type是添加纹路的种类,添加宝石要选择已有的值,不然还得去改纹路添加。

200龙纹,201虎纹,202凤纹,213孔雀,214麒麟
inlay_equips宝石能镶嵌的位置,参考item_type的equip_slot值。

21武器,25配饰,22副武器,31时装帽,32时装衣,24翼装,11,18,19肘,项链,戒指,12,14,15,16腕,胸,腿,腰,10,13,17锦囊,护膝,护符
no_compose_gem_two融合宝石就填1,填不填没关系
添加属性
相关文件atb\modify_player.txt,atb\modify_grade.txt,atb\atb_fun.txt,atb\trait_list.txt trait_list.txt是属性的详细设置
id属性id,装备或者宝石的data就是填的这个
modify_id属性的类型,填modify_player.txt的id
modify_var属性的数值,百分比的数值这里要填万分位数,比如200表示2%
color属性表现的颜色
modify_player.txt是属性的定义
id属性id
treeid固定定义,不能改,添加新属性类型只能在基础定义上做文章,
iscent是否百分比属性
modify_grade.txt是属性的优先文件
id同modify_player.txt的id
fGrade属性的优先性。

数值越大,在公式计算中排序越靠后。

ntype,1物理,2法术
atb_fun.txt计算公式
atb[n] atb中的n为modify_player.txt中的treeid
modifier[n] modifier中的n为modify_player.txt中iscent为0的行的id
modifier_pct[n] modifier_pct中的n为modify_player.txt中iscent为1的行的id
添加物品
相关文件item\item_list.txt,ect\use_list.txt,item\item_type.txt
item_list.txt
idid
type类型
lootlevel颜色
variety统类值,比如打造中会引用材料的统类值而不是材料的id。

varlevel物品作用等级
tip注释文本
icon图标
consume消耗类型,0表示可叠加,4表示不可叠加。

consume_par叠加数量或其他上条定义的值
life_mode是否限时,1表示限时
life_second限时时间(s)
use_id填use_list.txt中的值
use_par使用效果,一般有以下格式:0*掉包id,物品id*数量,数量*合成需用物品id,204*学会技能id,获得数值……
bound_mode绑定模式,常用的有0非绑定,1装备绑定,2绑定,4帮会绑定
sell_price出售价,use_self_define_currency填1sell_currency填0的话,这里出售的就是流通金,填3的话就是绑玉。

reqlevel使用限制等级
datas使用效果的相关引用值
item_type.txt是物品类型的定义
id物品或装备的tpye就填这个
equip_slot镶嵌槽的类型
use_list.txt定义了物品的使用效果
cooldown冷却时间引用值
dst_item_type可以作用该use的物品类型id,比如可以增加马装具打孔和镶嵌宝石等。

progress_name读条显示的文字
script复杂的use要调用script脚本,这个要在script里面去改了
添加装备
相关文件item\equip_item.txt,与物品类似的条省略
requires装备限定,1*基础职业id,2*进阶职业id,6*帮会职位,100*物0法1,4*性别男1女2
datas装备基础属性,这个受装备星级数值叠加。

model模型,可以给装备添加时装的模型
indie_traits独立属性
ident_star鉴定属性
fix_star最高星等,如果ident_star为0,这就是固定星等。

fix_traits附加属性
一些问题解答
有些技能跳错:这是服务端技能参数与客户端不匹配,没有解决办法,只有不用引起跳错的技能。

比如侠客的千江一跃。

新秀掉线也是这个原因。

有没有data.spk:没有。

zh_cn.spk/zh_tw.spk的优先度高于data,所以改动的txt 直接放zh的相同目录下,就行了,不需要改data,也避免了客户端跳错。

关于修改方面:我是按个人喜好改的,节奏有些快,玩一周就满级了。

论坛有很多修改帖子,可以按各人兴趣自己继续改,比如怪加强,经验降低什么的。

喜欢原版的某些设置,可以找到zh中相关的文件删除,就行了。

模型不全:客户端换新点的。

可以用官方再打补丁。

当然有些台服特有的模型就没办法解决了。

物品异常跳错:数据库删除item_23里的值,有乱码符号的值不能删。

可以解决刷物品后跳错的问题。

如何修改技能刚体:skill/passive_skill_master.txt tgt_skill是强化属性level1是强化效果,5*8020*8046是全程刚体
如何取消控制:两个办法,改atb_fun.txt或者trait_list.txt,但是都会对玩家自身的刚体等属性产生效果。

如何加强怪物:object/init_npc.txt 最好只改精英怪普通怪和boss的数据,改其他可能导致剧情出错,比如开局两个鬼生命过高,脚本的伤害杀不死怪,就收不了唐刀。

相关文档
最新文档