Clicker Heroes 1 comes with an export feature which provides the player with a base64 encoded save.
This one can be abused to tweak its values and grant the player an advantage.
This repo has a python script that facilitates the auditing process of this game, taking the user's base64 encoded save file, modifying it at will and generating a new file which the player can then import to their game.
My intentions do not lie upon destroying or causing harm of any kind to the studio who developed the game, Playsaurus.
Several other tools have been deployed and are scattered all over the web already.
The topic about hacking has already been talked about numerous times on their community.
The devs themselves released a statement addressing the situation on their blog in a post on why Clicker Heroes 2 (their new game which you should definitely check out) saying that:
Games are inherently addictive [...]. We found that some number of players spent many thousands of dollars on rubies.
We really don't like making money off players who are in denial of their addiction, and that's what a large part of free-to-play gaming is all about.
[...]
That said, we're not going to change how we monetize Clicker Heroes 1. It would destroy our studio if we did.
So just to reiterate, my intentions do not lie upon harming, but rather learning, as I am a cybersecurity student looking for a deeper understanding of machines and improving my coding skills in the process.
The only used modules are argparse, base64 and zlib, which are already included in The Python Standard Library.
See argparse, base64 and zlib.
This means that an installation process is not necessary.
The player is required to give as input a base64 encoded save file and can choose from the available options. The file extension is irrelevant as long as the file contains base64.
It is not obligatory to use all flags, they're all optional. You can see some examples on how to use this tool in the examples section.
Upon specifying a flag, the user can then set the amount of said value.
Also, the program comes with a help menu:
usage: main.py [-h] [-g gold amount] [-r rubies amount] [-s souls amount] [-o filename] [--stdin] save
positional arguments:
save The path to your exported Base64 game save file
optional arguments:
-h, --help show this help message and exit
-g gold amount specifies a new amount of gold
-r rubies amount specifies a new amount of rubies
-s souls amount specifies a new amount of hero souls
-o filename Output result to a file instead of the screen
--stdin Takes base64 input from stdin instead of a file
There are 2 ways of providing input, either specifying the filename containing the base64 (default option) or directly pasting it in the command if the --stdin
flag is used.
There are also 2 ways of displaying output, either printing it to the screen (default option) or writing it to a file if the -o
flag is used.
IMPORTANT: Make sure you save your current game somewhere safe before trying this demo. This demo is a fresh, newly started game with pumped values.
Here you can find a save file that contains a normal, new save file with 1,207 gold, 0 rubies and 0 hero souls. (You can try importing it to confirm, just please make sure you back up your own game first!).
Run the following command:
python main.py -g 12345 -r 67890 -s 12345 save.b64
That will print a base64 save to the screen. Copy it and import it and see the amount of gold, rubies and souls change. Play around with the values and see what happens.
- Miscelaneous & Quick Reference
-
Check help menu
python main.py -h
python main.py --help
-
Add gold, rubies and souls reading export from file and print to screen
python main.py -g GOLD -r RUBIES -s SOULS <filename>
-
Add gold, rubies and souls reading export from file and writing output to a file
python main.py -g GOLD -r RUBIES -s SOULS <input filename> -o <output filename>
-
Add gold, rubies and souls reading from STDIN and printing the result to the screen
python main.py -g GOLD -r RUBIES -s SOULS --stdin <your very long base64>
-
Add gold, rubies and souls reading from STDIN and writing the result to a file
python main.py -g GOLD -r RUBIES -s SOULS --stdin <your very long base64> -o <output filename>
-
As stated before, flags are optional, which means you are not forced to use them all. You can make combinations, or even use them alone:
-
Add only gold
python main.py -g GOLD mySave.b64
-
Add only rubies
python main.py -r RUBIES mySave.b64
-
Add only hero souls
python main.py -s SOULS mySave.b64
-
Add gold and rubies
python main.py -g GOLD -r RUBIES --stdin SWYgeW91J3JlIHJlYWRpbmcgdGhpcywgaGF2ZSBhIG5pY2UgZGF5IDwzCg==
And so on and so forth.
It's also worth noticing that order is completely irrelevant.
This project is open to pull requests. They're greatly appreciated 💜.
For suggestions on changes or additions, please open an issue describing with as much detail your thoughts.
Same thing goes with bugs and major mistakes (Thanks~).