GS-Zone

Encriptación dinámica TODOS los paquetes. Ir al Indice

Moderadores: Moderadores de Argentum, Especialistas de Argentum, Especialistas de Programación

22

Nota » 03 Feb 2012 05:32

Bueno acá les vengo a tratar de una forma muy eficaz para sacarte de la cabeza muchos "cheaters".

el truco consiste en tener un contador de paquetes, y usarlo como pw para encriptar/desencriptar todos los paquetes, lo bueno es que esta clave cambia cada ves que sale un paquete desde el cliente, y por eso es 100% dinámica, además de que NO alarga demasiado el string (ojo, yo no hice la encriptación , fué la primera que encontré en google a las 5 am), es corto y funcional.

empezamos .

agregamos TANTO SERVIDOR COMO CLIENTE, un nuevo módulo y lo llenamos con esto

  1. ' #################################################
  2. ' #################################################
  3. ' #################################################
  4. ' #################################################
  5.  
  6. ' http://www.elguille.info/colabora/2008/ ... riptar.htm
  7.  
  8. ' #################################################
  9. ' #################################################
  10. ' #################################################
  11. ' #################################################
  12.  
  13. Function EncryptStr(ByVal S As String, ByVal P As String) As String
  14. Dim i As Integer, R As String
  15. Dim C1 As Integer, C2 As Integer
  16. R = ""
  17. If Len(P) > 0 Then
  18. For i = 1 To Len(S)
  19. C1 = Asc(mid(S, i, 1))
  20. If i > Len(P) Then
  21. C2 = Asc(mid(P, i Mod Len(P) + 1, 1))
  22. Else
  23. C2 = Asc(mid(P, i, 1))
  24. End If
  25. C1 = C1 + C2 + 64
  26. If C1 > 255 Then C1 = C1 - 256
  27. R = R + Chr(C1)
  28. Next i
  29. Else
  30. R = S
  31. End If
  32. EncryptStr = R
  33. End Function
  34.  
  35.  
  36. 'Desencripta una cadena de caracteres.
  37. 'S = Cadena a desencriptar
  38. 'P = Password
  39. Function UnEncryptStr(ByVal S As String, ByVal P As String) As String
  40. Dim i As Integer, R As String
  41. Dim C1 As Integer, C2 As Integer
  42. R = ""
  43. If Len(P) > 0 Then
  44. For i = 1 To Len(S)
  45. C1 = Asc(mid(S, i, 1))
  46. If i > Len(P) Then
  47. C2 = Asc(mid(P, i Mod Len(P) + 1, 1))
  48. Else
  49. C2 = Asc(mid(P, i, 1))
  50. End If
  51. C1 = C1 - C2 - 64
  52. If Sgn(C1) = -1 Then C1 = 256 + C1
  53. R = R + Chr(C1)
  54. Next i
  55. Else
  56. R = S
  57. End If
  58. UnEncryptStr = R
  59. End Function



buscan el sub EventoSockRead y lo remplazan por este.

  1. Public Sub EventoSockRead(ByVal Slot As Integer, ByRef Datos As String)
  2. #If UsarQueSocket = 1 Then
  3.  
  4. Dim T() As String
  5. Dim LoopC As Long
  6.  
  7. UserList(Slot).RDBuffer = UserList(Slot).RDBuffer & Datos
  8.  
  9. ' ########## Sumo el contador
  10. If UserList(Slot).flags.UserLogged Then
  11.     UserList(Slot).security.Count = UserList(Slot).security.Count + 13
  12. End If
  13.  
  14. ' ########## Desencripto!.
  15. T = Split(UnEncryptStr(UserList(Slot).RDBuffer, CStr(UserList(Slot).security.Count)), ENDC)
  16.  
  17. If UBound(T) > 0 Then
  18.     UserList(Slot).RDBuffer = T(UBound(T))
  19.    
  20.     For LoopC = 0 To UBound(T) - 1
  21.         '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  22.         '%%% SI ESTA OPCION SE ACTIVA SOLUCIONA %%%
  23.         '%%% EL PROBLEMA DEL SPEEDHACK          %%%
  24.         '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  25.         If ClientsCommandsQueue = 1 Then
  26.             If T(LoopC) <> "" Then If Not UserList(Slot).CommandsBuffer.Push(T(LoopC)) Then Call CloseSocket(Slot)
  27.         Else ' no encolamos los comandos (MUY VIEJO)
  28.               If UserList(Slot).ConnID <> -1 Then
  29.                 Call HandleData(Slot, T(LoopC))
  30.               Else
  31.                 Exit Sub
  32.               End If
  33.         End If
  34.     Next LoopC
  35. End If
  36.  
  37. #End If
  38. End Sub


