From 47d580dae8430a7f3e0fcb99a17c3ddc58faf91f Mon Sep 17 00:00:00 2001 From: "alexey.min" Date: Mon, 13 Feb 2012 04:14:19 +0000 Subject: [PATCH] L2packets: add getsockname() to net layer sniff gameclient: add option to bind outcoming socket to some port (TeonPvP hacks) --- l2detect/GameClient_sniff.cpp | 18 ++++++++++++++++++ l2packets/net_io/L2Packet_NetLayer.cpp | 22 +++++++++++++++++++--- l2packets/net_io/L2Packet_NetLayer.h | 9 +++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/l2detect/GameClient_sniff.cpp b/l2detect/GameClient_sniff.cpp index a9b23e4..54ed425 100644 --- a/l2detect/GameClient_sniff.cpp +++ b/l2detect/GameClient_sniff.cpp @@ -35,6 +35,24 @@ bool GameClient::PC_sniff( SOCKET scl, unsigned char *sip, unsigned short int sp log_error( LOG_ERROR, "GameClient::ProcessClient_onlySniff(): real GS socket create\n" ); return false; } + + // TeonPVP hack + if( g_cfg.TeonPvP_hacks ) + { + unsigned short teon_port = 43880; + log_error( LOG_WARNING, "TeonPvP hacks: bind to port %d\n", teon_port ); + int rr = L2PNet_bind( sg, "0.0.0.0", teon_port ); + if( rr != 0 ) + log_error( LOG_ERROR, "TeonPvP hacks: bind failed!!!!\n" ); + sockaddr_in soaddr; + memset( &soaddr, 0, sizeof(soaddr) ); + rr = L2PNet_getsockname( (SOCKET)sg, &soaddr ); + if( rr == 0 ) + { + log_error( LOG_OK, "TeonPvP hacks: Bound outcome socket to address %s:%d\n", + L2PNet_inet_ntoa(soaddr.sin_addr), (int)L2PNet_ntohs(soaddr.sin_port) ); + } + } // connect to real game server log_error( LOG_DEBUG, "GameClient::ProcessClient_onlySniff(): Connecting to real game server %s:%d ", ssip, (int)sport ); diff --git a/l2packets/net_io/L2Packet_NetLayer.cpp b/l2packets/net_io/L2Packet_NetLayer.cpp index a2c8438..3e23276 100644 --- a/l2packets/net_io/L2Packet_NetLayer.cpp +++ b/l2packets/net_io/L2Packet_NetLayer.cpp @@ -3,12 +3,12 @@ #include // network function pointers table -#define l2pnet_ft_size 11 -void *l2pnet_ft[l2pnet_ft_size] = {0, 0,0,0, 0,0,0, 0,0,0, 0}; +#define l2pnet_ft_size 12 +void *l2pnet_ft[l2pnet_ft_size] = {0, 0,0,0, 0,0,0, 0,0,0, 0,0}; // winsock override function table CRITICAL_SECTION l2pnet_cs; // winsock2 functions HINSTANCE l2pnet_hws2_32; -void *ws2_func[l2pnet_ft_size] = {0, 0,0,0, 0,0,0, 0,0,0, 0}; +void *ws2_func[l2pnet_ft_size] = {0, 0,0,0, 0,0,0, 0,0,0, 0,0}; char l2pnet_static_inet_ntoa_buffer[32]; typedef int (__stdcall *select_func)( int, fd_set *, fd_set *, fd_set *, const struct timeval *); @@ -19,6 +19,7 @@ typedef int (__stdcall *WSACleanup_func)(void); //typedef void *(__stdcall *gethostbyname_func)( const char * ); typedef int (__stdcall *getaddrinfo_func)( const char *, const char *, void *, void * ); /* Success returns zero. Failure returns error code */ typedef void (__stdcall *freeaddrinfo_func)( void * ); +typedef int (__stdcall *getsockname_func)( unsigned int, void *, void * ); //select_func select_winsock = NULL; @@ -57,6 +58,7 @@ int L2PNet_InitDefault() ws2_func[L2PFUNC_SELECT] = (void *)GetProcAddress( l2pnet_hws2_32, "select" ); ws2_func[L2PFUNC_SOCKET] = (void *)GetProcAddress( l2pnet_hws2_32, "socket" ); ws2_func[L2PFUNC_LISTEN] = (void *)GetProcAddress( l2pnet_hws2_32, "listen" ); + ws2_func[L2PFUNC_GETSOCKNAME] = (void *)GetProcAddress( l2pnet_hws2_32, "getsockname" ); for( i=1; i