我制作了一个挂钩 MMORPG 游戏发送功能的 DLL。当send()
函数被调用时,它会循环发送数据包,直到我停止它,而不是只发送一次数据包。
我的问题是数据包是加密的。并且,服务器检查从客户端发送的每个数据包。如果服务器期望的数据包与客户端发送的数据包不匹配,服务器将断开您的连接。因此,即使您在客户端禁用加密代码,它仍然会在服务器端得到验证。
我设法通过修改二进制文件来禁用数据包的加密,但由于上述语句,我仍然断开连接。而且,我不能无限循环发送它,因为每个数据包都应该不同。
信息:
- 只有从客户端发送到服务器的数据包被加密。从服务器到客户端的数据包没有加密。
- 只有数据包的前 2 个字节被加密。剩下的8个字节不是。数据包的大小为 10 字节。
- 我找到了函数(用汇编编写),它生成用于加密前 2 个字节的动态密钥。我想使用这些代码,但我不知道如何将它们翻译成更高级的语言,如 c++。
解密函数
unsigned short clif_decrypt_cmd( int cmd, struct map_session_data *sd ) {
if (sd) {
return (cmd ^ ((sd->cryptKey >> 16) & 0x7FFF));
}
return (cmd ^ ((((clif->cryptKey[0] * clif->cryptKey[1]) + clif->cryptKey[2]) >> 16) & 0x7FFF));
}
问题:
- 如果服务器检查每个数据包,我如何实现以无限循环发送数据包的目标?
- 我应该在每次发送之前使用加密前两个字节的函数吗?