Anti RPE WPE Source from ea

Thyr

New member
Messages
78
Points
0
Github
warcraftfrozen
Hello is this can work on Hercules?

common/socket.c

Index: socket.c
===================================================================
--- socket.c (revision 13725)
+++ socket.c (working copy)
@@ -16,6 +16,7 @@

#ifdef WIN32
#include <winsock2.h>
+ #include <time.h>
#include <io.h>
#else
#include <errno.h>
@@ -112,7 +113,54 @@
sock_arr_len = fd+1;
return fd;
}
+
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
+#else
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
+#endif

+struct timezone
+{
+ int tz_minuteswest; /* minutes W of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ FILETIME ft;
+ unsigned __int64 tmpres = 0;
+ static int tzflag;
+
+ if (NULL != tv)
+ {
+ GetSystemTimeAsFileTime(&ft);
+
+ tmpres |= ft.dwHighDateTime;
+ tmpres <<= 32;
+ tmpres |= ft.dwLowDateTime;
+
+ /*converting file time to unix epoch*/
+ tmpres /= 10; /*convert into microseconds*/
+ tmpres -= DELTA_EPOCH_IN_MICROSECS;
+ tv->tv_sec = (long)(tmpres / 1000000UL);
+ tv->tv_usec = (long)(tmpres % 1000000UL);
+ }
+
+ if (NULL != tz)
+ {
+ if (!tzflag)
+ {
+ _tzset();
+ tzflag++;
+ }
+ tz->tz_minuteswest = _timezone / 60;
+ tz->tz_dsttime = _daylight;
+ }
+
+ return 0;
+}
+
int sAccept(int fd, struct sockaddr* addr, int* addrlen)
{
SOCKET s;
@@ -196,6 +244,9 @@
time_t last_tick;
time_t stall_time = 60;

+uint32 max_frequency_warning = 12; //Max number of packets user can have that are within a certain interval of each other before the program kicks
+int diff_tolerance = 7000; //In microseconds
+
uint32 addr_[16]; // ip addresses of local host (host byte order)
int naddr_ = 0; // # of ip addresses

@@ -317,9 +368,37 @@
set_eof(fd);
return 0;
}
-
session[fd]->rdata_size += len;
session[fd]->rdata_tick = last_tick;
+
+ // Anti-WPE script by Zohan
+ if(!session[fd]->flag.server && (RFIFOW(fd,0) == 0x0438 || RFIFOW(fd,0) == 0x0116))
+ {
+ session[fd]->lastDiff = session[fd]->thisDiff;
+ session[fd]->lastPacket.tv_sec = session[fd]->thisPacket.tv_sec;
+ session[fd]->lastPacket.tv_usec = session[fd]->thisPacket.tv_usec;
+ gettimeofday(&session[fd]->thisPacket, NULL);
+ session[fd]->thisDiff = (((session[fd]->thisPacket.tv_sec - session[fd]->lastPacket.tv_sec) * 1000000) + session[fd]->thisPacket.tv_usec) - session[fd]->lastPacket.tv_usec;
+ if(abs(session[fd]->thisDiff - session[fd]->lastDiff) < diff_tolerance)
+ {
+ session[fd]->warning_number++;
+ if(session[fd]->warning_number > max_frequency_warning)
+ {
+ set_eof(fd);
+ }
+ }
+ else if(session[fd]->thisPacket.tv_sec - session[fd]->lastPacket.tv_sec > 10)
+ {
+ session[fd]->warning_number = 0;
+ }
+ else
+ {
+ if(session[fd]->warning_number > 0)
+ {
+ session[fd]->warning_number--;
+ }
+ }
+ }
return 0;
}


common/socket.h

Code:
Index: socket.h
===================================================================
--- socket.h	(revision 13725)
+++ socket.h	(working copy)
@@ -83,6 +83,13 @@
 	size_t rdata_pos;
 	time_t rdata_tick; // time of last recv (for detecting timeouts); zero when timeout is disabled
 
+    //Anti-WPE
+    struct timeval thisPacket;
+    struct timeval lastPacket;
+    int thisDiff;
+    int lastDiff;
+    uint32 warning_number; 
+    
 	RecvFunc func_recv;
 	SendFunc func_send;
 	ParseFunc func_parse;
 
Last edited by a moderator:
Back
Top