un poco mas arriba está el sub EventoSockAccept

en el mismo buscamos esto

  1.        UserList(NewIndex).ConnIDValida = True
  2.         Set UserList(NewIndex).CommandsBuffer = New CColaArray
  3.         Set UserList(NewIndex).ColaSalida = New Collection


arriba/abajo da igual, agregamos

  1.        UserList(NewIndex).security.Count = 0


mas abajo en ese mismo módulo encontramos el sub EventoSockClose

buscamos esto en ese sub

  1.    'Es el mismo user al que está revisando el centinela??


abajo agregamos

  1.    UserList(Slot).security.Count = 0


bien , ahora buscamos el Type User y en el esto.

  1.    showName As Boolean 'Permite que los GMs oculten su nick con el comando /SHOWNAME


abajo agregamos



abajo del End Type o en cualquier otro módulo (preferentemente Modulo declaraciones) ponemos

  1. ' ### SEGURIDAD ###
  2. Type securityData
  3.      Count      As Double               'Contador de paquetes.
  4.     'mRotation  as sentidoGirarChars    'NO SE USA
  5. End Type


Pasamos al cliente, y remplazamos el sub SendData por este.

  1. Sub SendData(ByVal sdData As String)
  2.  
  3.     'No enviamos nada si no estamos conectados
  4.     If frmMain.Winsock1.State <> sckConnected Then Exit Sub
  5.  
  6.     Dim AuxCmd As String
  7.     AuxCmd = UCase$(Left$(sdData, 5))
  8.    
  9.     'Debug.Print ">> " & sdData
  10.     sdData = sdData & ENDC
  11.  
  12.     'Para evitar el spamming
  13.     If AuxCmd = "DEMSG" And Len(sdData) > 8000 Then
  14.         Exit Sub
  15.     ElseIf Len(sdData) > 300 And AuxCmd <> "DEMSG" Then
  16.         Exit Sub
  17.     End If
  18.    
  19.     If UCase$(Left$(sdData, 6)) = "OLOGIN" Then
  20.         packageCount = 0
  21.     Else
  22.         packageCount = packageCount + 13
  23.     End If
  24.    
  25.     Debug.Print "SALE DATA : " & sdData
  26.    
  27.     sdData = EncryptStr(sdData, cstr(packageCount))
  28.    
  29.     Debug.Print "SALE DATA CRYPT : " & sdData
  30.    
  31.     Call frmMain.Winsock1.SendData(sdData)
  32.  
  33. End Sub


y por último, declaramos



con esto estaría todo , pueden comprobar que el string no se alarga tanto, con 1 ejemplo

SALE DATA : M3
SALE DATA CRYPT : ¿¨q

SALE DATA : RC51,52
SALE DATA CRYPT : ĸ§¦ž§§r

SALE DATA : M3
SALE DATA CRYPT : ¿¨s

SALE DATA : M3
SALE DATA CRYPT : ¿¨t

SALE DATA : M4
SALE DATA CRYPT : ¿©u

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
799
Oraculo [5]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2299
Aportes: 109

Nota » 03 Feb 2012 05:36

