朋友有一个游戏服务器,并且使用机器人的问题直接与服务器通信以模拟客户端。 我决定绕过recv并发送给客户端和服务器并应用一个简单的XOR加密系统,这样机器人和其他不受保护的客户端就无法在他的服务器上运行。
我把所有东西拼凑在一起但是在最后一刻我发现客户端还与http服务器进行通信,我无法应用绕行,所以我必须检查客户端是否尝试使用send和recv on the http服务器所以我不对这些数据包应用加密/解密。
int WINAPI Myrecv(SOCKET s,char* buf,int len,int flags)
{
SOCKADDR_IN saddr;
zero(saddr);
int l=sizeof(saddr);
bool http=false;
getpeername(s,(SOCKADDR*)&saddr,&l);
if(htons(saddr.sin_port)==80)
http=true;
if(!encryption || http)
{
return origrecv(s,buf,len,flags);
}
else
{
blah blah blah..
int r=origrecv(s,mybuf,len,flags);
if(r<=0)
return r;
decrypt packet, and copy it to buf
return r;
}
}
似乎getpeername()破坏了else中的origrecv()而反之(在过去,origrecv()的实现在getpeername()之前),origrecv()也返回-1,如果getpeername()是在origrecv()之后,客户端崩溃了。
getsockname()会产生同样的问题。