Originally Posted by
Justin
You're saying it's intentional?
What for? to prevent people from manual patching?
They're testing the patch on their servers.
Remember the old days when we would patch instantly when they put it up, then they would change the patch? Making our checksums fail (because we don't have the algorithm) means that we can't patch, but they can because they know the algorithm. So this allows them to use their Tespia client to test the game and update the patch to the correct checksum algorithm when they're ready to push a patch public. I think this is a good reaction from Nexon due to a good amount of people that prefer pre-patching. Also, I'm sure Nexon prefers pre-patchers as well because it spreads out the bandwidth requirements. It's just annoying to them that we prepatched at first because there'd be a chance that we would get a patch we weren't meant to get.
EDIT: I've tried other standard checksum CRC seeds and all of them fail too. I think they're using a custom CRC seed and/or crc table generation algorithm so that they come up with a different CRC table. There are different ways you can affect the CRC, such as using XOR-in, XOR-out, and bit reflection.
EDIT EDIT: In case anyone was wondering, below is the CRC32 code that Nexon used to generate the crc table in their program and this code is part of NXPatcher. In the actual Nexon patching client it doesn't include the algorithm and instead has the entire crc table statically which consumes 4 * 256 = 1024 bytes.
EDIT EDIT EDIT: Technically, there is a way that I could still patch my game. I could tell my program to simply disregard the checksum and patch my game regardless. However, I think this would be an unwise move. Nexon did this for a reason.
Code:
void CChecksum::InitializeSbox()
{
int remain;
int dividend;
int bit;
for(dividend = 0; dividend < 256; dividend++)
{
remain = dividend << 24;
for(bit = 0; bit < 8; bit++)
{
if(remain & 0x80000000)
{
remain = (remain << 1) ^ 0x04C11DB7;
}
else
{
remain = (remain << 1);
}
}
this->sbox[dividend] = remain;
}
}
Bookmarks