/SmokeAPI

Legit DLC Unlocker for Steamworks

Primary LanguageC++The UnlicenseUnlicense

๐Ÿจ SmokeAPI โ™จ

Legit DLC Unlocker for Steamworks

u1f428 u2615

โœจ Features

  • ๐Ÿ”“ Legit DLC Unlocking

  • ๐Ÿ›… Inventory emulation

  • ๐Ÿ“ Config-less operation

  • Multiple installation methods:

    • ๐Ÿ›๏ธ Store mode

    • ๐ŸŽฎ Game mode

      • ๐Ÿช Hook mode

      • ๐Ÿ”€ Proxy mode

๐Ÿ“– Introduction

What is SmokeAPI?

SmokeAPI is a DLC unlocker for the games that are legitimately owned in your Steam account. It attempts to spoof games that use Steamworks SDK into believing that you own desired DLCs. However, SmokeAPI does not modify the rest of the Steamworks SDK, hence features like multiplayer, achievements, etc. remain fully functional.

Supported versions

SmokeAPI aims to support all released SteamAPI versions. When it encountered a new, unsupported interface version, it will fall back on the latest supported version. Below is a list of supported interface versions:

  • ISteamClient v6 โ€” v20. (Versions before 6 did not contain any DLC related interfaces)

  • ISteamApps v2 โ€” v8. (Version 1 did not contain any DLC related functions)

  • ISteamUser v12 โ€” v21. (Versions before 12 did not contain any DLC related functions)

  • ISteamInventory v1 โ€” v3.

Steam inventory does not work in all games with steam inventory because of custom implementation, and online checks. A list of games where inventory emulation has been shown to work is as follows:

  • Project Winter

  • Euro Truck Simulator 2

  • Hero Siege (if you bypass EAC)

๐Ÿ›  Installation Instructions

Warning
Please proceed with installation at your own risk. Usage of this unlocker entails breaking one or more terms of service, which might result in a permanent loss of your account.

SmokeAPI supports 2 main modes of installation: Store mode and Game mode, which are described in the next section.

๐Ÿ›๏ธ Store mode

Note
It is worth noting that the following instructions describe a manual installation method. You can benefit from automatic installation and GUI configuration by using Koalageddon v2.

In this installation mode, SmokeAPI is loaded into the Steam process, which makes it able to affect all Steam games.

  1. Download the latest Koaloader release zip from Koaloader Releases.

  2. From Koaloader archive unpack version.dll from version-32, and place it in the Steam directory[1].

  3. In the Steam directory[1] create the following Koaloader configuration file:

    Koaloader.config.json
    {
      "auto_load": false,
      "targets": [
        "Steam.exe"
      ],
      "modules": [
        {
          "path": "SmokeAPI.dll",
          "required": true
        }
      ]
    }
  4. Download the latest SmokeAPI release zip from SmokeAPI Releases.

  5. From SmokeAPI archive unpack steam_api.dll, rename it to SmokeAPI.dll, and place it in the Steam directory[1].

๐ŸŽฎ Game mode

In this installation mode, SmokeAPI is loaded into a game process, which limits it to that particular game only. This mode itself supports 2 modes: hook mode and proxy mode. Try installing the unlocker in hook mode first. If it doesnโ€™t work, try installing it in proxy mode.

๐Ÿช Hook mode

  1. Download the latest Koaloader release zip from Koaloader Releases.

  2. From Koaloader archive unpack version.dll from version-32/64, depending on the game bitness, and place it next to the game exe file.

  3. Download the latest SmokeAPI release zip from SmokeAPI Releases.

  4. From SmokeAPI archive unpack steam_api.dll/steam_api64.dll, depending on the game bitness, rename it to SmokeAPI.dll, and place it next to the game exe file.

๐Ÿ”€ Proxy mode

  1. Find steam_api.dll / steam_api64.dll file in game directory, and rename it to steam_api_o.dll / steam_api64_o.dll.

  2. Download the latest SmokeAPI release zip from SmokeAPI Releases.

  3. From SmokeAPI archive unpack steam_api.dll/steam_api64.dll, depending on the game bitness, and place it next to the original steam_api DLL file.

If the unlocker is not working as expected, then please fully read the Generic Unlocker Installation Instructions before seeking support in the SmokeAPI forum topic.

โš™ Configuration

Note
This document describes configuration for version 2 of SmokeAPI. You can find the version 1 documentation here.

SmokeAPI does not require any manual configuration. By default, it uses the most reasonable options and tries to unlock all DLCs that it can. However, there might be circumstances in which you need more custom-tailored behaviour, such as disabling certain DLCs, or selectively enabling just a few of them. In this case you can use a configuration file SmokeAPI.config.json that you can find here in this repository or in the release zip. To use it, simply place it next to the SmokeAPI DLL. It will be read upon each launch of a game or the store. In the absence of the config file, default values specified below will be used. The configuration file is expected to conform to the Json standard.

logging

Toggles generation of a SmokeAPI.log.log file.

Type

Boolean

Default

false

unlock_family_sharing

