[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1826":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},1826,"OpenSteamTool","OpenSteam001\u002FOpenSteamTool","OpenSteam001","Open Source Steam Unlocker",null,"C++",904,145,13,16,0,102,146,571,306,10.49,"GNU General Public License v3.0",false,"main",true,[],"2026-06-12 02:00:33","# OpenSteamTool\r\n\r\n![cpp](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcpp-20%2B-green?logo=cplusplus)\r\n![CMake](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCMake-3.20%2B-green?logo=cmake)\r\n![OnlyWindows](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fwindows%20only-red?style=for-the-badge)\r\n\r\n[![Ask DeepWiki](https:\u002F\u002Fdeepwiki.com\u002Fbadge.svg)](https:\u002F\u002Fdeepwiki.com\u002FOpenSteam001\u002FOpenSteamTool)\r\n\r\nOpenSteamTool is a Windows DLL project built with CMake.\r\n\r\n## Feature\r\n\r\n### Core Unlocks\r\n- Unlock an unlimited number of unowned games.\r\n- Unlock all DLCs for unowned games.\r\n- Support auto load depot decryption keys from Lua config.\r\n- Support auto manifest download via `steamrun` \u002F `wudrm` upstream APIs(default is `wudrm`), or a custom Lua endpoint (see [Manifest via Lua](#manifest-via-lua)).\r\n- Support downloading protected games or DLCs that require an access token.\r\n- Support binding manifest to prevent specific games from being updated.\r\n\r\n### Hot Reload\r\n- Adding, modifying, deleting, or overwriting `.lua` files in any watched directory automatically triggers a reload. No restart, no offline\u002Fonline toggle needed.\r\n\r\n### Family Sharing and Remote Play\r\n- Bypass Steam Family Sharing restrictions, allowing shared games to be played without limitations.\r\n\r\n### Compatible with games protected by Denuvo and SteamStub\r\n- For AppTicket and ETicket: in `HKEY_CURRENT_USER\\Software\\Valve\\Steam\\Apps\\{AppId}`, both `AppTicket` and `ETicket` are `REG_BINARY` values.\r\n- Use `setAppTicket(appid, \"hex\")` and `setETicket(appid, \"hex\")` in Lua config to write these values to the registry automatically.\r\n- SteamID priority: read `SteamID` as `REG_SZ` (numeric-only) first; if missing, parse from `AppTicket`.\r\n\r\n### Stats and Achievements\r\n- Enable stats and achievements for unowned games.\r\n- Uses `setStat(appid, \"steamid\")` to configure which SteamID's achievement data to pull.\r\n- If no `setStat` is configured for an app, falls back to the hardcoded default SteamID `76561198028121353`.\r\n\r\n### Online Fix\r\n- Add `-onlinefix` to the Steam launch parameters to enable 480-based online play in games that use lobby matchmaking. The current limitation is that only one such game can run at a time.To revert, simply remove -onlinefix from the launch parameters — online play returns to normal on the next launch.\r\n\r\n## Future\r\n- For games protected by Denuvo and SteamStub, find a safe timing to switch `GetSteamID` (see `src\u002FHook\u002FHooks_IPC.cpp#Handler_IClientUser_GetSteamID` TODO) so save files are not affected.(**Suggestions welcome — when is the earliest point after game initialization that we can safely switch the\r\n  SteamID without affecting save file binding?**)\r\n- Steam Cloud synchronization support.(This is a huge project)\r\n- Add Auto Denuvo Authorization Sharing for Legitimate Accounts.\r\n\r\n## Usage\r\n1. Run `build.bat` from the project root to build the project.\r\n2. Copy generated `dwmapi.dll`, `xinput1_4.dll` and `OpenSteamTool.dll` to the Steam root directory.\r\n3. Create Lua directory (for example `C:\\steam\\config\\lua`) and place Lua scripts there. The DLL will automatically load and execute them.\r\n4. Lua example:\r\n```lua\r\naddappid(1361510) -- unlock game with appid 1361510\r\n\r\naddappid(1361511, 0,\"5954562e7f5260400040a818bc29b60b335bb690066ff767e20d145a3b6b4af0\") -- unlock game with appid 1361511 depotKey is \"5954562e7f5260400040a818bc29b60b335bb690066ff767e20d145a3b6b4af0\" \r\n\r\naddtoken(1361510,\"2764735786934684318\") -- add access token (\"2764735786934684318\") for game with appid 1361510 \r\n-- No Longer Supported:\r\n--pinApp(1361510) -- pin game with appid 1361510 to prevent it from being updated\r\n\r\nsetManifestid(1361511,\"5656605350306673283\") -- pin depotid:1361511 manifest_gid:5656605350306673283, size defaults to 0\r\nsetManifestid(1361511,\"5656605350306673283\", 12345678) -- same but with explicit size\r\n\r\nsetAppTicket(1361510,\"0100000000000000...\") -- write AppTicket (REG_BINARY) to HKCU\\Software\\Valve\\Steam\\Apps\\1361510\\AppTicket\r\n\r\nsetETicket(1361510,\"0100000000000000...\") -- write ETicket (REG_BINARY) to HKCU\\Software\\Valve\\Steam\\Apps\\1361510\\ETicket\r\n\r\nsetStat(1361510, \"76561197960287930\") -- use the specified SteamID's achievement data for appid 1361510\r\n-- If not configured, default SteamID 76561198028121353 is used.\r\n```\r\n\r\nAll function names are **case-insensitive**. `setAppTicket`, `setappticket`, `SetAppticket`, `SETAPPTICKET` etc. are all equivalent. The same applies to every registered function (`addAppId`, `AddToken`, `SETManifestid`, etc.).\r\n\r\n### Configuration (optional)\r\n\r\nRename `opensteamtool.example.toml` to `opensteamtool.toml` and place it in the Steam root directory (next to `steam.exe`).\r\nIf no config file is found, built-in defaults are used — no auto-creation.\r\n\r\n```toml\r\n[log]\r\n# Debug build only.  Level: trace, debug, info, warn, error\r\nlevel = \"info\"\r\n\r\n[manifest]\r\n# Upstream API for depot manifest request codes.  Options: \"steamrun\", \"wudrm\"\r\nurl = \"steamrun\"\r\n\r\n# HTTP timeouts for manifest requests (milliseconds)\r\ntimeout_resolve_ms = 5000\r\ntimeout_connect_ms = 5000\r\ntimeout_send_ms    = 10000\r\ntimeout_recv_ms    = 10000\r\n\r\n# Additional Lua config directories (optional).\r\n# Files are loaded after the default \u003CSteam>\u002Fconfig\u002Flua folder.\r\n# The default folder is always loaded last so user files take priority.\r\n[lua]\r\npaths = []\r\n\r\n# Optional signature-file mirror. See \"Steam version compatibility\" below.\r\n# Leave commented out for the built-in default (raw.githubusercontent.com).\r\n[pattern]\r\n# mirror = \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FOpenSteam001\u002Fsteam-monitor@pattern\"\r\n```\r\n\r\n### Manifest via Lua\r\n\r\nTwo manifest code functions are supported:\r\n\r\n#### `fetch_manifest_code(gid)`\r\n\r\nBasic function that receives only the manifest GID.\r\n\r\n#### `fetch_manifest_code_ex(app_id, depot_id, gid)` *(recommended)*\r\n\r\nExtended function that receives `app_id`, `depot_id`, and `gid`. Allows constructing API endpoints that require app identification.\r\n\r\nThe C++ runtime provides two Lua helpers:\r\n\r\n| Function | Signature | Returns |\r\n|----------|-----------|---------|\r\n| `http_get`  | `http_get(url [, headers])`       | `body, status_code` |\r\n| `http_post` | `http_post(url, body [, headers])` | `body, status_code` |\r\n\r\n`headers` is an optional table: `{[\"Key\"]=\"Value\", ...}`.\r\n\r\n### Steam version compatibility\r\n\r\nOpenSteamTool no longer ships byte-pattern signatures inside the DLL. Instead, on each launch it computes the SHA-256 of `steamclient64.dll` and `steamui.dll` on disk and looks up a matching pattern file from the upstream tracker at [`OpenSteam001\u002Fsteam-monitor`](https:\u002F\u002Fgithub.com\u002FOpenSteam001\u002Fsteam-monitor) (`pattern` branch).\r\n\r\nLookup order (every launch):\r\n\r\n1. **GitHub raw** — `https:\u002F\u002Fraw.githubusercontent.com\u002FOpenSteam001\u002Fsteam-monitor\u002Fpattern\u002F...`. Canonical source.\r\n2. **jsDelivr CDN** — automatic fallback if GitHub raw is unreachable (connection refused \u002F timeout \u002F 5xx). No configuration required. Useful in regions where `raw.githubusercontent.com` is blocked but jsDelivr is reachable (e.g. mainland China).\r\n3. **Local cache** — `\u003CSteam>\\opensteamtool\\pattern\\\u003Csubdir>\\\u003Csha256>.toml`. Used **only** when remote is unreachable. The cache is overwritten after every successful remote fetch.\r\n\r\nRemote is consulted on every launch so users automatically pick up upstream re-publications (e.g. the bot adding a new signature, or fixing an existing one) without having to clear any cache.\r\n\r\nIf a step returns **HTTP 404** the mirror loop stops immediately — all mirrors serve the same content, so a 404 means the upstream bot has not yet published a TOML for this Steam build. The code then falls back to the local cache if one exists; otherwise a one-shot popup appears with the unmatched DLL name, its SHA-256, the expected cache path, and the upstream URL. Only the hooks tied to that DLL are disabled — the rest of OpenSteamTool keeps working.\r\n\r\nYou can also drop a pattern TOML into the cache directory manually if you know the layout for a given build; the file name must be `\u003Csha256>.toml`. The cache fallback will pick it up the next time remote is unreachable.\r\n\r\n> A short outbound HTTPS request is performed at every launch (one per DLL: `steamclient64.dll`, `steamui.dll`). The downloaded bodies are tiny (~10 KB each) and the work runs on a worker thread, so it never blocks Steam's loader.\r\n\r\n#### Using a different mirror\r\n\r\nFor most users, the built-in **GitHub → jsDelivr** automatic fallback is enough; you do not need to touch `opensteamtool.toml` at all.\r\n\r\nIf you want to force a specific source (private mirror, intranet server, or a CDN that's faster on your network than the defaults), set it explicitly in `opensteamtool.toml`. **Setting `mirror` disables the automatic GitHub→jsDelivr fallback** — only the URL you specify is tried, on the principle that an explicit user choice should win.\r\n\r\n```toml\r\n[pattern]\r\n# Default if unset:\r\n#   https:\u002F\u002Fraw.githubusercontent.com\u002FOpenSteam001\u002Fsteam-monitor\u002Fpattern\r\n# Examples:\r\nmirror = \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FOpenSteam001\u002Fsteam-monitor@pattern\"\r\n# mirror = \"https:\u002F\u002Fghproxy.com\u002Fhttps:\u002F\u002Fraw.githubusercontent.com\u002FOpenSteam001\u002Fsteam-monitor\u002Fpattern\"\r\n# mirror = \"https:\u002F\u002Fyour.server.com\u002Fopensteamtool-patterns\"\r\n```\r\n\r\nThe full URL fetched at runtime is `\u003Cmirror>\u002Fsteamclient\u002F\u003Csha256>.toml` and `\u003Cmirror>\u002Fsteamui\u002F\u003Csha256>.toml`. Any HTTPS server that serves the same directory layout works. A trailing `\u002F` is allowed but optional.\r\n\r\nResolved URL by config (example, for the `steamui` lookup):\r\n\r\n| Config | Resulting URL |\r\n|---|---|\r\n| `[pattern]` omitted, or `mirror = \"\"` | `https:\u002F\u002Fraw.githubusercontent.com\u002FOpenSteam001\u002Fsteam-monitor\u002Fpattern\u002Fsteamui\u002F\u003Csha>.toml` |\r\n| `mirror = \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FOpenSteam001\u002Fsteam-monitor@pattern\"` | `https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FOpenSteam001\u002Fsteam-monitor@pattern\u002Fsteamui\u002F\u003Csha>.toml` |\r\n| `mirror = \"https:\u002F\u002Fyour.server.com\u002Fp\u002F\"` (trailing slash) | `https:\u002F\u002Fyour.server.com\u002Fp\u002Fsteamui\u002F\u003Csha>.toml` (slash stripped at parse) |\r\n\r\n**Verifying a mirror in your browser:** paste a complete URL — base + subdir + a real SHA-256 + `.toml`. The base URL alone (without the file path) will return `Invalid URL` from most CDNs, which is expected behavior, not a sign the mirror is broken. Example URLs you can paste directly:\r\n\r\n```\r\nhttps:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002FOpenSteam001\u002Fsteam-monitor@pattern\u002Fsteamui\u002F7a72275b5efc6781a964f6a8e5414ea2226c4a0a64a82e79b9e7d501dfcc3b57.toml\r\nhttps:\u002F\u002Fraw.githubusercontent.com\u002FOpenSteam001\u002Fsteam-monitor\u002Fpattern\u002Fsteamui\u002F7a72275b5efc6781a964f6a8e5414ea2226c4a0a64a82e79b9e7d501dfcc3b57.toml\r\n```\r\n\r\nReplace the hash with a real one from [the upstream `pattern` branch](https:\u002F\u002Fgithub.com\u002FOpenSteam001\u002Fsteam-monitor\u002Ftree\u002Fpattern\u002Fsteamui). If the browser returns `200` you're good; `404` means upstream hasn't published a file for that DLL yet (open an issue), and connect\u002Ftimeout errors mean the mirror itself isn't reachable from your network — pick another.\r\n\r\n### Debug logging\r\n\r\nDebug builds write per-module log files under `\u003CSteam>\u002Fopensteamtool\u002F`:\r\n\r\n| File | Source | Content |\r\n|------|--------|---------|\r\n| `main.log`          | General | Init, config loading, Lua parsing,Utils |\r\n| `ipc.log`           | `LOG_IPC_*` | IPC commands, InterfaceCall dispatch, spoofing |\r\n| `netpacket.log`     | `LOG_NETPACKET_*` | Network packet send\u002Frecv, eMsg dispatch |\r\n| `manifest.log`      | `LOG_MANIFEST_*` | Manifest download, `fetch_manifest_code`,manifest binding |\r\n| `decryptionkey.log` | `LOG_DECRYPTIONKEY_*` | Depot decryption key injection |\r\n| `keyvalue.log`      | `LOG_KEYVALUE_*` | KeyValues patching (manifest binding) |\r\n| `misc.log`          | `LOG_MISC_*` | Engine pointer capture, AppId hints |\r\n| `winhttp.log`       | `LOG_WINHTTP_*` | HTTP requests  |\r\n| `achievement.log`   | `LOG_ACHIEVEMENT_*` | UserStats requests\u002Fresponses, steamid spoofing |\r\n| `pics.log`          | `LOG_PICS_*` | PICS access token injection |\r\n| `package.log`       | `LOG_PACKAGE_*` | Package injection, FileWatcher events |\r\n| `onlinefix.log`     | `LOG_ONLINEFIX_*` | Online fix (480 AppId spoofing) |\r\n\r\nThe log level is controlled by `[log] level` in `opensteamtool.toml`.\r\n\r\n## Build\r\n\r\n### Requirements\r\n- Windows 10\u002F11\r\n- CMake 3.20+\r\n- Visual Studio 2022 with MSVC (x64 toolchain)\r\n\r\n### Runtime requirements\r\n- Outbound HTTPS access to `raw.githubusercontent.com` on first launch after a Steam update (see [Steam version compatibility](#steam-version-compatibility)). Cached afterwards.\r\n\r\n### Quick build\r\n```powershell\r\nbuild.bat\r\n```\r\n\r\n### Output\r\n- Debug: `build\u002FDebug\u002FOpenSteamTool.dll`, `build\u002FDebug\u002Fdwmapi.dll`, `build\u002FDebug\u002Fxinput1_4.dll`\r\n- Release: `build\u002FRelease\u002FOpenSteamTool.dll`, `build\u002FRelease\u002Fdwmapi.dll`, `build\u002FRelease\u002Fxinput1_4.dll`\r\n\r\n## Disclaimer\r\nThis project is provided for research and educational purposes only. You are responsible for complying with local laws, platform terms of service, and software licenses.\r\n","OpenSteamTool 是一个开源的 Steam 解锁工具，主要功能是解锁未拥有的游戏及其DLC。该项目采用C++编写，并使用CMake构建，专为Windows平台设计。它支持自动加载解密密钥、下载受保护的游戏或DLC、绑定清单防止特定游戏更新等功能。此外，该工具还具备热重载配置文件的能力，以及绕过Steam家庭共享限制和在线修复等特性，兼容Denuvo和SteamStub保护的游戏。适用于希望在没有购买的情况下体验游戏或测试游戏开发者的场景。",2,"2026-06-11 02:46:16","CREATED_QUERY"]