Identifying Your Halo Infinite Build GUID
Back in June I wrote about a little process that I put together to aggregate Halo Infinite stats in the cloud. As part of this process, I am running a tool I built called Composer that pulls information about matches, ranks, medals, and stats that are embedded directly into build metadata. To do that, I run a command like this:
dotnet Den.Dev.Orion.Composer.dll get buildstats
--build-id '70f9339184764222b79125cf4f244c2b'
--domain /$AZ_BATCH_TASK_WORKING_DIR/playstore.db
What this does is send a request to the build metadata endpoint to get the information about all the game, engine, and map variants available in the build, or, as otherwise known:
https://discovery-infiniteugc.svc.halowaypoint.com
/hi
/manifests
/guids
/70f9339184764222b79125cf4f244c2b
/game
This is one of the requests that is usually sent the first time you launch an updated build, after which it is cached and pulled from disk. You can easily spot it with a tool like Fiddler:
Erm... Wait a second. So the build identifier is a GUID and not a typical semantic versioning string? I thought I saw the build version when Halo Infinite launches - it's right there in the bottom right corner!
Indeed it is! The game has a build ID that is shown when you start it:
Sending a GET
request to the endpoint above with proper tokens will return a bunch of data, that also includes build metadata, including the “readable” build number:
"CustomData": {
"BranchName": "HI_1_5_1",
"BuildNumber": "6.10025.12948",
"Kind": 1,
"ContentVersion": "",
"BuildGuid": "70f93391-8476-4222-b791-25cf4f244c2b",
"Visibility": 0
}
When requesting the data, the build GUID can be used with (like BuildGuid above) or without hyphens (like in the request example). The output will be identical.
However, this identifier is not really used for the manifest request. A fun fact is that at some point in the past one could, in fact, obtain the game manifest through the build ID, like this:
https://discovery-infiniteugc.svc.halowaypoint.com
/hi
/manifests
/builds
/6.10025.12948
/game
That capability has since gone away and a GUID is the only public way of getting the build metadata. The build GUID is completely detached from the semantic version - it’s an opaque value that is assigned by the developers and you can’t “transform” it to the readable build ID or back. Here is a historical snapshot of builds since May 2023 that I captured through my data aggregator to prove this point:
Build Number | Build GUID |
---|---|
6.10024.10518 | 22727c81-2415-4095-827d-a4d2fe27b51b |
6.10024.11251 | eb24d936-4138-4c3d-8e77-a801baf5a242 |
6.10024.11943 | c9c1cc92-e295-4c5a-9434-42c3d9df8829 |
6.10024.13134 | e8e0ff34-f783-4dca-8304-7e00fc505df4 |
6.10024.15436 | 1bb8f58e-c3b1-4a1e-8f7f-db9244269443 |
6.10024.17792 | 0e54eda5-e3b3-4ebd-807c-4e46c4f48fc5 |
6.10025.10367 | 125eafb5-5cf7-4cc5-82c3-7c2990f2c716 |
6.10025.11703 | 691f0016-9639-4261-b576-a8139216fa84 |
6.10025.12948 | 70f93391-8476-4222-b791-25cf4f244c2b |
So, long story longer - for me to be able to constantly update the data I need to get the build GUID. So, process is simple, right? Fire up Fiddler, set up the proxy for WinHTTP to actually pipe everything through Fiddler, then launch Halo Infinite and monitor for /game
requests. Not the worst flow, but also quite cumbersome. Can I do this better? Surely, the build GUID is embedded somewhere locally.
To do this, we can use a tool built for this exact purpose - strings
. We will use it to peek inside binary files to see if there is anything anywhere that can point us to the build GUID.
On Windows, through Steam, Halo Infinite game files are located in:
C:\Program Files (x86)\Steam\steamapps\common\Halo Infinite
Before we go on a GUID fishing expedition, is it possible that the HaloInfinite.exe
launcher contains the build GUID in the executable details?
It does not. Away we go into the Terminal, and running the following command within the Halo Infinite installation folder:
strings.exe -n 8 -s | findstr /i 70f93391
Because we already know the build GUID (from current build), we can start looking for the specific character sequence across all files. And because I don’t know whether hyphens are used or not inside the various files that might exist here I limit myself to the first 8 hexadecimal digits of the GUID - I limit strings
to 8 characters via -n 8
, request it to recurse all folders in the current directory with -s
, and then passing the output to the Windows findstr
command that is looking for the first chunk of the build GUID. Piece of cake - now we just wait for the search to conclude.
As it turns out, the file we’re looking for is here:
C:\Program Files (x86)\Steam\steamapps\common\Halo Infinite\
package\pc\en-US\other\CacheMap.wcache
The string we’re seeing there is:
https://discovery-infiniteugc-intone.test.svc.halowaypoint.com
/hi343
/manifests
/guids
/70f9339184764222b79125cf4f244c2b
/game
Bingo! It’s a test endpoint, but nonetheless - we now have the build GUID. If we open the file in a HEX editor, we can also easily spot the build ID - we can look for the GUID directly or we can look for /manifests/guids/
.
From now on, I can easily get the build GUID even if I missed capturing it through Fiddler. That also means that I can now write a one-liner to extract the GUID from the file (when copying and pasting you can consolidate the snippet below into one line):
Select-String -Pattern "\/manifests\/guids\/([0-9a-fA-F]+)\/game"
-Path ".\CacheMap.wcache"
| Select Matches
| Foreach-Object {$_.Matches}
| Foreach-Object {$_.Groups[1].Value}
The data collection script can now live on with minimal friction of getting the build GUIDs with every new Halo Infinite release.