Cheat Engine
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Cheat Engine es un programa útil para encontrar dónde se guardan valores importantes dentro de la memoria de un juego en ejecución y cambiarlos. Cuando lo descargas y lo ejecutas, se te presenta un tutorial sobre cómo usar la herramienta. Si deseas aprender a usar la herramienta, se recomienda encarecidamente completarlo.
¿Qué estás buscando?
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-5199276c4e5ebe0308fb190e64a818ca7687a11f%252Fimage%2520%28762%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6faba8de&sv=1)
Esta herramienta es muy útil para encontrar dónde se almacena algún valor (generalmente un número) en la memoria de un programa. Generalmente los números se almacenan en forma de 4bytes, pero también podrías encontrarlos en formatos double o float, o puede que desees buscar algo diferente de un número. Por esa razón, necesitas asegurarte de seleccionar lo que deseas buscar:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-bf3fd2b549ce5ec6679ab2ad5d0c6e69184967be%252Fimage%2520%28324%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=75463ddb&sv=1)
También puedes indicar diferentes tipos de búsquedas:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-89dfb4c03ecf58472673ba69e3f7e34cc8150ad2%252Fimage%2520%28311%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=49149bb6&sv=1)
También puedes marcar la casilla para detener el juego mientras escanea la memoria:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-1c4a2289e7acf9e83713b10ec53e114ec81ddb69%252Fimage%2520%281052%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=1a1e4d12&sv=1)
Teclas de acceso rápido
En Editar --> Configuración --> Teclas de acceso rápido puedes establecer diferentes teclas de acceso rápido para diferentes propósitos, como detener el juego (lo cual es bastante útil si en algún momento deseas escanear la memoria). Otras opciones están disponibles:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-6e9fc6da1511cf2cc614668407d4e0a3a7236b05%252Fimage%2520%28864%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=13dfdbe&sv=1)
Modificando el valor
Una vez que encontraste dónde está el valor que estás buscando (más sobre esto en los siguientes pasos), puedes modificarlo haciendo doble clic en él, luego haciendo doble clic en su valor:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-49cf422e11f13b28e0b0f4171b3d561223ee6d6b%252Fimage%2520%28563%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6e1c792f&sv=1)
Y finalmente marcando la casilla para realizar la modificación en la memoria:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-29389005e2e89e2a0738a59d4932c887998b9333%252Fimage%2520%28385%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=d765b252&sv=1)
El cambio en la memoria se aplicará inmediatamente (ten en cuenta que hasta que el juego no use este valor nuevamente, el valor no se actualizará en el juego).
Buscando el valor
Entonces, vamos a suponer que hay un valor importante (como la vida de tu usuario) que deseas mejorar, y estás buscando este valor en la memoria.
A través de un cambio conocido
Suponiendo que estás buscando el valor 100, realizas un escaneo buscando ese valor y encuentras muchas coincidencias:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-737d473d9438603b9aeac3bf809bc82d16ee3a64%252Fimage%2520%28108%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b17e5b96&sv=1)
Luego, haces algo para que el valor cambie, y detienes el juego y realizas un siguiente escaneo:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-0387f5e05fe40fc8d696afbbe226e4a10ca78bb1%252Fimage%2520%28684%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9692ee49&sv=1)
Cheat Engine buscará los valores que pasaron de 100 al nuevo valor. Felicitaciones, encontraste la dirección del valor que estabas buscando, ahora puedes modificarlo. Si aún tienes varios valores, haz algo para modificar nuevamente ese valor y realiza otro "siguiente escaneo" para filtrar las direcciones.
Valor desconocido, cambio conocido
En el escenario en que no conoces el valor pero sabes cómo hacerlo cambiar (e incluso el valor del cambio), puedes buscar tu número.
Así que, comienza realizando un escaneo de tipo "Valor inicial desconocido":
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-e88ab88668282f473b89b3daac3a1dfa21d33922%252Fimage%2520%28890%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ac2fd00&sv=1)
Luego, haz que el valor cambie, indica cómo el valor cambió (en mi caso disminuyó en 1) y realiza un siguiente escaneo:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-f68b94b57afe72bdbb956e119037707faf3f443d%252Fimage%2520%28371%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e540f23c&sv=1)
Se te presentarán todos los valores que fueron modificados de la manera seleccionada:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-5f898871f518b602b86d3217c70c496747caa3d6%252Fimage%2520%28569%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=268cfdf5&sv=1)
Una vez que hayas encontrado tu valor, puedes modificarlo.
Ten en cuenta que hay un montón de cambios posibles y puedes hacer estos pasos tantas veces como desees para filtrar los resultados:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-46a41159290eeddd52458038e793390e25e46f61%252Fimage%2520%28574%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=1ac46b99&sv=1)
Dirección de memoria aleatoria - Encontrando el código
Hasta ahora hemos aprendido cómo encontrar una dirección que almacena un valor, pero es muy probable que en diferentes ejecuciones del juego esa dirección esté en diferentes lugares de la memoria. Así que vamos a averiguar cómo encontrar siempre esa dirección.
Usando algunos de los trucos mencionados, encuentra la dirección donde tu juego actual está almacenando el valor importante. Luego (deteniendo el juego si lo deseas) haz clic derecho en la dirección encontrada y selecciona "Descubrir qué accede a esta dirección" o "Descubrir qué escribe en esta dirección":
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-7b4690993022a9831e76335d100edd1eccf3decd%252Fimage%2520%281067%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=4211e4cf&sv=1)
La primera opción es útil para saber qué partes del código están usando esta dirección (lo cual es útil para más cosas como saber dónde puedes modificar el código del juego). La segunda opción es más específica, y será más útil en este caso ya que estamos interesados en saber desde dónde se está escribiendo este valor.
Una vez que hayas seleccionado una de esas opciones, el depurador se adjuntará al programa y aparecerá una nueva ventana vacía. Ahora, juega el juego y modifica ese valor (sin reiniciar el juego). La ventana debería llenarse con las direcciones que están modificando el valor:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-c70eb8753dc3dfd34c5e78cb2de0907db9831b02%252Fimage%2520%2891%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5775bf7e&sv=1)
Ahora que encontraste la dirección que está modificando el valor, puedes modificar el código a tu antojo (Cheat Engine te permite modificarlo rápidamente a NOPs):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-cb650a2ed3b9f308c79e2e3ff32eef3cb73c316d%252Fimage%2520%281057%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a5baf430&sv=1)
Así que, ahora puedes modificarlo para que el código no afecte tu número, o siempre afecte de manera positiva.
Dirección de memoria aleatoria - Encontrando el puntero
Siguiendo los pasos anteriores, encuentra dónde está el valor que te interesa. Luego, usando "Descubrir qué escribe en esta dirección", averigua qué dirección escribe este valor y haz doble clic en ella para obtener la vista de desensamblado:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-42ed44f78bf742894d2766e7b8d64ceeaf284ea7%252Fimage%2520%281039%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6facdccf&sv=1)
Luego, realiza un nuevo escaneo buscando el valor hex entre "[]" (el valor de $edx en este caso):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-f33c3c9b5ffe43a299df00a9d1a2a8c3190aa3ed%252Fimage%2520%28994%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=29b880f&sv=1)
(Si aparecen varios, generalmente necesitas la dirección más pequeña) Ahora, hemos encontrado el puntero que estará modificando el valor que nos interesa.
Haz clic en "Agregar dirección manualmente":
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-97522921cf001c5d9f323761101052154dea43d4%252Fimage%2520%28990%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=98fb0c0c&sv=1)
Ahora, marca la casilla "Puntero" y agrega la dirección encontrada en el cuadro de texto (en este escenario, la dirección encontrada en la imagen anterior fue "Tutorial-i386.exe"+2426B0):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-a27b8e3a343a04ddef531ddfbbee3380f8d03647%252Fimage%2520%28392%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b5cf900c&sv=1)
(Ten en cuenta cómo la primera "Dirección" se completa automáticamente a partir de la dirección del puntero que introduces)
Haz clic en Aceptar y se creará un nuevo puntero:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-926a0a9befe472f62fa9c3a28008d574d181b211%252Fimage%2520%28308%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=106c9cd7&sv=1)
Ahora, cada vez que modifiques ese valor, estarás modificando el valor importante incluso si la dirección de memoria donde se encuentra el valor es diferente.
Inyección de código
La inyección de código es una técnica donde inyectas un fragmento de código en el proceso objetivo, y luego rediriges la ejecución del código para que pase por tu propio código escrito (como darte puntos en lugar de restarlos).
Así que, imagina que has encontrado la dirección que está restando 1 a la vida de tu jugador:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-0baad2ee8aeb02ce9568a3cb9c0a5e76c358bd7a%252Fimage%2520%28203%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a403f2c7&sv=1)
Haz clic en Mostrar desensamblador para obtener el código desensamblado. Luego, haz clic en CTRL+a para invocar la ventana de Auto ensamblado y selecciona Plantilla --> Inyección de código
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-d0ab0ee19bc368c234dcbe2e104a7b709e312e75%252Fimage%2520%28902%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ee49e960&sv=1)
Completa la dirección de la instrucción que deseas modificar (esto generalmente se completa automáticamente):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-f65d4b745641776af844d3b90e12cdf6926fae0c%252Fimage%2520%28744%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6ca4039d&sv=1)
Se generará una plantilla:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-383a5938f5d4b40e2e763e3f76cfd6d511cff6f7%252Fimage%2520%28944%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=da9a1b67&sv=1)
Así que, inserta tu nuevo código ensamblador en la sección "newmem" y elimina el código original de "originalcode" si no deseas que se ejecute. En este ejemplo, el código inyectado sumará 2 puntos en lugar de restar 1:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-2ff8316dea7bbad4c8ab237b3b2ec3205edfd46a%252Fimage%2520%28521%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ff0694b3&sv=1)
Haz clic en ejecutar y así tu código debería ser inyectado en el programa cambiando el comportamiento de la funcionalidad!
Referencias
Tutorial de Cheat Engine, complétalo para aprender a comenzar con Cheat Engine
Last updated