Cheat Engine on Linux (Steam/Proton)

Cheat Engine on Linux (Steam/Proton)

About

I've made my rounds trying to get CE working on Linux and there are countless binaries, scripts and other buildable solutions which just don't work. Including CE's very own CEProtonLauncher binary which seems to do nothing. After giving up and trying to just launch it myself using the same Proton/wine command a game was launched with with CE copied into its Steam appid' /pfx/drive_c folder - it worked like magic. Given how many dead end search results are out there for this I figured it could use a page.

Alternatives

Those comfortable with debuggers will find gdb is capable of dumping process memory for searching and comparisons while also capable of changing memory once the right scope is found.

A more user-friendly but lacking option is scanmem which is perfect for finding and changing values while also capable of dumping and writing modified memory in various convertable formats or raw hex byte strings. There is also Game Conqueror which provides a graphical front-end for scanmem.

As it stands there is no true drop in replacement for Cheat Engine with its rapid scanning and feature filled UI for endless memory tweaking, rewriting, disassembling and debugging options all in the one interface. There are also plenty of Cheat Tables (.CT) files out in the wild making good use of Lua scripting and pointers for easy access to powerful modifications of any game's build.

Getting started

Native Linux software

Using Cheat Engine for native Linux programs is as simple as starting the Linux build of ceserver and starting the Windows build of Cheat Engine with WINE in any prefix and connecting to the ceserver running on the machine. This provides a lot of functionality however there are a few missing features. In general this will be useful for the purposes of most users.

Software running in WINE and Proton

General

Using Cheat Engine in a Windows game is as simple as starting its executable in the same WINE prefix as the software you wish to attach it to and attaching to the software.

While this is a simple process on paper; CE needs to be copied into the same WINE prefix of which the target software is running in to be able to detect it. If you're running software using the wine which ships with your distro you can easily just install CE with wine making sure to specify WINEPREFIX=/path/to/prefix and then launch it with the same WINEPREFIX variable.

Proton

When using Proton one should launch CE using the same wine executable/version which were used to launch the title to avoid problems.

There's a few variables to discover for doing the same thing with Proton and needs to discover a few variables before jumping ahead:

  1. The appID of the title.

There are a few ways to find this. You can get this by visiting the store page for a title where the app ID number will be visible in the URI.

Or you can simply run the title and note the the AppID from the SteamLaunch command's arguments. When the title is running, ps aux|grep -Po '(?<=SteamLaunch AppId=)[0-9]+, which successfully returns an appId for me.

  1. The WINE prefix directory for the title (/pfx)

When Steam launches titles with Proton it creates a new WINE prefix to hold the experience. These WINE prefix directories are stored on disk in shorthand as /pfx/ and are created in the same steamapps filesystem as your downloaded title.

I store titles in /data/steam/steamapps so my /pfx/ directories can be found at /data/steam/steamapps/compatdata/0000000/pfx with the corresponding appId substituted in.

If mlocate is installed and updatedb has been run recently enough to index the title's pfx directory, one can find the directory using locate 0000000/pfx | head -n1

  1. A copy of Cheat Engine in the prefix

WINE doesn't like running full unix paths to a PE32 executable outside a given prefix so CE will either need to be installed into the prefix, or elsewhere before being copied somewhere under drive_c/ of the prefix to be launched.

  1. The Proton wine executable used to launch the title.

The path to the WINE binary used to run a title is often visible just by grepping the process list while the title is running: ps aux | grep wine

The above command revealed GE-Proton8-25 is being used for a currently running title on my machine and its path: /home/user/.local/share/Steam/compatibilitytools.d/GE-Proton8-25/files/bin/wineserver

In this case wineserver is already running the title and we can specify /wine from that directory instead.


With the above information it's now possible to either copy an extracted CE or install it directly into the wineprefix using the wine binary discovered in #4.

Getting CE into the Proton title's prefix.

Copying an existing CE installation or using an online portable archive.

