0

我有一个名为 ab.exe 的文件,它包含十六进制

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBAAE8CAFDFFFF83C408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054AAE8CAFDFFFF83C40800000000000000000000000000000000000000000000000000000000000000000000000000AAE8CAFDFFFF83C4088D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我在 C++ 中有这段代码,它假设检测一个十六进制字符串是否在文件中,以及是否将其添加到列表框中。

array<Byte>^ target1 = { 0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08,0x8D };
array<Byte>^ target2 = { 0x54,0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08 };
array<Byte>^ target3 = { 0xBB,0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08 };


int matched1 = 0;
int matched2 = 0;
int matched3 = 0;
FileStream^ fs2 = gcnew FileStream(line, FileMode::Open, FileAccess::Read, FileShare::ReadWrite);

int value;
do
{
    value = fs2->ReadByte();
    if (value == target1[matched1]) {
        matched1++;
    }
    else
        matched1 = 0;

    if (value == target2[matched2]) {
        matched2++;
    }
    else
        matched2 = 0;

    if (value == target3[matched3]) {
        matched3++;
    }
    else
        matched3 = 0;

    if(matched1 == target1->Length)
    {
        listBox1->Items->Add(line + "1");

    }

    if(matched2 == target2->Length)
    {
        listBox1->Items->Add(line + "2");

    }

    if(matched3 == target3->Length)
    {
        listBox1->Items->Add(line + "3");

    }
} while (value != -1);

fs2->Close();

问题是它只将 line + 3 添加到列表框中,而不是 line + 1 或 line + 2 添加到列表框

我不知道为什么这是因为所有 3 个字符串都在文件中,所以它们都应该添加到列表框中。出于某种原因,只添加了最后一个,因为我尝试只添加了 2 个,而添加了第二个。有人可以告诉我为什么它们没有全部添加到列表框中。谢谢

更新1

在玩了一些之后,它不是每次添加的最后一个目标,而是出现在文件中的第一个字符串被添加。我使用消息框逐步完成程序,发生的事情是 54AAE8CAFDFFFF83C408 是文件中出现的第一个字符串,然后将添加行 + 2,但由于某种原因,所有 3 的匹配整数停止计数,它们只是 = 0文件的其余部分。有人可以向我解释为什么会这样以及如何解决它。

更新2

这是问题的答案。我需要做的只是添加一个matched = 0; 在每个添加到列表框命令之后。

listBox1->Items->Add(line + "1");
matched1 = 0;

listBox1->Items->Add(line + "2");
matched2 = 0;

listBox1->Items->Add(line + "3");
matched3 = 0;
4

1 回答 1

0

在我看来,在第一次匹配一个模式(此处为 target3)之后,您读取的内容超出了 target3 的最后一个字节(因为matched3++),这可能会导致不良行为。

更新1:

if(matched1 == target1->Length)
{
  matched1 = 0; // pattern matched so reset counter
  ...
}
于 2013-04-20T11:21:23.770 回答