Store mode only. Toggles Family Sharing bypass, which enables the borrower of a shared library to start and continue playing games when library owner is playing as well.

Type

Boolean

Default

true

default_app_status

This option sets the default DLC unlocking behaviour.

Possible values
original

Leaves DLC unlock status unmodified, unless specified otherwise.

unlocked

Unlocks all DLCs in all games, unless specified otherwise.

Type

String

Default

unlocked

override_app_status

This option overrides the status of all DLCs that belong to a specified app ID[2].

Possible values

An object with key-value pairs, where the key corresponds to the app ID, and value to the app status. Possible app status values are defined in the default_app_status option.

Type

Object

Default

{}

override_dlc_status

This option overrides the status of individual DLCs, regardless of the corresponding app status.

Possible values

An object with key-value pairs, where the key corresponds to the app ID, and value to the app status. Possible app status values are defined in the default_app_status option. Furthermore, it is possible to lock even the legitimately locked DLCs by setting the corresponding app status value to locked.

Type

Object

Default

{}

auto_inject_inventory

Toggles whether SmokeAPI should automatically inject a list of all registered inventory items, when a game queries user inventory

Type

Boolean

Default

true

extra_inventory_items

A list of inventory items IDs[2] that will be added in addition to the automatically injected items.

Type

Array (of Integers)

Default

[]

Advanced options

$version

A technical field reserved for use by tools like GUI config editors. Do not modify this value.

Type

Integer

Default

2

extra_dlcs

See How SmokeAPI works in games with large number of DLCs to understand the use case for this option.

Possible values

An object with key-value pairs, where the key corresponds to the app ID, and value to the object that contains DLC IDs. The format is the same as in the aforementioned GitHub config.

Type

Object

Default

{}

store_config

Store mode only. An object that specifies offsets required for store mode operation. It will override the config fetched from remote source or local cache. Do not modify this value unless you know what you are doing.

Type

Object

Default

See online config

Complete example
{
  "$version": 2,
  "logging": true,
  "unlock_family_sharing": true,
  "default_app_status": "unlocked",
  "override_app_status": {
    "1234": "original",
    "4321": "unlocked"
  },
  "override_dlc_status": {
    "1234": "original",
    "4321": "unlocked",
    "5678": "locked"
  },
  "auto_inject_inventory": true,
  "extra_inventory_items": [],
  "extra_dlcs": {
    "1234": {
      "dlcs": {
        "56789": "Example DLC 1"
      }
    },
    "4321": {
      "dlcs": {
        "98765": "Example DLC 2",
        "98766": "Example DLC 3"
      }
    }
  },
  "store_config": {
      "client_engine_steam_client_internal_ordinal": 12,
      "steam_client_internal_interface_selector_ordinal": 18,
      "vstdlib_callback_address_offset": 20,
      "vstdlib_callback_data_offset": 0,
      "vstdlib_callback_interceptor_address_offset": 1,
      "vstdlib_callback_name_offset": 4
  }
}

Extra info

How SmokeAPI works in games with large number of DLCs

Some games that have a large number of DLCs begin ownership verification by querying the Steamworks API for a list of all available DLCs. Once the game receives the list, it will go over each item and check the ownership. The issue arises from the fact that response from Steamworks SDK may max out at 64, depending on how much unowned DLCs the user has. To alleviate this issue, SmokeAPI will make a web request to Steam API for a full list of DLCs, which works well most of the time. Unfortunately, even the web API does not solve all of our problems, because it will only return DLCs that are available in Steam store. This means that DLCs without a dedicated store offer, such as pre-order DLCs will be left out. Thatโ€™s where the extra_dlcs config option comes into play. You can specify those missing DLC IDs there, and SmokeAPI will make them available to the game. However, this introduces the need for manual configuration, which goes against the ideals of this project. To remedy this issue SmokeAPI will also fetch a manually maintained list of extra DLCs stored in a GitHub repository. The purpose of this document is to contain all the DLC IDs that are lacking a Steam store page. This enables SmokeAPI to unlock all DLCs without any config file at all. Feel free to report in the SmokeAPI forum topic games that have more than 64 DLCs, and have DLCs without a dedicated store page. They will be added to the list of missing DLC IDs to facilitate config-less operation.

๐Ÿ—๏ธ Building from source

๐Ÿšฆ Requirements

  • CMake v3.24 (Make sure that cmake is available from powershell)

  • Visual Studio 2022[3].

  • Tested on Windows 11 SDK (10.0.22621.0)[3].

๐Ÿ‘จโ€๐Ÿ’ป Commands

Build the project

.\build.ps1 <arch> <config>

where

arch

32 or 64

config

Debug or Release

For example:

.\build.ps1 32 Debug

๐Ÿ“š Open-Source libraries

This project makes use of the open source projects specified in the KoalaBox Readme

๐Ÿ“„ License

This software is licensed under the Unlicense, terms of which are available in UNLICENSE.txt


1. The root directory where Steam is installed
2. App/DLC IDs can be obtained from https://steamdb.info. Keep in mind that you need to be signed in with a steam account in order to see accurate inventory item IDs on that website.
3. Older versions may be supported as well.