| Tutorial para crear un sistema Anti-Speedhack En este manual aprenderan a implementar un sistema que detecte Speed Hack en los usuarios.
Una pregunta que debe pasar por la mente de algunos es “¿Pero para eso hay que modificar el cliente, no?”, bueno esa es otra opcion, pero no la recomendable, por que hay programas externos que engañan a los frames por segundo(Cuadros por segundo) poniendo 1 o 2 frames mientras que va a 30 o 40.
Para resolver esto yo (Sicarul) he ideado un “Conteo de pasos” que cuenta cuantos pasos hace el usuario en un segundo, si hizo mas de “X” pasos en un segundo, sumar Otro contador, que al llegar a “Y” cantidad hace que el personaje sea automaticamente BANEADO.
Puede ser que estes un poco confundido pero empezemos a la practica:
Busca el “Type usercounters” que es como se muestra debajo:
Type UserCounters
IdleCount As Long
AttackCounter As Integer
HPCounter As Integer
STACounter As Integer
Frio As Integer
COMCounter As Integer
AGUACounter As Integer
Veneno As Integer
Paralisis As Integer
Ceguera As Integer
Estupidez As Integer
Invisibilidad As Integer
PiqueteC As Long
Pena As Long
SendMapCounter As WorldPos
Pasos As Integer
'[Gonzalo]
Saliendo As Boolean
Salir As Integer
'[/Gonzalo]
End Type
Y agregale en donde quieras (Antes de end type y despues de type usercounters) lo siguiente:
AntiSH As Integer
AntiSH2 As Integer Nuevamente a usar la funcion buscar del Visual Basic ;)
En el modulo TCP, mas especificamente en el sub “HandleData” busca el Case “M”, normalmente es asi:
Case "M" 'Moverse
rdata = Right$(rdata, Len(rdata) - 1)
If Not UserList(UserIndex).flags.Descansar And Not UserList(UserIndex).flags.Meditando _
And UserList(UserIndex).flags.Paralizado = 0 Then
Call MoveUserChar(UserIndex, val(rdata))
ElseIf UserList(UserIndex).flags.Descansar Then
UserList(UserIndex).flags.Descansar = False
Call SendData(ToIndex, UserIndex, 0, "DOK")
Call SendData(ToIndex, UserIndex, 0, "||Has dejado de descansar." & FONTTYPE_INFO)
Call MoveUserChar(UserIndex, val(rdata))
ElseIf UserList(UserIndex).flags.Meditando Then
UserList(UserIndex).flags.Meditando = False
Call SendData(ToIndex, UserIndex, 0, "MEDOK")
Call SendData(ToIndex, UserIndex, 0, "||Dejas de meditar." & FONTTYPE_INFO)
UserList(UserIndex).Char.FX = 0
UserList(UserIndex).Char.loops = 0
Call SendData(ToPCArea, UserIndex, UserList(UserIndex).Pos.Map, "CFX" & UserList(UserIndex).Char.CharIndex & "," & 0 & "," & 0)
Call MoveUserChar(UserIndex, val(rdata))
Else
Call SendData(ToIndex, UserIndex, 0, "||No podes moverte porque estas paralizado." & FONTTYPE_INFO)
End If
If UserList(UserIndex).flags.Oculto = 1 Then
If UCase$(UserList(UserIndex).Clase) <> "LADRON" Then
Call SendData(ToIndex, UserIndex, 0, "||Has vuelto a ser visible." & FONTTYPE_INFO)
UserList(UserIndex).flags.Oculto = 0
UserList(UserIndex).flags.Invisible = 0
Call SendData(ToMap, 0, UserList(UserIndex).Pos.Map, "NOVER" & UserList(UserIndex).Char.CharIndex & ",0")
End If
End If
Exit Sub
Aquí se ve un poco confuso, cierto?, eso es lo que hace cada vez que alguien toca una flecha direccional.
En la parte que dice:
Call SendData(ToIndex, UserIndex, 0, "||No podes moverte porque estas paralizado." & FONTTYPE_INFO)
End If
If UserList(UserIndex).flags.Oculto = 1 Then
Justo antes del If UserList(UserIndex).flags.Oculto… pongan:
UserList(UserIndex).Counters.AntiSH = UserList(UserIndex).Counters.AntiSH + 1
Bueno, hagamos un repaso de lo que hicimos hasta ahora… agregamos 2 contadores e hicimos que uno aumente en uno por cada paso que da el user…
Ahora viene lo mejor
Bueno en realidad no, pero si es el final y no queria que se vallan =P
Tienen que buscar el sub “PasarSegundo”, es asi:
Sub PasarSegundo()
Dim i As Integer
For i = 1 To LastUser
'Cerrar usuario
If UserList(i).Counters.Saliendo Then
UserList(i).Counters.Salir = UserList(i).Counters.Salir - 1
If UserList(i).Counters.Salir <= 0 Then
'If NumUsers <> 0 Then NumUsers = NumUsers - 1
'Call aDos.RestarConexion(frmMain.Socket2(i).PeerAddress )
Call SendData(ToIndex, i, 0, "||Gracias por jugar Argentum Online" & FONTTYPE_INFO)
Call SendData(ToIndex, i, 0, "FINOK")
Call CloseSocket(i)
' Call CloseUser(i)
' UserList(i).ConnID = -1: UserList(i).NumeroPaquetesPorMiliSec = 0
' frmMain.Socket2(i).Disconnect
' frmMain.Socket2(i).Cleanup
' 'Unload frmMain.Socket2(i)
' Call ResetUserSlot(i)
Else
Call SendData(ToIndex, i, 0, "||En " & UserList(i).Counters.Salir & " segundos se cerrará el juego..." & FONTTYPE_INFO)
End If
End If
Next i
End Sub
Donde hay que agregar las cosas?, bueno ojala eso fuera lo complicado, pero es importante, una mal ubicación y ya no funcionaria el anti speed hack, tambien es importante no poner poquitos pasos por segundo para SH, yo recomiendo algo de 7 o 8 para no banear por LAG.
El lugar exacto es justo una linea arriba de Next i y debajo de End If
If UserList(i).Counters.AntiSH > 7 Then
UserList(i).Counters.AntiSH2 = UserList(i).Counters.AntiSH2 + 1
Call SendData(ToIndex, i, 0, "||Contador Anti Speed Hack: " & UserList(i).Counters.AntiSH2 & “ a los 10 sera baneado” & FONTTYPE_VENENO)
If UserList(i).Counters.AntiSH2 > 9 Then
UserList(i).flags.Ban = 1
Call SendData(ToAll, 0, 0, "|| '" & UserList(i).Name & "' fue automaticamente baneado del servidor por uso de SPEEDHACK" & FONTTYPE_GUILD)
Call CloseSocket(i)
End If
End If
UserList(i).Counters.AntiSH = 0
Es el codigo mas largo, ehh? XD
No se preocupen que cuando copian el codigo a Visual Basic queda bien, los mensajes los pueden modificar al igual que los contadores.
Gracias por Seguirme en este manual! |