我试图清理伪代码,以使其编译和功能与原始代码不完全相同。弄清楚它到底是什么意思。我在这里提供的第一段伪代码。

  if ( ZonePlayerCount > 0 )
  {
    v3 = 0;
    v4 = 0;
    v5 = playerPointerList;
    v6 = &playerPointerList[1];
    do
    {
      if ( *(unsigned int *)&(*v5)->IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && (*v5)->Port == Port )
      {
        printf("Connection is broken because same ip/port requested another connection\n");
        sub_41CBD0((int)&(*v5)->encryptionPointer->ConnectionStatus);
        Memory = *v5;
        if ( *v5 )
        {
          DisconnectUser(*v5);
          free(Memory);
        }
        --ZonePlayerCount;
        memcpy(v5, v6, 4 * (v4 + ZonePlayerCount));
        --v3;
        v4 -= 0x3FFFFFFFu;
        v6 = (char *)v6 - 4;
        --v5;
      }
      ++v3;
      v4 += 0x3FFFFFFFu;
      v6 = (char *)v6 + 4;
      ++v5;
    }
    while ( v3 < ZonePlayerCount );
  }


据我了解,0x3FFFFFFF与数组的边界有关吗? >
我认为在DisconnectUser并且没有内存之后,所有playerPointer指针都向左移动是正确的吗?或者只是改变计数器的路径。

我认为计数器是v3可以在循环进行时不断增加,但是当玩家被移除时,它会从列表末尾开始检查?

#1 楼

我认为应该看起来像这样,我99.9%的人认为这是一个元素移位器,告诉我0x3FFFFFFF是数组的最大边界,因此附加了一些编译器来确保它到达数组的末尾。

我错了0x3FFFFFFF用于创建带符号的数字以模拟加法运算。请参阅DCoder的评论

  if ( ZonePlayerCount > 0 )
  {
    v3 = 0;

    do
    {
      if ( playerPointerList[v3].IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && playerPointerList[v3].Port == Port )
      {
        printf("Connection is broken because same ip/port requested another connection\n");
        sub_41CBD0((int)&playerPointerList[v3].encryptionPointer->ConnectionStatus);
        Memory = *v5;
        if ( *v5 )
        {
          DisconnectUser(*v5);
          free(Memory);
        }

        memcpy(&playerPointerList[v3], &playerPointerList[v3 + 1], 4 * (ZonePlayerCount - v3 - 1));
        //or
        memmove(&playerPointerList[v3], &playerPointerList[v3 + 1], (ZonePlayerCount - v3 - 1) * sizeof(&playerPointerList));
        --ZonePlayerCount;
        --v3;
      }
      ++v3;
    }
    while ( v3 < ZonePlayerCount );
  }


让我知道这是错误的,我将删除答案。 (没有原始源代码可与之进行比较)。

我不应该使用memcpy,因为它可能在最后将垃圾存储在内存中,但是我认为垃圾不会造成危害,最终时间到来时将替换为有用的内容。

虽然看起来似乎更适合memmove()

评论


看起来很正确。要注意的一件事是0x3FFFFFFF * 4 = 0xFFFFFFFC或-4。这不是字面量数组的界限,它只是从数字中减去4 *计数器的一种巧妙方法。

– DCoder
2014年9月21日下午5:18

嗯,谢谢,所以它尝试通过做乘法来减法,所以很奇怪,这充满了惊奇,它也为数字的幂除法(在其他部分)进行了右移。有一天,这些反编译器将具有可以识别所有内容并为您简化的模式!如果IDA的Hex-Ray是开源的,人们可以在其中填充所有内容的模式,那么该项目早就可以更好地完成了,那么再来看一下Hex-Rays完整的垃圾。

– SSpoke
2014-09-22 2:32