Y que ocurre cuando la encriptación da como resultado Char0, que es el carácter de fin de comando :P
Este es el problema de encriptar TODO... de manera dinámica el error del Char0 siempre estará presente :( tiene que ser una encriptación inteligente y selectiva.
Si manda 3 o 4 veces el mismo comando, se codifica diferente no?

Novus Ordo Seclorum
834 (+4)
Administrador
Registrado: 5 Años de membresía!Años de membresía
Ubicación: Unknown
Mensajes: 9406
Aportes: 143
Premios: 1
Reportes resueltos (1)

Nota » 03 Feb 2012 07:10

Es una verga el manejo de paquetes de versiones inferiores a la 12, en un corte patería a todos(Incluidos micro cortes client-side). Cada paquee en el cliente se encripta distinto, sin embargo si al servidor llegan 2 juntos se desencriptan iguales. Y la encriptación esa no alarga ningún paquete :p. Lo que tenés que hacer para procesar los paquetes es desencriptar, buscar el nullchar, copiar hasta ahi y procesarlo, después agarrás lo que te sobró y hacés lo mismo.

Acá lo codee, no testee nada así que no aseguro que funcione, pero estoy casi seguro de que si :p.

  1. Public Sub EventoSockRead(ByVal Slot As Integer, ByRef Datos As String)
  2. #If UsarQueSocket = 1 Then
  3. Dim packet As String
  4. Dim pos As Integer
  5. Dim originalData As String
  6.  
  7. originalData = UserList(Slot).RDBuffer & Datos
  8.  
  9. Do While LenB(originalData) > 0
  10.     ' ########## Sumo el contador
  11.     If UserList(Slot).flags.UserLogged Then
  12.         UserList(Slot).security.Count = UserList(Slot).security.Count + 13
  13.     End If
  14.    
  15.     ' ########## Desencripto!.
  16.     Datos = UnEncryptStr(originalData, CStr(UserList(Slot).security.Count))
  17.    
  18.     pos = InStr(1, Datos, ENDC)
  19.     If pos > 0 Then
  20.         packet = mid$(Datos, 1, pos - 1)
  21.        
  22.         If UserList(Slot).ConnID <> -1 Then
  23.             Call HandleData(Slot, packet)
  24.         End If
  25.        
  26.         originalData = mid$(originalData, pos + 1)
  27.     Else
  28.         ' ########## El paquete no llego completo asi que restamos otra vez...
  29.         If UserList(Slot).flags.UserLogged Then
  30.             UserList(Slot).security.Count = UserList(Slot).security.Count - 13
  31.         End If
  32.        
  33.         Exit Do
  34.     End If
  35. Loop
  36.  
  37. UserList(Slot).RDBuffer = originalData
  38. #End If
  39. End Sub


En el cliente resetea el packageCount cuando establés conexión, porque sino si relogueas se va a romper todo. En el cliente te recomiendo que en el sendData hagas if logged then packagecount=packagecount+1

Porque así como está creo que es re explosivo, jaja
Usuario Registrado
327
Destructor de Mentes [4]
Registrado: Años de membresíaAños de membresíaAños de membresía
Mensajes: 670
Aportes: 2

Nota » 03 Feb 2012 08:16

Increíble matih, pero estos 2 comentarios de arriba me hacen desconfiar ¬¬ xD.

Saludos!

Imagen

Imagen

TE AMO SKYFUN SOS MI FANNNNNNNNNNNNNNNNNNNNN
HAO Staff
409
Dragon Ancestral [2]
Registrado: Años de membresía
Ubicación: Buenos Aires
Mensajes: 2745
Aportes: 28
Premios: 1
Embajador (1)

Nota » 03 Feb 2012 12:30

Un modulo del AODefender de Saturos no hacia esto?

Imagen


Gaara escribió:Me Caen Mal El Tipo De Personas Que Cuando Estas leveleando En Gathering(Por ejemplo)
Viene Un Neutro y te mata...Volves y Te Mata Lo Bardeas y le avisa al Gm y Te banea :@
Barrilete cósmico ^^
359
Aprendiz [6]
Registrado: Años de membresía
Ubicación: en mi casa
Mensajes: 439
Aportes: 2

Nota » 03 Feb 2012 12:44

idem
Lekasak escribió:Un modulo del AODefender de Saturos no hacia esto?

¿Tu área de especialidad es Graficación o Mapeación? Te presento el proyecto serio que esperabas para trabajar...

~ Para que aprendas ~
821
Dragon Ancestral [2]
Registrado: Años de membresía
Mensajes: 2707
Aportes: 98

Nota » 03 Feb 2012 12:59

If Encriptacion = 1 Then
Lag = Lag * 2
Cpu = Cpu - Lag
Else
Lag = Cpu
End If

Espero que lo entiendan y empiecen a ingeniar nuevas cosas

Saludos!
Este mensaje ha obtenido 5 Monedas de Oro.


Director de Buth AO. 9.9z Protocolo Binario, Directx8 y todo lo lindo para jugar fluidamente feliz ;D
Programador
361
Oraculo [1]
Registrado: Años de membresíaAños de membresíaAños de membresía
Mensajes: 1135
Aportes: 30

Nota » 03 Feb 2012 14:05

Lekasak escribió:Un modulo del AODefender de Saturos no hacia esto?



No, era más completo, encriptada server y cliente siempre distinto, pero como dice gs, tambien se fijada en el nullchar para no causar errores.

Programador Senior Microsoft Certified
225
Aprendiz [3]
Registrado: Años de membresíaAños de membresíaAños de membresíaAños de membresía
Mensajes: 307
Aportes: 7
Premios: 1
Mejor aporte del año (1)

Nota » 03 Feb 2012 14:35

que es nullchar? capas es el problema que tengo yo :S perdon por la ignorancia

Imagen
Zaphir AO Staff - dylanalan
750
Dragon Ancestral [2]
Registrado: Años de membresíaAños de membresía
Ubicación: Pehuajó
Mensajes: 2810
Aportes: 27

Nota » 03 Feb 2012 19:42

No se, yo iba a extraer el de revival pero me agarro una paja tremenda y termine dejandolo en la nada xD

Imagen


Gaara escribió:Me Caen Mal El Tipo De Personas Que Cuando Estas leveleando En Gathering(Por ejemplo)
Viene Un Neutro y te mata...Volves y Te Mata Lo Bardeas y le avisa al Gm y Te banea :@
Barrilete cósmico ^^
359
Aprendiz [6]
Registrado: Años de membresía
Ubicación: en mi casa
Mensajes: 439
Aportes: 2

Nota » 03 Feb 2012 22:56

^[GS]^ escribió:Y que ocurre cuando la encriptación da como resultado Char0, que es el carácter de fin de comando :P
Este es el problema de encriptar TODO... de manera dinámica el error del Char0 siempre estará presente :( tiene que ser una encriptación inteligente y selectiva.
Si manda 3 o 4 veces el mismo comando, se codifica diferente no?


uh no me percaté del vbnullchar, habría que analizar la cadena y procesarlo distinto , voy a ver como me las ingenio (no tube ningún error cuando lo probé, si alguno sabe cuando se genera el nullChar que me avise), por lo otro, si , siempre es distinto aunquesean 50 veces el mismo paquete.

(se ve en el ejemplo que envia M3 (mover direccion sur) 2 veces y son distintas)

Pato escribió:Es una verga el manejo de paquetes de versiones inferiores a la 12, en un corte patería a todos(Incluidos micro cortes client-side). Cada paquee en el cliente se encripta distinto, sin embargo si al servidor llegan 2 juntos se desencriptan iguales. Y la encriptación esa no alarga ningún paquete :p. Lo que tenés que hacer para procesar los paquetes es desencriptar, buscar el nullchar, copiar hasta ahi y procesarlo, después agarrás lo que te sobró y hacés lo mismo.

Acá lo codee, no testee nada así que no aseguro que funcione, pero estoy casi seguro de que si :p.

  1. Public Sub EventoSockRead(ByVal Slot As Integer, ByRef Datos As String)
  2. #If UsarQueSocket = 1 Then
  3. Dim packet As String
  4. Dim pos As Integer
  5. Dim originalData As String
  6.  
  7. originalData = UserList(Slot).RDBuffer & Datos
  8.  
  9. Do While LenB(originalData) > 0
  10.     ' ########## Sumo el contador
  11.     If UserList(Slot).flags.UserLogged Then
  12.         UserList(Slot).security.Count = UserList(Slot).security.Count + 13
  13.     End If
  14.    
  15.     ' ########## Desencripto!.
  16.     Datos = UnEncryptStr(originalData, CStr(UserList(Slot).security.Count))
  17.    
  18.     pos = InStr(1, Datos, ENDC)
  19.     If pos > 0 Then
  20.         packet = mid$(Datos, 1, pos - 1)
  21.        
  22.         If UserList(Slot).ConnID <> -1 Then
  23.             Call HandleData(Slot, packet)
  24.         End If
  25.        
  26.         originalData = mid$(originalData, pos + 1)
  27.     Else
  28.         ' ########## El paquete no llego completo asi que restamos otra vez...
  29.         If UserList(Slot).flags.UserLogged Then
  30.             UserList(Slot).security.Count = UserList(Slot).security.Count - 13
  31.         End If
  32.        
  33.         Exit Do
  34.     End If
  35. Loop
  36.  
  37. UserList(Slot).RDBuffer = originalData
  38. #End If
  39. End Sub


En el cliente resetea el packageCount cuando establés conexión, porque sino si relogueas se va a romper todo. En el cliente te recomiendo que en el sendData hagas if logged then packagecount=packagecount+1

Porque así como está creo que es re explosivo, jaja


concuerdo en varios puntos, sobre todo en el manejo de paquetes que es una mierda, en el setconnected abría que poner un packageCount = 0.

Luuq escribió:idem
Lekasak escribió:Un modulo del AODefender de Saturos no hacia esto?


la verdad no se como era por que cuando me lo quise bajar me tardaba horas y cancelé todo, esto lo hice yo y por lo que verán ni la encriptación codié por que eran las 5 am.

Mannakia escribió:If Encriptacion = 1 Then
Lag = Lag * 2
Cpu = Cpu - Lag
Else
Lag = Cpu
End If

Espero que lo entiendan y empiecen a ingeniar nuevas cosas

Saludos!


que flashaste? hace algún checkeo de cuanto sube el rendimiento del cpu y cuanto lag te puede causar esto, lag * 2????????????????????????

SaturoS escribió:
Lekasak escribió:Un modulo del AODefender de Saturos no hacia esto?



No, era más completo, encriptada server y cliente siempre distinto, pero como dice gs, tambien se fijada en el nullchar para no causar errores.


esto también es SIEMPRE DISTINTO, no veo la diferencia salvo el del caracter nullchar.

una pregunta para alguno , nullChar es el separator de > 12.x no ?

EDIT: Estube aproximadamente 30 minutos mandando comandos caminando , agarrando , equipando y hasta hora ningun error , voy a seguir a ver si sale el problema del nullchar
Última edición por maTih.- el 03 Feb 2012 23:02, editado 2 veces en total

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
799
Oraculo [5]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2299
Aportes: 109

Nota » 03 Feb 2012 23:12

No miré mucho el code, pero si vos encriptas, mandás y después desencriptas y separas los paquetes no importa lo del NullChar.

EDIT: Lo que puede joder es cuando salen o recibe dos paquetes juntos creo :roll: .
Última edición por TwIsT el 03 Feb 2012 23:16, editado 1 vez en total

"I'm the avatar, you gotta deal with it"
467
Destructor de Mentes [11]
Registrado: 5 Años de membresía!
Mensajes: 1021
Aportes: 2
Premios: 1
Embajador (1)

Nota » 03 Feb 2012 23:34

El null char es simplemente 0 casteado a void*.
Hice una prueba de la funcion de encriptado y encripta bien de 0 a 255 siendo biyectiva, asique no deberías tener problemas si hiciste el resto bien.

Imagen
"Caballeros, el tiempo de la vida es muy corto. Si vivimos, vivimos para hollar cabezas de reyes." William Shakespeare
AntiCheat - UpdateInteligente 4.0 - MakeDat - Jugas R.U.S.E?

Imagen
the revolution is now
520
Moderador Global
Registrado: 5 Años de membresía!
Mensajes: 6865
Aportes: 38
Premios: 1
Campeón de Ajedrez (1)

Nota » 03 Feb 2012 23:35

Eso del ao defender no te lo bajes, directamente bajate server-cliente de revival dark dawn.

Y concuerdo que el manejo de paquetes es mucho mejor de 12.0 en adelante, hay que pulir mucho estas cosas en 11.5, es algo super importante a la hora de crear un ao...

Imagen


Gaara escribió:Me Caen Mal El Tipo De Personas Que Cuando Estas leveleando En Gathering(Por ejemplo)
Viene Un Neutro y te mata...Volves y Te Mata Lo Bardeas y le avisa al Gm y Te banea :@
Barrilete cósmico ^^
359
Aprendiz [6]
Registrado: Años de membresía
Ubicación: en mi casa
Mensajes: 439
Aportes: 2

Nota » 03 Feb 2012 23:38

Estube toqueteando algo el código y me dí cuenta que todos los paquetes tienen nullChar al final, hasta ahora no tiene problemas con todo lo que probé.

para buscar el nullchar usé esto por si alguien lo necesita.

  1. Function SearchNullChar(ByVal text As String, ByRef charPos As Byte) As Boolean
  2.  
  3. ' \ Author : maTih.-
  4. ' \ Note   : Busca el carácter vbNullChar en una cadena y lo guarda en charPos.
  5.  
  6.     Dim loopX       As Long
  7.     Dim charActual  As String
  8.     Dim charCode    As Integer
  9.    
  10.     For loopX = 1 To Len(text)
  11.    
  12.         charActual = mid$(text, loopX, 1)
  13.         charCode = Asc(charActual)
  14.        
  15.         If charActual = vbNullChar Then
  16.             SearchNullChar = True
  17.             charPos = loopX
  18.             Exit Function
  19.         End If
  20.        
  21.     Next loopX
  22.  
  23. SearchNullChar = False
  24.  
  25. End Function


con eso analize cada paquete y todos llevan nullChar al final.

Encontré un lindo error al apretar "lanzar" , se envian 2 paquetes juntos y manda cualquier gilada, ahora veo como lo arreglo.
Última edición por maTih.- el 03 Feb 2012 23:39, editado 1 vez en total

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
799
Oraculo [5]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2299
Aportes: 109

Siguiente

Volver a AO 0.11.5

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados