C#读写二进制文件,可以修改部分单机游戏存档。学以致用

以单机游戏【仙剑奇侠传三】为例,使用的版本是方块游戏1.04版。打开仙剑奇侠传三游戏“新的开始”,等待剧情过后,景天单人自由活动时,保存到第一个存档。将在仙剑三主目录的save文件夹下生成一个二进制存档文件。个人测试电脑存档文件路径为“H:\CubeLibrary\apps\1000039\save\pal00.arc”。为了防止修改数据错误,我们先备份一个文件pal00bak.arc,用于测试使用

初始景天一级的精 88/88、气17/17、神29/29【数据代表当前数据和上限数据。比如:当前精88/精上限88】。

读取二进制文件,进行抓包,找出所有的 88,17,29数据

我们发现有3组疑似数据,如上图所示。

将上面的精气神三组数据修改掉,为新的字节数组赋值。比如篡改精气神的值以依次为250、150、200。

保险一点,全部都修改掉。

buffer[1352] = 250;//精
                        buffer[1356] = 150;//气
                        buffer[1360] = 200;//神

buffer[1640] = 250;//精
                        buffer[1644] = 150;//气
                        buffer[1648] = 200;//神

buffer[1688] = 250;//精
                        buffer[1692] = 150;//气
                        buffer[1696] = 200;//神

新建控制台程序:ReadWriteBinaryFileDemo

相关的C#源程序如下:

using System;
using System.IO;

namespace ReadWriteBinaryFileDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string fileName = @"H:\CubeLibrary\apps\1000039\save\pal00bak.arc";
                int fileSize = (int)new FileInfo(fileName).Length;
                Console.WriteLine($"仙剑三存档文件大小:{fileSize}字节");
                byte[] bufferWrite = new byte[fileSize];
                using (FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    //以二进制方式读文件 
                    //创建一个二进制数据流读入器,和打开的文件关联
                    using (BinaryReader binaryReader = new BinaryReader(fileStream))
                    {
                        // 把文件指针重新定位到文件的开始 
                        binaryReader.BaseStream.Seek(0, SeekOrigin.Begin);
                        //读取所有数据
                        byte[] buffer = binaryReader.ReadBytes(fileSize);
                        binaryReader.Close();
                        //在刚保存一级的时候 景天【当前】精88 气17 神29。 景天【上限】精88 气17 神29
                        //我们使用抓包的方式 过滤出来。然后尝试修改
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            if (buffer[i] == 88)
                            {
                                Console.WriteLine($"当前索引:{i},景天精{buffer[i]}");
                            }
                            else if (buffer[i] == 17)
                            {
                                Console.WriteLine($"当前索引:{i},景天气{buffer[i]}");
                            }
                            else if (buffer[i] == 29)
                            {
                                Console.WriteLine($"当前索引:{i},景天神{buffer[i]}");
                            }
                        }
                        //检索 精气神对应数据所在的包的附近40个字节
                        for (int i = 1352 - 8; i < 1352 + 32; i++)
                        {
                            Console.Write(buffer[i] + " ");
                        }
                        Console.WriteLine();
                        for (int i = 1640 - 8; i < 1640 + 32; i++)
                        {
                            Console.Write(buffer[i] + " ");
                        }
                        Console.WriteLine();
                        for (int i = 1688 - 8; i < 1688 + 32; i++)
                        {
                            Console.Write(buffer[i] + " ");
                        }

//这里篡改精气神的值以依次为250、150、200
                        buffer[1352] = 250;//精
                        buffer[1356] = 150;//气
                        buffer[1360] = 200;//神

buffer[1640] = 250;//精
                        buffer[1644] = 150;//气
                        buffer[1648] = 200;//神

buffer[1688] = 250;//精
                        buffer[1692] = 150;//气
                        buffer[1696] = 200;//神

//将篡改过的数据【新的精气神数据】 写入的新的字节数组中
                        Array.Copy(buffer, 0, bufferWrite, 0, fileSize);
                    }
                    fileStream.Close();
                }

using (FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
                {
                    //以二进制方式写文件 
                    //创建一个二进制数据流写入器,和打开的文件关联
                    using (BinaryWriter binaryWriter = new BinaryWriter(fileStream))
                    {
                        binaryWriter.Write(bufferWrite);
                        binaryWriter.Flush();
                        binaryWriter.Close();
                    }
                    fileStream.Close();
                }
                Console.WriteLine($"重新写入文件成功...");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"读写文件时出现异常:{ex.Message}");
            }
            Console.ReadLine();
        }

}
}
程序运行如图:

我们将原来的存档文件pal00.arc重命名为pal00_raw.arc。将修改后的文件 pal00bak.arc 重命名为pal00.arc。

重新打开 仙剑奇侠传三 游戏,点击“旧的回忆”,读取存档一,点击右上角的人物头像,惊喜的发现 精气神变成250,150,200了。

大功告成。

其他物品数量,金钱都可以修改二进制文件的某些值 即可。

