如何用 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 theusing
statement。您可以丢弃using
语句,只需在BinaryReader
上调用Close()
这行不通,BinaryWriter 对字符串进行特殊处理。它首先写入字符串的长度。这里需要一个 byte[],从 Encoding.ASCII 获取一个
@HansPassant 我忽略了这一点!谢谢,我会更新我的答案。
几乎就在那里,问题是当它写 '$' 作为第一个字符时,会用生成的 guid 的一部分覆盖最后一个 以上是关于如何用 C# 覆盖二进制文件中的特定字节?的主要内容,如果未能解决你的问题,请参考以下文章