[小学]游戏存档数值寻址C 源程序zip
游戏存档数值寻址C#源程序zip
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication5
{
//用于游戏存档数据地址寻找,用于多个存档的对比分析
class Program
{
//把文件写入二进制,找出二进制中相应数据的地址,返回地址数组
static int[] readbyte(string wenjian, int seeing)
{
byte[] jinzhi = new byte[800000];
FileStream asave = new FileStream(wenjian + ".sav",
FileMode.Open);
asave.Read(jinzhi, 0, Convert.ToInt32(asave.Length));
int i = 0, j = 0;
int[] dizi1 = new int[30000];
while (i < jinzhi.Length)
{
if (jinzhi[i] == seeing)
{
dizi1[j++] = i;
}
i++;
}
int[] dizi = new int[j];
while (j > 0)
{
dizi[j - 1] = dizi1[j - 1];
j--;
}
asave.Close();
return dizi;
}
//对比地址数组中的地址数据,求出对应文件的正确的数据,返回对应地址,缩小搜索范围
static int[] remain(string wenjian, int[] dizi, int
seeing)
{
int i = 0;
int j = 0;
byte[] jinzhi = new byte[800000];
FileStream asave = new FileStream(wenjian + ".sav",
FileMode.Open);
asave.Read(jinzhi, 0, Convert.ToInt32(asave.Length));
int[] zonghe1 = new int[30000];
while (i < dizi.Length)
{
if (jinzhi[dizi[i]] == seeing)
{
zonghe1[j++] = dizi[i];
}
i++;
}
int[] zonghe = new int[j];
while (j > 0)
{
zonghe[j - 1] = zonghe1[j - 1];
j--;
}
asave.Close();
return zonghe;
}
//主函数
static void Main(string[] args)
{
Console.WriteLine("改程序主要用于游戏存档数据地址寻找,用于对多个存档的对比分析。\n请把存档.sav文件放到该程序的同一目录下,比如要找到存储金钱的数值位置,\n现在有3个存档:01.sav,02.sav,03.sav;\n金钱数分别是
10000,20000,30000;\n在运行窗口中按提示输入10000,回车,01,20000,回车,02,30000,回车,30000;\n就可以把该内存地址找到,于是就可以对文件进行存档修改。\n该程序不保证一定找到地址。\n");
int i = 0;
int[] dizi;
string wenjian;
int seeing;
//便于循环操作
while (true)
{
Console.WriteLine("开始初始搜索,输入要查询
的数值");
seeing = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("初始搜索,输入要打开的文件名,请不要输入扩展名,扩展名默认是.sav");
wenjian = Console.ReadLine();
try
{
dizi = readbyte(wenjian, seeing);
}
catch (IOException e)
{
Console.WriteLine("打开失败");
Console.WriteLine(e.ToString());
Console.ReadKey();
return;
}
Console.WriteLine("初次搜索找到{0}个地址", dizi.Length);
if (dizi.Length == 0)
{
Console.WriteLine("该数据不存在,本轮搜索结束");
continue;
}
//等到地址只剩下1个的时候结束循环
while (dizi.Length != 1)
{
Console.WriteLine("再次输入要查询的数值
");
seeing =
Convert.ToInt32(Console.ReadLine());
Console.WriteLine("再次输入要打开的文件
名,请不要输入扩展名,扩展名默认是.sav");
wenjian = Console.ReadLine();
try
{
dizi = remain(wenjian, dizi, seeing);
}
catch (IOException e)
{
Console.WriteLine("打开文件失败");
Console.WriteLine(e.ToString());
Console.ReadKey();
return;
}
i = 0;
while (i < dizi.Length)
{
Console.WriteLine("综合筛选的地址一
共有{0}个,第{1}个地址是:{2}", dizi.Length, i, dizi[i]);
i++;
}
//如果地址为空,跳出大循环,搜索失败
if (dizi.Length == 0)
{
Console.WriteLine("找到0个解,搜索失败,继续重新搜索");
break;
}
Console.WriteLine("此时一共还剩{0}个地址", dizi.Length);
}
Console.WriteLine("搜索完成,最终剩下的地址是{0},请记下此地址", dizi[0]);
}
}
}
}