如何找到字符串格式为十六进制的地址?

问题描述 投票:1回答:2

我有一个int key1 = -1466731422;返回我的十六进制值62 74 93 A8从.exe,当我在十六进制编辑器进行搜索。 我想要做的是覆盖一个newKey1,它可以由用户作为选件,比key1。 假设我们要覆盖key1int newKey1 = -1566731422,我所做的到目前为止是:

private void btnGravar_Click(object sender, EventArgs e)
{
    FixHex(key1, newKey1); //transform the int key in hex string

    br = new BinaryReader(File.OpenRead(element.FileName));            
    try
    {                
        for (long i = 0; i <= br.BaseStream.Length; i++)
        {
            if (br.BaseStream.ReadByte() == (byte)Convert.ToInt32(key1, 16))
            {
                progressBar.Value = progressBar.Maximum;
                br.Close();
                bw = new BinaryWriter(File.OpenWrite(element.FileName));
                bw.BaseStream.Position = i;
                bw.Write(newKey1);
                bw.Close();

                MessageBox.Show("Key updated", "Success");
                break;
            }
            else
            {
                progressBar.Value += 1;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}        

它没有工作,寿。我for循环不会找到匹配,所以我认为它会解决它的发现由int key地址的方法(因为在十六进制编辑器,我可以做到这一点),或在字符串格式的十六进制。

c# winforms binary hex byte
2个回答
1
投票
  1. 既然你正在寻找一个整数值(需要四个字节),就没有必要读一个字节。直接读取使用BinaryReader重载需要一个Int32值,看它是否符合你所寻求的一个整数。
  2. 你试图写一个字符串。这不是一个字符串,它是在小尾数四个字节序列。你需要写这四个字节,以取代现有的那些。

BinaryReader.ReadInt32()前进4个字节流的位置,所以需要保持读取位置的轨迹,由1递增它针对每一读取和手动设置BaseStream位置。

使用FileAccess.ReadWriteFileShare.ReadWriteBinaryReaderBinaryWriter两个,你可以找到价值,并一气呵成覆盖它:

注意:有没有办法来验证一个可能的假阳性这里,由于缺乏上的文件结构信息的。随你(由你决定。

int valOriginal = -1466731422;
int valSubstitute = -1566731422;
int valLength = BitConverter.GetBytes(valOriginal).Length;

using (var reader = new BinaryReader(
    File.Open("[File Path]", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))) {
    int position = 0;
    while (position < (reader.BaseStream.Length - valLength))
    {
        reader.BaseStream.Position = position;
        if (reader.ReadInt32() == valOriginal)
        {
            using (var writer = new BinaryWriter(
                File.Open("[File Path]", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))) {
                writer.BaseStream.Position = position;
                writer.Write(valSubstitute);
            };
            break;
        }
        position += 1;
    }
};

0
投票

正如其他人所说,你不正确的方式比较正确的事情。要比较你比较事物的方式取决于你在BinaryReader在读取数据的格式与“KEY1”的类型。

在你的描述,你说“KEY1”是一个整数,但随后尝试将其转换像它的字符串。我只是要承担它的一个int。您可以发表评论,如果这是不正确的。

在文件中的数据的格式也没有从描述清楚。我会假设它是整数。如果它不是整数,添加评论。读一个整数的样子:

int testVal = br.ReadInt32();

这给你一个int和因为两者都是整数,你可以比较的整数:

if(testVal == key1)
{/*do your other stuff*/}

它可能更好地循环,而该文件未结束,而不是遍历每个字节,是这样的:

while(br.BaseStream.Position != br.Basestream.Length)

将其组合在一起看起来是这样的:

while(br.BaseStream.Position != br.Basestream.Length)
{        
    int testVal = br.ReadInt32();

    if(testVal == key1)
    {/*do your other stuff*/}
}

另注:因为你“每次调用此方法new'ing的BinaryReader在和BinaryReader在处于关闭‘如果’,你可以考虑在你的BinaryReader在一个using并宣布那里。这将确保所述BinaryReader在处于异常的情况下,妥善处理。下面的变化将允许BinaryReader在妥善处置,但仍发现任何异常(也,它的那种令人难以赶上一般例外):

try
{
    using(var br = new BinaryReader(File.OpenRead(element.FileName)))
    {
        while(br.BaseStream.Position != br.Basestream.Length)
        {        
            if(br.ReadInt32() == key1)
            {/*do your other stuff*/}
        }
    }
}
catch(Exception ex)
{
}

希望帮助。

© www.soinside.com 2019 - 2024. All rights reserved.