比如精888=3*256+120,转化为两个字节为3,120。只要抓包找出连续数组元素的值为buffer[i]=3 && buffer[i+1]=120 即可。

C#读写二进制存档文件,可以修改部分单机游戏存档相关推荐

  1. 修改植物大战僵尸游戏存档,二进制绘制字符或图形

    目录 修改植物大战僵尸游戏存档 安装游戏注册用户 找到用户的游戏存档二进制文件并修改 二进制绘制字符或图形 修改植物大战僵尸游戏存档 植物大战僵尸版本:植物大战僵尸2010年度版 操作系统:Windo ...

  2. 蜘蛛纸牌存档文件,修改分数

    #include <stdio.h> //蜘蛛纸牌存档文件,修改分数. int main(void) {FILE *wfile; int n = 655320;wfile = fopen( ...

  3. html游戏存档在哪里,steam游戏存档位置在哪里-查找steam游戏存档位置的方法 - 河东软件园...

    Steam是一款发型时间比较久的游戏平台,因此在这个平台中我们可以下载到小时候的游戏怀旧,也可以感受到目前最先进的游戏程序.在使用这个软件的时候我们会将自己的游戏进度存档,一般很多的单机游戏是不能一次 ...

  4. linux读写二进制大文件

    https://raw.githubusercontent.com/ceph/ceph/master/src/common/safe_io.c 一般而言,用pwrite和pread读写磁盘文件不需要用 ...

  5. 手机html5游戏内存修改,《手机游戏存档修改通用教程1 - 基础篇》

    之前发过一些修改游戏存档的帖子,大家都这个都比较感兴趣,但一直以来,大家都是照着教程一步步去修改,很多时候并不明白为什么要这样改.发贴人是怎么知道改哪个地方的?正所谓"授人以鱼不如授人以渔& ...

  6. unity 编辑器存档_Unity教程 | 自制简易的游戏存档系统

    原标题:Unity教程 | 自制简易的游戏存档系统 本文将为大家分享如何在Unity中实现简单的游戏存档系统,其中不会包含太多实际的代码,仅介绍在制作过程中需要考虑与解决的问题.该系统由一个学生团队为 ...

  7. 用git来管理单机游戏存档

    去年玩一个单机游戏饥荒,由于游戏本身没有存档管理功能,本来游戏繁复的采集资源就已经够令人抓狂了,每次主角挂了都要重新来过,更是吐血.平常在公司都用git管理项目版本,在家里和公司之间也用git同步文件 ...

  8. 本网吧单机游戏存档路径!!!

    上古传说=D:\game\上古传说\Save\*.sav 极品飞车8=C:\Documents and Settings\edkj\Local Settings\Application Data\NF ...

  9. 运用 iMazing备份《保卫萝卜》游戏存档

    游戏存档,是一种记录游戏状态.进度的文件.比如,在玩一些过关类游戏时,游戏存档能记录已经通过的关卡,在下一次打开游戏时,会直接调取存档,跳过已经通关的关卡. 当我们要更换设备玩游戏时,就可以通过备份游 ...

最新文章

  1. MySql - 索引
  2. anaconda安装环境变量问题、python环境配置问题以及其他
  3. 小白的Python之路 day5 configparser模块的特点和用法
  4. 第5章 Python 数字图像处理(DIP) - 图像复原与重建7 - 周期噪声 余弦噪声生成方法
  5. apache log4j_Apache log4j是领先的日志记录框架
  6. JavaScript字符串方法终极指南-拆分
  7. web项目出现的异常
  8. Druid实用笔记001---Druid 介绍及配置
  9. 【ZZ】栈和堆的区别
  10. html______1
  11. servlet 与 tomcat版本不匹配的问题
  12. 差分进化算法求解函数最优解matlab实现
  13. 解决gitlab-ci 自动编译时 fatal: unable to access 'http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx
  14. word参考文献乱码问题
  15. 汉朝时期皇室家谱记载的基本内容有哪些?皇室家谱有谁能列入?
  16. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
  17. MMDetection亲测安装教程
  18. Python中的enumerate用法
  19. C语言指针详解——入门C语言指针,初级指针使用。
  20. lvds单8转双8芯片_LVDS驱动芯片

热门文章

  1. 新CCIE笔记-IP网络基础
  2. word图片另存为变黑色_别处复制过来的 图像在word中粘贴后变黑怎么处理?
  3. M1 Mac 上安装 python mysqlclient
  4. 英文破折号、连接号、连字符、负号的区别,注意事项和输入方法
  5. Android Bitmap实战技巧
  6. android高级开发强化实战,高级Android开发强化实战[PDF][215.59MB]
  7. JVM——引用计数算法与可达性分析算法
  8. 数字图像处理2021.9.27—空域方法-滤波处理Filter subimage
  9. 使用华盛顿特区地铁数据确定可获利的广告位置
  10. SpringCloud(14) Sentinel 1.8.4 规则持久化到Nacos