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