{"id":31688378,"url":"https://github.com/titoot/keydot","last_synced_at":"2026-01-16T15:21:22.979Z","repository":{"id":313215485,"uuid":"1050528138","full_name":"Titoot/KeyDot","owner":"Titoot","description":"Blazingly Fast, Static Godot Engine Encryption Key Extractor","archived":false,"fork":false,"pushed_at":"2025-09-27T03:10:53.000Z","size":61,"stargazers_count":21,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-27T05:37:10.896Z","etag":null,"topics":["decompile","gdke","gdre","gdsdecomp","godot","godot-decrypt","godot-secure","godotpckexplorer","reverse-engineering"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Titoot.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-04T14:57:15.000Z","updated_at":"2025-09-27T03:10:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"fd07cae1-80e8-4fcf-91ce-262cb69fd004","html_url":"https://github.com/Titoot/KeyDot","commit_stats":null,"previous_names":["titoot/keydot"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Titoot/KeyDot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Titoot%2FKeyDot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Titoot%2FKeyDot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Titoot%2FKeyDot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Titoot%2FKeyDot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Titoot","download_url":"https://codeload.github.com/Titoot/KeyDot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Titoot%2FKeyDot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278931662,"owners_count":26070788,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["decompile","gdke","gdre","gdsdecomp","godot","godot-decrypt","godot-secure","godotpckexplorer","reverse-engineering"],"created_at":"2025-10-08T10:55:33.343Z","updated_at":"2026-01-16T15:21:22.933Z","avatar_url":"https://github.com/Titoot.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KeyDot\r\n\r\n**Blazingly Fast, Static Godot Engine Encryption Key Extractor**\r\n\r\n[![Build Status](https://img.shields.io/github/actions/workflow/status/Titoot/KeyDot/build-and-release.yml?branch=main)](https://github.com/Titoot/KeyDot/actions/workflows/build-and-release.yml)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n[![Latest Release](https://img.shields.io/github/v/release/Titoot/KeyDot)](https://github.com/Titoot/KeyDot/releases)\r\n\r\nKeyDot is a high-performance, command-line utility designed to extract encryption keys and detect the engine version from compiled Godot Engine games. It operates directly on game executables (Windows x64) and WebAssembly (`.wasm`) files without ever needing to run the game.\r\n\r\n## Key Features\r\n\r\n-   **⚡ Blazing Fast Extraction:** Optimized C++ code and memory-mapped I/O provide results in milliseconds.\r\n-   **🔬 Static Analysis:** Reads the game files directly. No runtime process attachment, memory dumping, or debugging required, making it safe and efficient.\r\n-   **🧠 Memory-Efficient:** Uses memory-mapped files to let the operating system handle efficient file paging, keeping memory usage low even for huge executables.\r\n-   **🌐 WASM Support:** The only static analysis tool currently available that can extract keys from Godot games compiled for the web.\r\n\r\n## Performance Comparison\r\n\r\nKeyDot was built from the ground up for speed and ease of use. Here's how it compares to other available tools:\r\n\r\n| Tool                         | Standalone?¹ | Analysis Type | Speed (Windows)²              | Speed (WASM)³                 | Notes                                                    |\r\n| ---------------------------- | :----------: | :-----------: | ----------------------------- | ----------------------------- | -------------------------------------------------------- |\r\n| **KeyDot (This Project)**    |     ✅      |    Static     | **~50 ms**                    | **~6 ms**                     | Fully automated, no manual steps required.               |\r\n| [gdke](https://github.com/char-ptr/gdke) |     ❌      |    Static     | Slow (large files)            | ❌ Not Supported             | Requires manual function signature search in IDA/Ghidra. |\r\n| [GodotPCKExplorer](https://github.com/DmitriySalnikov/GodotPCKExplorer/tree/master/Bruteforcer) |     ✅      |    Static     | ~4000 ms                      | ❌ Not Supported             | Slower pattern scanning.                                 |\r\n| [godot-key-extract](https://github.com/char-ptr/godot-key-extract) |      ❌      |    Dynamic    | Varies (fast)                 | ❌ Not Supported             | Requires DLL injection and running the game process.     |\r\n\r\n¹ **Standalone** means the tool does not require running the game or using other complex software like debuggers or disassemblers.\r\n² **Windows speed** tested on a 78MB executable for KeyDot and a 56MB executable for GodotPCKExplorer.\r\n³ **WASM speed** tested on a 38MB `.wasm` file.\r\n\r\n## Supported Platforms\r\n\r\n-   ✅ **Windows** (64-bit PE Executables)\r\n-   ✅ **WebAssembly** (`.wasm` files)\r\n-   *Linux (ELF) and macOS (Mach-O) support is planned.*\r\n\r\n## Installation\r\n\r\n### 1. Pre-compiled Releases (Recommended)\r\n\r\nThe easiest way to use KeyDot is to download the latest pre-compiled executable for your platform from the [**Releases Page**](https://github.com/Titoot/KeyDot/releases).\r\n\r\n### 2. Building from Source\r\n\r\nIf you prefer to build the project yourself, you will need a C++20 compatible compiler and CMake.\r\n\r\n**Prerequisites:**\r\n-   CMake 3.14+\r\n-   A C++20 Compiler (Visual Studio 2022, GCC 11+, Clang 12+)\r\n\r\n**Steps:**\r\n1.  Clone the repository:\r\n    ```sh\r\n    git clone https://github.com/Titoot/KeyDot.git\r\n    cd KeyDot\r\n    ```\r\n2.  Create a build directory:\r\n    ```sh\r\n    mkdir build\r\n    cd build\r\n    ```\r\n3.  Configure and generate build files:\r\n    ```sh\r\n    cmake ..\r\n    ```\r\n4.  Compile the project:\r\n    ```sh\r\n    cmake --build . --config Release\r\n    ```\r\nThe final executable, `keydot.exe`, will be in the `build/Release` directory.\r\n\r\n## Usage\r\n\r\nKeyDot is a simple command-line tool.\r\n\r\n```\r\nKeyDot - Blazingly Fast, Static Godot Engine Encryption Key Extractor\r\nNote: Only 64-bit (x64) executables are supported at the moment.\r\n\r\nUsage:\r\n  KeyDot [options] \u003cpath-to-exe-or-wasm\u003e\r\n\r\nOptions:\r\n  -d, --debug       Enable detailed debug logging\r\n  -t, --timers      Show execution time for each stage\r\n  -h, --help        Show this help message and exit\r\n```\r\n\r\n### Examples\r\n\r\n**1. Analyze a Windows Executable:**\r\n```sh\r\nkeydot.exe game.exe\r\n```\r\n*Expected Output:*\r\n```\r\nGodot Engine version: 4.1.1.stable\r\nAnchor          : Can't open encrypted pack directory.\r\nString VA       : 0x140D2A5B0\r\nLEA at          : 0x1406A1E1F\r\noff_* qword VA  : 0x140D838B0\r\nBlob VA         : 0x1411232B0\r\n32-byte (hex)   : 1A2B3C4D5E6F78901A2B3C4D5E6F78901A2B3C4D5E6F78901A2B3C4D\r\n```\r\n\r\n**2. Analyze a WebAssembly File with Debug Output:**\r\n```sh\r\nkeydot.exe --debug --timers game.wasm\r\n```\r\n*Expected Output:*\r\n```\r\n[CFG] Debug logging enabled\r\n[CFG] Timer logging enabled\r\n[IO] Detected WASM file\r\n[TIMER] find_godot_version_in_wasm: 3.45 ms\r\nGodot Engine version: 3.5.2.stable\r\n[TIMER] extract_wasm_key: 2.11 ms\r\nWASM key: 0987654321fedcba0987654321fedcba0987654321fedcba0987654321fedcba\r\n[TIMER] Total execution: 6.02 ms\r\n```\r\n\r\n## Reporting Issues\r\n\r\nIf you encounter a game where KeyDot fails to extract the key, or if you want to request support for a new platform (like Linux or macOS), please **open an issue**.\r\n\r\nMake sure to include:\r\n1.  The sample game file (or a link to it).\r\n2.  The **full text output** of running KeyDot with the `--debug` flag.\r\n\r\n## Extraction Approach\r\n\r\n### Windows (PE Files)\r\n\r\n1.  **Find Anchor String:** The process begins by searching for known error strings related to encrypted PCK loading (e.g., `\"Can't open encrypted pack directory.\"`) within the (`.rdata`).\r\n2.  **Locate Code Reference:** Once a string is located, the tool scans the (`.text`) to find where this string is referenced by an instruction, typically `LEA`.\r\n3.  **Identify Key Pointer:** Within a small window of instructions following the `LEA`, the scanner looks for a crucial pattern: a `MOV` instruction that loads a 64-bit pointer from a global address (`MOV RAX, [RIP + offset]`).\r\n4.  **Dereference Pointer:** This global address contains a *pointer to* the actual 32-byte encryption key blob, which typically resides in the `.data` section.\r\n5.  **Extract Key:** The tool reads the 32-byte blob from this final address, revealing the key.\r\n\r\n### WebAssembly (.wasm)\r\n\r\n1.  **Heuristic Search:** Godot's export template for WASM often embeds the encryption key as a raw byte array near the end of the file.\r\n2.  **Marker Identification:** KeyDot reads the last few kilobytes of the file and searches for a specific 7-byte \"start marker\" followed by a 4-byte \"end marker\".\r\n3.  **Key Extraction:** The 32-byte encryption key is consistently located immediately preceding this end marker.\r\n\r\n## Special Thanks\r\n\r\nThis project was made possible by studying the excellent work of the following projects and individuals:\r\n\r\n-   [GDRETools/gdsdecomp](https://github.com/GDRETools/gdsdecomp)\r\n-   [char-ptr/godot-key-extract](https://github.com/char-ptr/godot-key-extract) (Dynamic Analysis)\r\n-   [char-ptr/gdke](https://github.com/char-ptr/gdke) (Static Analysis)\r\n-   [DmitriySalnikov/GodotPCKExplorer/Bruteforcer](https://github.com/DmitriySalnikov/GodotPCKExplorer/tree/master/Bruteforcer)\r\n-   The [Godot Engine](https://github.com/godotengine/godot) source code itself.\r\n-   And finally, a huge thank you to my girlfriend for her endless support and encouragement throughout this project.\r\n\r\n## License\r\n\r\nThis project is licensed under the **MIT License**. See the [LICENSE](LICENSE) file for details.\r\n\r\n### Disclaimer\r\n\r\nThis tool is intended for educational purposes, security research, and to assist in data recovery for your own projects. Please use it responsibly and respect the intellectual property rights of game developers. The author is not responsible for any misuse of this software.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftitoot%2Fkeydot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftitoot%2Fkeydot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftitoot%2Fkeydot/lists"}