【问题标题】:How to overwrite specific bytes in a binary file with C#?如何用 C# 覆盖二进制文件中的特定字节?
【发布时间】:2026-02-08 22:35:01
【问题描述】:

我想覆盖 exe 中的字节。

所以我需要生成一个随机字符串,进行转换,然后写入到exe中。

我需要以这种格式 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12) 覆盖您在此处看到的 4 个十六进制字符串,因此需要破折号,这对我来说也是个问题。

这是第一个字符串的位置。

我完全不知道如何开始,如何以正确的格式用随机字符串(十六进制,所以随机只能是 0123456789abcdef)覆盖这 4 个字符串

非常感谢任何帮助。

【问题讨论】:

  • 好吧,您对 c# 和 .net 以及一般流了解多少?这个想法是,在打开/写入模式下创建一个文件流,寻找要写入的位置,写入随机字节(不是字符串,原始字节),刷新并关闭文件流。您明确地停留在哪一部分?
  • 字符串看起来也像 GUID 格式。
  • 你不是想破解什么东西,是吗?
  • 是的,它是一个向导,我希望能够更改它。我试图随机化一个字符串,然后转换为十六进制,然后写入它,但它无法正确转换它,所以你建议每个字节写入一个字节。这种格式 if (i, i>x,i++) ?
  • 可能与以下内容重复:*.com/questions/5132890/… 此处链接描述][1] [1]:*.com/questions/5132890/…

标签: c# binary byte overwrite


【解决方案1】:

您要覆盖的字符串是一个 GUID。您可以使用Guid 类来生成一个新的(参见MSDN Documentation

至于写入文件,使用BinaryWriter类。

using (System.IO.BinaryWriter fileWriter = new System.IO.BinaryWriter(System.IO.File.Open("path", System.IO.FileMode.Open)))
{
    fileWriter.BaseStream.Position = 0xB8EB9; // set the offset
    fileWriter.Write(Encoding.ASCII.GetBytes(Guid.NewGuid().ToString()));
}

ideone sample

【讨论】:

  • 这很有意义,谢谢,但现在我遇到了一个错误: using (System.IO.BinaryWriter bw = new System.IO.BinaryWriter(System.IO.File.Open(path, FileMode.打开,FileAccess.Write,FileShare.None))) bw.BaseStream.Position = 0xB8EB9; // 设置偏移量 bw.Write(g1);错误:名称“bw”不存在是 bw.write 的当前上下文
  • 它看起来是由于在语句范围之后没有代码造成的。我在我的 iPad 上输入了这个,但请参阅this question on using the using statement。您可以丢弃using 语句,只需在BinaryReader 上调用Close()
  • 这行不通,BinaryWriter 对字符串进行特殊处理。它首先写入字符串的长度。这里需要一个 byte[],从 Encoding.ASCII 获取一个
  • @HansPassant 我忽略了这一点!谢谢,我会更新我的答案。
  • 几乎就在那里,问题是当它写 '$' 作为第一个字符时,会用生成的 guid 的一部分覆盖最后一个 }