We're going to be running a modified version of Android (LineageOS, formerly known as CyanogenMod) as a virtual machine in VirtualBox. Then we'll transfer the MFA setup over to ArchiSteamFarm so we can have instant trades and benefit from its Steam Trade Matcher feature.
This is well outside the scope of what we're talking about here; if you need help with this, check out the VirtualBox documentation.
Go to http://www.android-x86.org/download and get the latest version of CM-x86
(“CM” is short for “CyanogenMod”, which was the former name of LineageOS). You specifically want LineageOS instead of stock Android because it doesn't require you to sign up for a Google account (you still _can_ if you want, but stock Android _forces_ you to). As of this writing, the newest download was CM-x86 14.1
so that's what I used, but any version should work; all that matters is that it runs the Steam app.
TLDR: Standard VirtualBox install process using the recommended 2G RAM and 8G disk, and changing the audio controller to “Intel HD Audio”.
I pulled up the instructions at http://www.android-x86.org/documents/virtualboxhowto but ultimately there wasn't anything unusual about the setup. I haven't spent any real time looking at resource usage to figure out what the optimal amount of RAM and hard disk allocations would be, but here's the output from my current install (brand new except for following these steps):
android_x86_64:/ $ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 999M 4.4M 995M 1% / /dev/loop1 1.3G 1.3G 66M 96% /system /dev/block/sda1 7.7G 1.8G 5.9G 24% /data tmpfs 999M 420K 999M 1% /dev tmpfs 999M 0 999M 0% /mnt none 999M 0 999M 0% /cache tmpfs 999M 0 999M 0% /storage /data/media 7.7G 1.8G 5.9G 24% /storage/emulated tmpfs 999M 0 999M 0% /storage/self android_x86_64:/ $ free -h total used free shared buffers Mem: 1.9G 1.8G 59M 41M 108M -/+ buffers/cache: 1.7G 167M Swap: 0 0 0
Based on the above, I'd say anecdotally that their recommendation of 2048 MB of RAM is just right, but leaving the virtual disk size as 8.00 GB is a bit of a waste for our purposes; if you look at the output of mount
you can see that the only real filesystems (setting aside stuff like tmpfs, configfs, etc.) are /system
and /data
which are ext4:
android_x86_64:/ $ df -h -t ext4 Filesystem Size Used Avail Use% Mounted on /dev/loop1 1.3G 1.3G 66M 96% /system /dev/block/sda1 7.7G 1.8G 5.9G 24% /data
So, we're looking at a total disk usage of about 3.1 GiB (for what it's worth, this is after installing the Steam APK).
Having said that, if you're planning on using this install as a general-purpose Android environment for other things, or if you just don't want to think/worry about optimizing and you can spare the extra disk space.
Other than that, the only tweak I made based on the instructions was to change the audio controller to “Intel HD Audio”. I didn't try with the default setting; that might have worked as well. This really only matters if you care about hearing the Steam app's alert notification sounds.
Download the Steam APK: https://support.steampowered.com/kb_article.php?ref=4440-RTUI-9218 Direct download link as of this writing: http://media.steampowered.com/apps/steam-android/steam-2.3.1.apk
Settings > Personal > Security > Unknown sources
Open the file manager and move the APK from the Downloads folder to the Documents folder (the OS won't let you install an APK from the Downloads folder); double-click the APK to install it.
Hamburger > Steam Guard
Disposable/anonymous SMS receiving services:
Should probably pick a number in the same country as your Steam account, but who knows if it matters…
Put on your hyper-diligence hats, 'cause this is where slow and steady wins the race. If you've got a way to actually transfer files in and out of your Android environment (using adb, for example), great…but if not, get ready for some eye-bleeding re-typing. Hit Alt-F1 to go to the virtual console where a root shell is waiting for you; you can use the GUI terminal app if you like, but its font is crap for character differentiation (zero vs uppercase O, one vs lowercase l vs uppercase I, etc.).
Here's one trick to test your interpretation. Using a shell function seems silly, but the way the shell is set up in that virtual console, it's a visual disaster if you're working in a directory with a long path or typing anything long on the command line. Normally you'd take the time to fix it, but we're only gonna be doing this one thing at the command line.
# ts() { grep --color=always "${1}" /data/data/com.valvesoftware.android.steam.community/files/Steamguard-xxxxxxx; } # ts 'test-string-goes-here'
The idea is that you can type what you think the password is, and if grep finds it in the file and it shows up red in the output, you know you've got it right.
# cat /data/data/com.valvesoftware.android.steam.community/shared_prefs/steam.uuid.xml # for file in /data/data/com.valvesoftware.android.steam.community/files/Steamguard-*; do echo "===== ${file} ====="; cat ${file}; echo; done
The contents of steam.uuid.xml
should look like this (treat this uuidKey
value as you would your password):
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="uuidKey">android:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</string> </map>
The contents of the Steamguard-*
files should look like this:
{"steamid":"00000000000000000","shared_secret":"XXXXXXXXXXXXXXXXXXXXXXXXXXX=","serial_number":"0000000000000000000","revocation_code":"XXXXXX","uri":"otpauth:\/\/totp\/Steam:XXXX?secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&issuer=Steam","server_time":"0000000000","account_name":"XXXXX","token_gid":"xxxxxxxxxxxxxxxx","identity_secret":"XXXXXXXXXXXXXXXXXXXXXXXXXXX=","secret_1":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=","status":1,"steamguard_scheme":"2"}
If you've copied it correctly, it should pass JSON validation; for instance, jq < Steamguard-STEAMID
should produce output like this:
{ "steamid": "00000000000000000", "shared_secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXX=", "serial_number": "0000000000000000000", "revocation_code": "XXXXXX", "uri": "otpauth://totp/Steam:XXXX?secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&issuer=Steam", "server_time": "0000000000", "account_name": "XXXXX", "token_gid": "xxxxxxxxxxxxxxxx", "identity_secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXX=", "secret_1": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=", "status": 1, "steamguard_scheme": "2" }
https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Two-factor-authentication