C#从文件中搜索二进制数据段改动后写回文件

需求概述:从一个二进制文件中找到指定的16进制数组,然后通过数据的所在位置偏移写入一个新的二进制数据。

if (!File.Exists("nslicense.dll")) {
	MessageBox.Show("请将此程序复制到XShell安装目录中,与nslicense.dll在同一目录中", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
	System.Diagnostics.Process.GetCurrentProcess().Kill();
}

//搜索7F,0C,81,F9,80,33,E1,01
string s = "7F,0C,81,F9,80,33,E1,01";

//偏移量:9
int offset_position = 9;

//改写为:
Byte overwrite_byte = 131;

string[] ss = s.Split(',');

int[] search = new int[8];

for (int i = 0; i < ss.Length; i++) {
	int a = Convert.ToInt32(ss[i], 16);
	search.SetValue(a, i);
}

FileStream F = new FileStream("nslicense.dll", FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
int b;
int p = 0;
long length = F.Length;
for (int i = 0; i <= length; i++) {
	b = F.ReadByte();
	if (b == search[p]) {
		System.Diagnostics.Debug.WriteLine("p:" + F.Position);
		p++;
		System.Diagnostics.Debug.WriteLine(p);
		if (p == search.Length) {
//全部匹配,找到位置
F.Seek(F.Position - search.Length + offset_position, SeekOrigin.Begin);
F.WriteByte(overwrite_byte);
MessageBox.Show("XShell强制升级Bug已经修复完毕", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
System.Diagnostics.Process.GetCurrentProcess().Kill();
		}
	} else {
		p = 0;
	}
}
F.Close();
MessageBox.Show("修复失败,发现未知错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);


扫码关注我的公众号