Побитовые операции с шифрованымм сетевым пакетом

BMWX6

AG епты
на руках есть сырцы срр, стал переносить на пхп
PHP:
void subdecrypt(uint32* dataPtr)
{
    const uint32 cryptTable[]={0x87F8456B, 0x4079AA66, 0x97C1D703, 0x0AFA730FE};

	unsigned int var10; // [sp+8h] [bp-10h]@1
	unsigned int key; // [sp+Ch] [bp-Ch]@1
	unsigned int var4; // [sp+14h] [bp-4h]@1
	unsigned int var14; // [bp-14h]

	var4 = *dataPtr;
	var10 = *(dataPtr+1);
	var14 = 0x9E3779B9;
	key = var14*15;

	for(int p=0;p<15;p++){
		var10-=(var4 +((var4 << 4)^(var4 >> 5)))^(key+cryptTable[(key >> 11) & 3]);
		key -= var14;
		var4-=(var10 +((var10 << 4)^(var10 >> 5)))^(key+cryptTable[key  & 3]);
	};
	*dataPtr = var4;
	*(dataPtr+1) = var10;
}

void decrypt(int xorKey, int size, uint8 *p_data)
{
//	int result; // eax@10
	int k; // [sp+4h] [bp-1Ch]@7
	int j; // [sp+8h] [bp-18h]@4
	int i; // [sp+Ch] [bp-14h]@1
	signed int v7; // [sp+14h] [bp-Ch]@4

	for ( i = 0; i < size / 8; ++i )
        subdecrypt((uint32*)(p_data+8 * i));
	v7 = size >> 1;
	for ( j = 1; j < v7 - 2; j += 2 )
        *(uint16*)(p_data+2 * j) ^= (uint16)j ^ *(uint16*)(p_data+2 * j + 4);
	for ( k = v7 - 2; k; k -= 2 )
        *(uint16 *)&p_data[2 * k] ^= (uint16)k ^ *(uint16 *)(p_data+2 * k - 4);
    *(uint32 *)p_data ^= xorKey;
}

#необходимые куски
decrypt(15,blockSize-8,dataBlock+3);
uint16	commandCode;//0x04 - select game, 0x5 -return to title, 0x6 - stop request
вот что имею на пхп

PHP:
function subdecrypt($dataPtr) 
    {
		$cryptTable = array(0x87F8456B, 0x4079AA66, 0x97C1D703, 0x0AFA730FE);
		$var4 = ord($dataPtr);
		$var10 = ord($dataPtr[1]);
		$var14 = 0x9E3779B9;
		$key = $var14*15;
		for($p = 0; $p < 15; $p++)
		{
			$var10-=($var4 +(($var4 << 4)^($var4 >> 5)))^($key+$cryptTable[($key >> 11) & 3]);
			$key -= $var14;
			$var4 -=($var10 +(($var10 << 4)^($var10 >> 5)))^($key+$cryptTable[$key & 3]);
		}

		return chr($var4).chr($var10);
	}

$read = substr($read, 3);

			for($i = 0; $i < floor(strlen($read)/8); $i++)
			{
				$subdec = subdecrypt(substr($read, 8*$i, 2));
				$read = substr($read, 0, 8*$i).$subdec.substr($read, 8*$i +2);
			}
			
			$v7 = strlen($read) >> 1;

			for ( $j = 1; $j < $v7 - 2; $j += 2 )
			{
				$num = ord($read[2*$j+4])+(ord($read[2*$j+5]) << 8);
				$left = ord($read[2*$j])+(ord($read[2*$j+1]) << 8);
				$left ^= $num;
				$read = substr($read, 0, 2*$j).chr($left&0xFF).chr($left >> 8).substr($read, 2*$j +2);
			}

			for ( $k = $v7 - 2; $k; $k -= 2 )
			{
				$num = ord($read[2*$k-4])+(ord($read[2*$k-3]) << 8);
				$left = ord($read[2*$k])+(ord($read[2*$k+1]) << 8);
				$left ^= $num;
				$read = substr($read, 0, 2*$k).chr($left&0xFF).chr($left >> 8).substr($read, 2*$k +2);
			}

			$read = chr(ord($read)^15).substr($read, 1);
			$ccode = ord($read[6])+(ord($read[7]) << 8);
			echo $ccode;
может кто-то помочь?
 

BMWX6

AG епты
fixxxer
конечные результаты не совпадают.

Вурдалак
возможно им
 

Вурдалак

Продвинутый новичок
BMWX6, лучше обратись к кому-нибудь за деньги. В частности, ты неверно интерпретируешь uint32* dataPtr.
 

BMWX6

AG епты
Вурдалак
готов заплатить тебе, если практикуешь такое, буду премного благодарен.
 
Сверху