如何用 C# 覆盖二进制文件中的特定字节?

Posted

技术标签:

【中文标题】如何用 C# 覆盖二进制文件中的特定字节?【英文标题】:How to overwrite specific bytes in a binary file with C#? 【发布时间】:2013-01-10 09:49:30 【问题描述】:

我想覆盖 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/… 【参考方案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 的一部分覆盖最后一个

以上是关于如何用 C# 覆盖二进制文件中的特定字节?的主要内容,如果未能解决你的问题,请参考以下文章

如何用matlab可视化二进制文件,如图像?

如何用javascript实现图片与二进制的转换?

如何用 Python 覆盖文件中间的一些字节?

如何用IDA找到这个程序中特定函数地址

如何使用 C++ 覆盖二进制文件的一部分?

Java 演示如何用标准的输入输出流重定向到一个文件