yo1dog How do I cheat? Reputation: 0
Joined: 17 Sep 2017 Posts: 1 Location: Austin, Texas
|
Posted: Mon Sep 18, 2017 6:20 pm Post subject: Steam Client Hacking (not for free games) |
|
|
TL;DR
Let's say a program shows the names of a list of people. First and last names are stored individually. The list has a variable length and is loaded into memory dynamically from a local file. I want to change the first names of John Doe and John Smith to "Johnny" and "Joey" respectively.
How can I find the addresses of Doe's and Smith's first names?
I am not sure what specific information would be useful to post. Let me know and I'll post it.
Objective
I want to rename/reorder some of the games on my Steam game list. Example:
Code: |
Before | After
--------------------------------------------|--------------------------------
Grand Theft Auto III | Grand Theft Auto III
Grand Theft Auto IV | Grand Theft Auto: Vice City
Grand Theft Auto V | Grand Theft Auto: San Andreas
Grand Theft Auto: San Andreas | Grand Theft Auto IV
Grand Theft Auto: Vice City | Grand Theft Auto V
Resident Evil / biohazard HD REMASTER | Resident Evil HD Remaster
Resident Evil 0 / biohazard 0 HD REMASTER | Resident Evil 0 HD Remaster
resident evil 4 / biohazard 4 | Resident Evil 4
Resident Evil 6 / Biohazard 6 | Resident Evil 6
|
Attempted Solutions
(See bottom of post for Non-Cheat Engine attempted solutions).
The first thing I did was search for and replace the display name (ex: "resident evil 4 / biohazard 4" string with "Resident Evil 4"). That worked for the display name, but sorting is tricky. I found that games have both a display name and a "sort as" string. For example, "X-COM: UFO Defense" and "X-COM: Terror from the Deep" define "X-COM 1: UFO Defense" and "X-COM 2: Terror from the Deep" as the "sort as" string so they appear in chronological order. If no "sort as" string is defined then the game's display name is used. Also, Steam will remove "The " and "A " from the start of the "sort as" strings (ex: "The Walking Dead" -> "Walking Dead").
Searching and replacing still works if display name and "sort as" string should have same value. It also works if the display name and "sort as" string have different initial values as you can search for and replace them individually. But if that's not the case then you can't blindly search for and replace strings. For example, lets say I wanted to rename "Fubar Game®: The 3rd One™" to "Fubar Game: The 3rd One" and sort it as "Fubar Game 3". Let's assume that the game does not define a "sort as" string, so the display name and the "sort as" are exactly the same. I need to be able to differentiate between the address that holds the display name and the address that holds the "sort as" string so I can replace them with different values.
I am able to do so by searching for the string(s), changing the values of each result address, and observing changes to Steam's UI. If I update an address and the game's name in the list changes, that's the display name address; If the game's sort order changes, that's the "sort as" address.
After I found the addresses, I tried to follow the pointers to a static memory address with little success. Most often I could not reach static memory as I would get stuck 6-7 levels up (no pointer exists with suggested address). One time I did reach a pointer in static memory but after I restarted Steam (on the same PC), the pointer at the static address pointed to something completely different. I assume these problems are due to the data being dynamically loaded from the disk and/or network.
So, How can I reliably find the addresses of the display name and "sort as" string for games?
Non-Cheat Engine Attempted Solutions
Before I even found CheatEngine I attempted to modify the data on the way into the Steam client. First, I followed this suggestion from 2015 that you can modify $STEAM_INSTALL_DIR/appcache/appinfo.vdf where it seems that data for all the games in my library are stored. However, this does not work anymore. If the file is changed it is deleted and recreated when Steam starts and the additional loading messages "Updating Steam Information..." and "Updating User Configuration..." are shown. I also see this in $STEAM_INSTALL_DIR/logs/appinfo_log.txt:
Code: |
Corrupt data in binary buffer for app 231160, CLN 3371323,
ProductInfoChanges: change number 3418790->3418809, apps: 1/15, packages: 0/3
UpdatesJob: requesting 512 apps, 0 packages (meta data, 1024 prev attempts)
UpdatesJob: requested 111 access tokens, 107 received, 4 denied
UpdatesJob: updated SHAs with 107 new access tokens
UpdatesJob: downloaded 35 apps via HTTP, 578 KB (160 KB compressed)
UpdatesJob: requesting 474 apps, 0 packages (full data, 1024 prev attempts)
UpdatesJob: finished OK, nAppsUpdated 509 (1698 KB), nPackagesUpdated 0 (0 KB)
Starting async write C:\Program Files (x86)\Steam/appcache/appinfo.vdf (3035080 bytes)
|
Using Fiddler, I can see those 35 HTTP requests to URLs like: clientconfig.akamai.steamstatic com/appinfo/240/sha/3b6bd289807a7e320301662f8df55732f79ad881.txt.gz each of which return data for a single game in a structure that matches the ones in appinfo.vdf. I completely deleted appinfo.vdf and started Steam and I saw similar log messages with "downloaded 66 apps via HTTP". Again I saw those 66 HTTP requests in Fiddler. However, I have 481 games in my library. I am not sure where the data for the other 415 games is coming from. For Example, I could not find any HTTP traffic that contained the string "Grand Theft Auto".
Anyway, I gave up that solution and started looking for ways to modify the program itself which led me to Cheat Engine.
|
|