There used to be an official link to an older version (v7.2) on the main CE website which does not require installation however the link on the official website no longer works. But it appears archive.org have a copy.

I'd recommend against this older version in favour of installing it directly into the title's prefix. The above archive can be extracted for use in Proton, otherwise a pre-existing installation of CE anywhere else on the system can be used too.

Copy the CE installation directory to the Steam title's WINE prefix such as the below example where I copy it to the root, C: cp -rv / /data/steam/steamapps/compatdata/0000000/pfx/drive_c/

Installing CE directly to the prefix

Woes

At this time of writing (28th Nov 2023) running any variation of wine on Archlinux fails to install CE using the official installer. I spent some time troubleshooting this to learn that Lutris does not experience this problem. I disabled all Lutris features and it was still able to install CE to a new prefix of its own just fine. It asn;

You can install CE using Lutris into its own prefix and copy it out from drive_c/Program Files/ of the prefix when the installation is finished and delete the prefix.

Troubleshooting for installing CE with WINE directly.

On my Archlinux desktop here I can't get WINE to install CE to any new prefix no matter what I try. I extended my troubleshooting by trying to install CE 7.5 as its own empty title in Lutris and that worked. But I couldn't get WINE to start the installation even using the same runner and WINEPREFIX that Lutris used (lutris-GE-Proton7-35-x86_64).

It wasn't until I enabled "Disable Lutris Runtime" that Lutris started failing the installation like WINE did.

After some omission testing with the ~/.local/share/lutris/runtime directory I found the Ubuntu-18.04-i686 subdirectory has the libraries that CE's installer cares about. From there I was able to work out the true cause:

CE's installation instantly fails if any of the below Lutris runtime/Ubuntu-18.04-i686/ libraries are removed:

Installation instantly fails if any of the below are removed:

libnettle.so.6 causes the installation to instantly fail.
libunistring.so.2 causes the installation to instantly fail.
libgmp.so.10 causes the installation to instantly fail.
libgnutls.so.30 causes the installation to instantly fail.

The installation window never appears (No language selection screen) if the below are removed:

libfreetype.so.6

The subdirectory has many Linux libraries inside (Particularly Ubuntu's...) and it seems the above are required to make CE's installer exe actually install.

As such, I was finally able to install CE directly into a proton title's pfx directory by including the above libraries in my installation command (This workaround requires Lutris to be installed):

LD_LIBRARY_PATH=~/.local/share/lutris/runtime/Ubuntu-18.04-i686 WINEPREFIX=/data/steam/steamapps/compatdata/0000000/pfx ~/.local/share/Steam/compatibilitytools.d/GE-Proton8-25/files/bin/wine ~/Downloads/CheatEngine75.exe

And after a few hours of troubleshooting.. I can run finally CE alongside a running title without any additional software.

Conclusion & Launching CE

After getting a copy of CE's installation root into the prefix of a Proton-run title one way or another it can be launched by specifying the prefix directory, (Ideally) the same wine binary used to launch the title followed by the path to CE inside.

For the copy method:

WINEFSYNC=1 WINEPREFIX=/data/steam/steamapps/compatdata/0000000/pfx ${HOME}/.local/share/Steam/compatibilitytools.d/GE-Proton8-25/files/bin/wine 'C:\CE\Cheat Engine.exe'

For the Proton installation method:

WINEFSYNC=1 WINEPREFIX=/data/steam/steamapps/compatdata/0000000/pfx ${HOME}/.local/share/Steam/compatibilitytools.d/GE-Proton8-25/files/bin/wine 'C:\Program Files\Cheat Engine 7.5\Cheat Engine.exe'

I will most likely write a wrapper script for this. I can see myself writing a little ./launchGameWithCE %command% wrapper to CE any Steam proton title desired but that will have to wait for another day after how long debugging the library issue for the CE installer took.

[18th Dec 2023 Update] Yep I ended up writing such a wrapper to handle the installation for me automatically on Dec 7th 2023 and it works well!