我想问一下您是否有任何想法或方法来逆向工程解密算法以找到相反的加密函数。我确实拥有所有必需的密钥和字段,当然还有解密源代码,我已经对其进行了逆向工程。
我已经分析了代码并且有点知道它是如何工作的,但无法弄清楚如何反转(在取消加密的意义上)它。
以下信息可供我使用:
// I have all these fields (filled correctly)
public byte[] Keychain;
public uint Step, Mul, HeaderXor, Key;
解密函数如下所示:
public void Decrypt(byte[] packet) {
fixed (byte* pp = packet, pk = Keychain) {
uint size = (uint)GetPacketSize(packet);
uint header = (first) ? /* Checks if it is a partial packet (It isnt!)*/
0x000eb7e2 :
*((uint*)&pp[0]) ^ HeaderXor;
// HeaderXor is an unsigned int
// It also changes after each decryption and if the key changes
if (first)
first = false;
uint token = *((uint*)&pp[0]);
*((uint*)&pp[0]) = header;
token &= 0x3FFF; // Get only last 14 bits
token *= Mul * 4;
// Mul is an unsigned int and changes sometimes
token = *((uint*)&pk[token]);
uint i, r, t;
size -= r = (size - 8) & 3; // Make size dividable by 4
for (i = 8; i < size; i += 4) {
t = *((uint*)&pp[i]);
token ^= t;
*((uint*)&pp[i]) = token;
t &= 0x3FFF;
token = *((uint*)&pk[t * Mul * 4]);
}
t = 0xFFFFFFFF >> 8 * (4 - (int)r);
token &= t;
*((uint*)&pp[i]) ^= token; // If something is left over ( if size - 8 == 5 then size & 3 has rest of 1)
* ((uint*)&pp[4]) = 0;
Step++;
Step &= 0x3FFF;
HeaderXor = *((uint*)&pk[Step * Mul * 4]);
}
}
结果示例:
// Encrypted data
// 5b 54 34 23
// cc c2 5a a3
// 81 7e d6 27
// 36 c4 8f 36
// b9 3b 6f ce
// f4 8e 72 5b
//
// Decrypted data
// e2 b7 18 00
// 00 00 00 00
// be 00 56 00
// 2f 00 58 00
// 30 00 59 00
// 31 00 01 00
那么,你有什么办法吗?也许这个源代码可以提供更多信息,但它的服务器到客户端:
我认为,服务器到客户端的加密不是正确的。我上面发布的解密代码确实返回了正确的结果,但与您在链接页面上看到的不同。