02/11/2018, 07:30 PM (Última modificación: 14/09/2022, 07:46 AM por Neeeeeeeeeel.-. Edited 5 times in total.)
Descripción:
El WallHack es un tipo de Cheat, el cual, mediante la alteración del renderizado del juego, nos permite aplicar diferentes efectos, tanto al mapa como a las entidades, como permitiéndonos ver a través de las paredes, aplicar efectos al texturizado del render, entre otras cosas ...
Tipos de WallHacks & sus códigos:
Mediante el render del OpenGL del juego, es posible aplicar las siguientes ejecuciones de códigos para obtener diferentes efectos. Nota: No voy a explicar TODOS los códigos existentes, porque en verdad que son infinitos los efectos que se pueden hacer, pero detallaré los más usados.
Método 1: (XQZ)
Èste es el más utilizado por Cheaters debido a lo simple que es, cabe destacar que este método tuvo muchas maneras de aplicarse en el juego, tanto con el hookeo de una función de OpenGL, como un parcheo en memoria del juego (como lo hacia el WallHack.sys del Cheat para sXe 7.7 que se cargaba con el programa OSR Loader).
El código es el siguiente:
Código PHP:
//Esto se hace mediante el hookeo a una función de OpenGL32.dll //Esto funciona para CUALQUIER JUEGO que utilice el OpenGL como renderizado...
void WINAPI Hook_glBegin ( GLenum mode) //Función hookeada de Opengl32.dll { if ( mode == GL_TRIANGLE_STRIP || mode == GL_TRIANGLE_FAN ) //Si se va a renderizar un player (entidad) ... glDisable ( GL_DEPTH_TEST ); //No hacer NINGUNA comparación de profundidad ...
else if ( mode != GL_QUADS && mode != GL_LINES ) //Caso contrario, si se va a renderizar una parte del mapa ... glEnable ( GL_DEPTH_TEST ); //Hacer comparación de profundidad y actualizar el depth buffer ... }
El efecto en el juego es el siguiente:
Método 2: (Asus)
Otro de los más utilizados por Cheaters, este es generalmente el mismo que el anterior, pero con la diferencia que se le cambia el Alpha al texturizado del mapa, permitiendo ver a través de las paredes con más complejidad ...
El código es el siguiente:
Código PHP:
//Esto se hace mediante el hookeo a una función de OpenGL32.dll //Esto funciona para CUALQUIER JUEGO que utilice el OpenGL como renderizado...
void WINAPI Hook_glBegin ( GLenum mode) //Función hookeada de Opengl32.dll { if ( ! ( mode == GL_TRIANGLE_STRIP || mode==GL_TRIANGLE_FAN || mode == GL_QUADS ) ) //Si se va a renderizar una parte del mapa ... { static float col[4]; glGetFloatv (GL_CURRENT_COLOR, col ); //Obtener color actual ... glDisable ( GL_DEPTH_TEST ); //No hacer NINGUNA comparación de profundidad ... glEnable ( GL_BLEND ); //Activar esta extensión para poder cambiar el Alpha a continuación ... glBlendFunc ( GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA_SATURATE ); //Especificamos la computación del blending ... glColor4f ( col[0], col[1], col[2], 0.667f ); //Aplicar el color y el Alpha (sería el último valor, pero alterado, 0.667) ... } else { if ( mode == GL_TRIANGLES || mode == GL_TRIANGLE_STRIP || mode == GL_TRIANGLE_FAN ) //Si se va a renderizar un player (entidad) ... { glEnable ( GL_DEPTH_TEST ); //Hacer comparación de profundidad y actualizar el depth buffer ... glDisable ( GL_BLEND ); //Desactivar esta extensión, cosa de no aplicar el efecto a los players o entidades ... } } }
El efecto es el siguiente:
Métodos de Anti-WallHacks y sus códigos:
Para contrarrestar este tipo de Cheat, en el año 2002 se creó el método definitivo (por ser sólo vía servidor) que hoy en día la mayoría de servidores utilizan, y éste es el método por TraceLine y AddToFullPack ...
Este método consiste en, dentro de AddToFullPack, hacer varios TraceLine desde la vista de un jugador, hacia la posición de un rival, y si TraceLine devuelve un Fraction indicando que hay una pared enfrente de la visión del jugador, automáticamente se cancela el envío de datos de la entidad del rival en AddToFullPack, haciendo que TODOS los WallHacks queden inservibles.
El Anti-Cheat CSGuard para cs 1.4 fué el primero en crearlo, y luego vinieron las mejoras y las optimizaciones por partes de otros Anti-Cheats (caso HLGuard, sXe-Injected, WHBlocker, UAC Anti-Cheat, etc) ...
El código que pueden utilizar es el siguiente (únicamente cómo referencia, ya que NO está completo):
static Float:offset_y[][] = { {-17.0, -8.5, -8.5,-17.0 }, { 17.0, 8.5, 8.5, 17.0 } } //Esto son vectores para checkear diferentes puntos de la entidad (de pie) ... static Float:offset_z[][] = { {-34.0,-17.0, 17.0, 34.0 }, {-17.0, -8.5, 17.0, 34.0 } } //Lo mismo que lo anterior pero si está agachada ...
public Fw_AddToFullPack ( const es, const e, const ent, const host, const flags, const player, const set ) { if ( player ) //Si es un jugador ... { if ( host != ent ) //Si la entidad "no soy yo" .. { if ( !is_entity_visible ( host, ent, set ) ) //Checkear si es visible la entidad con respecto "a mi" ... { //Ningún punto de la entidad es visible, por lo tanto no enviar datos de la entidad ... forward_return ( FMV_CELL, 0 ) return FMRES_SUPERCEDE } } }
return FMRES_IGNORED }
stock is_entity_visible ( const id, const entity, const set ) { static Float:p_origin[3], Float:e_origin[3], Float:v_plane[3], Float:v_temp[3], duck, i, j
if ( !engfunc ( EngFunc_CheckVisibility, entity, set ) ) //Primero se checkea si la entidad está en mi PVS ... return false //No está en mi PVS, no enviar ningún dato de la entidad ...
entity_get_vector ( id, EV_VEC_origin, p_origin ) //Obtener mi posición y guardarla en la variable p_origin ... entity_get_vector ( entity, EV_VEC_origin, e_origin ) //Obtener la posición de la entidad y guardarla en la variable e_origin ...
entity_get_vector ( id, EV_VEC_view_ofs, v_temp ) //Obtener mis ángulos de vista ... xs_vec_add ( p_origin, v_temp, p_origin ) //Y sumarlos a mi origen (posición) ...
entity_get_vector ( entity, EV_VEC_view_ofs, v_temp ) //Obtener ángulos de vista de la entidad ... xs_vec_add ( e_origin, v_temp, v_temp ) //Y sumarlos a su origen (posición) ...
if ( is_point_visible ( p_origin, v_temp, id ) ) //Si mi vista (posición+angulos) puede ver al rival (su posición + sus angulos) ... return true //No hacer ningún checkeo siguiente (ya que la entidad es visible), esto optimiza bastante ...
xs_vec_sub ( e_origin, p_origin, v_plane ) //Vamos a obtener el plano de la entidad, restamos MI posición y la del rival = plano ... xs_vec_normalize ( v_plane, v_plane ) //Normalizar ...
vector_to_angle ( v_plane, v_plane ) //Convertir los vectores del plano a vectores angulares ... angle_vector ( v_plane, ANGLEVECTOR_RIGHT, v_plane ) //Obtener los vectores angulares (RIGHT) del plano angular ...
duck = !! ( entity_get_int ( id, EV_INT_button ) & IN_DUCK ) //Si la entidad está agachada, setear TRUE esta variable ...
if ( is_point_visible ( p_origin, v_temp, id ) ) //Si algún punto es visible ... return true //Devolver TRUE y no hacer nada más porque YA estoy viendo un algún punto ... } }
return false //No se pudo ver ningún punto, devolver FALSE y bloquear el envío de los datos de la entidad ... }
return ( fraction == 1.0 ) //Devolver únicamente si no hay ningún impacto en el trace ... }
El efecto es el siguiente:
Bypass de la protección:
A pesar de poder bloquear los WallHacks desde el Servidor, aún existen otras formas de poder ver información a través de las paredes mediante los datos del sonido de los jugadores.
En otro Thread analizaremos un poco más lo que son los SoundHacks y los métodos para bloquearos...
Nota: @Neeeeeeeeeel.- avisame si hay algo que no va dentro del post ...
Si alguien no comprende alguna parte de algún código, siéntase libre de preguntar ...
Cualquiera que quiera aportar nuevas ideas a ésto, ¡va a ser bienvenido! ...
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
02/11/2018, 08:04 PM (Última modificación: 02/11/2018, 08:06 PM por KISKE.)
Buena información!
Ya que creaste el tema, hablo desde el poco conocimiento que tengo, cuando yo cree mi primer WH (sin ningún anti-cheat en el servidor), en simples pasos, lo que hice fue obtener la posición de los jugadores, y luego con la ViewMatrix y un pequeño trozo de código agarrado de otros sitios (World2Screen), poder plasmar esas coodernadas 3D en mi pantalla, y con una app externa, dibujar un overlay de fondo que se encuntra arriba de la app del HL.
Asumo que vos me entenderás lo que hice si estás más metido en el tema.
Volviendo a la pregunta, es posible evitar esto desde el lado servidor, o si o si requiere de una aplicación corriendo en el cliente para dificultar cosas.
Si seria posible que también hablaras un poco de aquellos cheats que pueden filtrar el sma que dejaste
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
02/11/2018, 08:14 PM (Última modificación: 02/11/2018, 08:15 PM por Cr3470r.)
(02/11/2018, 08:04 PM)KISKE escribió: Asumo que vos me entenderás lo que hice si estás más metido en el tema.
Muy genial la idea, algo similar hacen algunos Cheats de CS:GO, y los nuevos de ahora lo que hacen es enviar desde los datos al juego -> a la pantalla del Overlay del Cheat.
De esta manera, si alguien está transmitiendo algo por Twitch, lo que el espectador ve es un juego limpio, pero en realidad el jugador está viendo otra cosa xd
(02/11/2018, 08:04 PM)KISKE escribió: Volviendo a la pregunta, es posible evitar esto desde el lado servidor, o si o si requiere de una aplicación corriendo en el cliente para dificultar cosas.
Creo yo que la manera de evitarlo es simplemente no enviar esos datos (desde el lado servidor), ya que sino, si te vas a la parte cliente, podrías hacer chequeos de Handles, análisis de Ventanas, etc, y ahí lo detectas al Cheat.
(02/11/2018, 08:13 PM)OsweRRR escribió: Si seria posible que también hablaras un poco de aquellos cheats que pueden filtrar el sma que dejaste
Apenas termino el Thread de SpeedHack, me pongo a hablar de SoundHack también, dame tiempo xd
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
el anti-wallhack funciona bien pero hay un detalle, al ser visible nuevamente el jugador el "EspHack" se activa
se puede añadir este complemento:
Código PHP:
register_forward(FM_AddToFullPack, "pfw_atfp", 1) //... public pfw_atfp(es, e, ent, host, flags, player, set) { if( !player ) // if isn't player or is a bot don't check (save CPU) return FMRES_IGNORED
03/11/2018, 07:58 PM (Última modificación: 03/11/2018, 07:59 PM por Cr3470r.)
(03/11/2018, 07:15 PM)mlibre escribió:
el anti-wallhack funciona bien pero hay un detalle, al ser visible nuevamente el jugador el "EspHack" se activa
se puede añadir este complemento:
Código PHP:
register_forward(FM_AddToFullPack, "pfw_atfp", 1) //... public pfw_atfp(es, e, ent, host, flags, player, set) { if( !player ) // if isn't player or is a bot don't check (save CPU) return FMRES_IGNORED
esto solo funciona si el jugador es asesinado y "respawn" en mods dm, ctf...
Este método es el mismo que utiliza el Anti-Cheat CSGuard (desde el año 2002), y básicamente pasa por lo siguiente:
En los códigos de los Cheats, te encuentras con una verificación que le hacen a las entidades de Players para ver si están vivos o no lo están.
De estar vivos, entonces son sólidas, y en caso de no estarlos, dejan de ser sólidas, haciendo que el ESP funcione correctamente.
Código PHP:
//Función del client.dll HUD_AddEntity //Utilizada para el agregado de entidades a la pantalla
int HUD_AddEntity ( int type, struct cl_entity_s *ent, const char *modelname ) { //1) Si la entidad no es nula. //2) Si la entidad es un jugador. //3) Si la entidad no es un espectador. //4) Si la entidad es sólida. (Acá es en donde se produce el fallo).
if ( ent && ent->player && !ent->curstate.spectator && ent->curstate.solid ) { //Aplicar funciones del Cheat } }
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
este efecto de "AntiWallHack" tiene una gran desventaja para jugadores con ping superior a los 90.
¿Cual?
Prefire: Al momento que un jugador enfrente a otro, el jugador contrario no vera una transicion, si no que vera una "teletransportacion" hacia el centro de su vista.
WHBlocker tiene una variable que se puede configurar para evitar ese problema.
Al momento de aplicar ese "WB" hay que transmitir la entidad antes de verla
Hay un par de contra mas que no recuerdo, si me acuerdo la comento
(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
(04/11/2018, 10:30 AM)Sugisaki escribió: este efecto de "AntiWallHack" tiene una gran desventaja para jugadores con ping superior a los 90.
¿Cual?
Prefire: Al momento que un jugador enfrente a otro, el jugador contrario no vera una transicion, si no que vera una "teletransportacion" hacia el centro de su vista.
WHBlocker tiene una variable que se puede configurar para evitar ese problema.
Al momento de aplicar ese "WB" hay que transmitir la entidad antes de verla
Sería predicción de movimiento para evitar el player-popping.
Cual es la CVAR que el WHBlocker tiene?
S2
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
este efecto de "AntiWallHack" tiene una gran desventaja para jugadores con ping superior a los 90.
¿Cual?
Prefire: Al momento que un jugador enfrente a otro, el jugador contrario no vera una transicion, si no que vera una "teletransportacion" hacia el centro de su vista.
WHBlocker tiene una variable que se puede configurar para evitar ese problema.
Al momento de aplicar ese "WB" hay que transmitir la entidad antes de verla
Hay un par de contra mas que no recuerdo, si me acuerdo la comento
creo que te refieres al leve retardo de unos segundos en reaparecer el model "lo he notado" parece arreglarse con estos ajustes
este efecto de "AntiWallHack" tiene una gran desventaja para jugadores con ping superior a los 90.
¿Cual?
Prefire: Al momento que un jugador enfrente a otro, el jugador contrario no vera una transicion, si no que vera una "teletransportacion" hacia el centro de su vista.
WHBlocker tiene una variable que se puede configurar para evitar ese problema.
Al momento de aplicar ese "WB" hay que transmitir la entidad antes de verla
Hay un par de contra mas que no recuerdo, si me acuerdo la comento
creo que te refieres al leve retardo de unos segundos en reaparecer el model "lo he notado" parece arreglarse con estos ajustes
Entonces lo que se haces es multiplicar la velocidad, y agregársela al origen de la entidad, de esa manera la posición estaría más adelantada o más atrasada y se evitaría el riesgo de que aparezcan de la nada.
Cabe destacar que el código que puse es sólo conceptual, no le puse checkeo de FOV, de entidades que no son players, predicciones, ni nada, es sólo lo básico.
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
05/11/2018, 09:06 PM (Última modificación: 05/11/2018, 09:13 PM por Destro.)
Estaba pensando en una forma de optimizar el calculo utilizando zonas, si se hace manualmente funciona muy bien, pero no puedo pensar en la forma de calcular las zonas automaticamente de manera eficiente.
Tengo una forma, pero no es para nada viable, tardaría minutos en terminar de calcular.
(05/11/2018, 09:06 PM)Destro escribió: Estaba pensando en una forma de optimizar el calculo utilizando zonas, si se hace manualmente funciona muy bien, pero no puedo pensar en la forma de calcular las zonas automaticamente de manera eficiente.
Tengo una forma, pero no es para nada viable, tardaría minutos en terminar de calcular.
No entendí bien el tema de las zonas, me explicas?
Y sobre lo que dije antes sobre las predicciones, usaría lo siguiente:
06/11/2018, 12:40 AM (Última modificación: 06/11/2018, 12:42 AM por Destro.)
(05/11/2018, 11:44 PM)Cr3470r escribió: No entendí bien el tema de las zonas, me explicas?
Creas diferentes zonas en el map, cuando jugadores estén dentro de X zona ya sabes que no pueden ver a los que estén en Y zona, así te ahorras un montón de tracelines.
Mas fácil de entender: En de_inferno, si el jugador esta en base CT, no puede ver a los que están en base TT
lo difícil es calculas las zonas automaticamente
06/11/2018, 02:04 AM (Última modificación: 06/11/2018, 02:14 AM por Cr3470r.)
(06/11/2018, 12:40 AM)Destro escribió:
(05/11/2018, 11:44 PM)Cr3470r escribió: No entendí bien el tema de las zonas, me explicas?
Creas diferentes zonas en el map, cuando jugadores estén dentro de X zona ya sabes que no pueden ver a los que estén en Y zona, así te ahorras un montón de tracelines.
Mas fácil de entender: En de_inferno, si el jugador esta en base CT, no puede ver a los que están en base TT
lo difícil es calculas las zonas automaticamente
Eso ya lo hace el plugin de por sí:
Código PHP:
if ( !engfunc ( EngFunc_CheckVisibility, entity, set ) ) //Primero se checkea si la entidad está en mi PVS ... return false //No está en mi PVS, no enviar ningún dato de la entidad ...
Más optimizado que esto no creo que se pueda, probé todos los métodos existentes e inclusive hice un cacheo de entidades para que AddToFullPack se llame en cada entidad cada "x" milisegundos, en pocas palabras el orden es el siguiente:
1) Se chequea el cacheo de la entidad, si pasaron más de "x" milisegundos ->
2) Se chequea que la Entidad esté en el PVS, si lo está ->
3) Se chequea el FOV del player, si la entidad está en el FOV ->
4) Se chequea el primer punto inicial de la entidad (origin+viewofs), si el punto es visible ->
5) Se chequea el Weapon View Point, si el punto del arma es visible ->
6) Se chequea los vectores restantes (ya sean stand o duck).
Quiero destacar que el UAC chequea tanto a rivales como a los Teams, porque viendo a los de tu Team a través de las paredes, te podes dar una idea en donde muere o en donde apuntan y con eso ya tendrías ventaja y también funciona tanto para jugadores vivos como muertos (lo que me costó un huevo de codear).
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
06/11/2018, 04:27 PM (Última modificación: 06/11/2018, 04:29 PM por Sugisaki.)
lo que se puede es hacer una entidad adjuntandola al player y haciendola mas ancha (dependiendo de una variable) la cual si se ve un punto hace al player visible aunque este no se este viendo realmente, lo que pasara es que primero se vera la entidad antes que el player salga, o modificando algunos parametros de min y max en el addtofullpack
(05/11/2018, 07:39 PM)Cr3470r escribió:
(05/11/2018, 05:20 PM)mlibre escribió:
(04/11/2018, 10:30 AM)Sugisaki escribió:
este efecto de "AntiWallHack" tiene una gran desventaja para jugadores con ping superior a los 90.
¿Cual?
Prefire: Al momento que un jugador enfrente a otro, el jugador contrario no vera una transicion, si no que vera una "teletransportacion" hacia el centro de su vista.
WHBlocker tiene una variable que se puede configurar para evitar ese problema.
Al momento de aplicar ese "WB" hay que transmitir la entidad antes de verla
Hay un par de contra mas que no recuerdo, si me acuerdo la comento
creo que te refieres al leve retardo de unos segundos en reaparecer el model "lo he notado" parece arreglarse con estos ajustes
Entonces lo que se haces es multiplicar la velocidad, y agregársela al origen de la entidad, de esa manera la posición estaría más adelantada o más atrasada y se evitaría el riesgo de que aparezcan de la nada.
Cabe destacar que el código que puse es sólo conceptual, no le puse checkeo de FOV, de entidades que no son players, predicciones, ni nada, es sólo lo básico.
(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
(06/11/2018, 04:27 PM)Sugisaki escribió: lo que se puede es hacer una entidad adjuntandola al player y haciendola mas ancha (dependiendo de una variable) la cual si se ve un punto hace al player visible aunque este no se este viendo realmente, lo que pasara es que primero se vera la entidad antes que el player salga, o modificando algunos parametros de min y max en el addtofullpack
Esto sería en cuanto a la predicción, pero sobre lo de "haciendola más ancha", supongo que eso sería para adelantar un poco más los puntos a chequear.
No sirvió el code que puse antes que computa el factor de velocidad y lo agrega al origen de la entidad?
(06/11/2018, 04:27 PM)Sugisaki escribió: la variable es "barrel"
El código del Wallhack Blocker de OT tiene justamente esta función (yo no la adjunté al código conceptual que puse en el post porque no lo vi realmente necesario ya que sólo es conceptual jaja).
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar