{"id":30671539,"url":"https://github.com/elmodo7/emuhook","last_synced_at":"2026-02-14T19:31:36.602Z","repository":{"id":309817716,"uuid":"1037661068","full_name":"elModo7/EmuHook","owner":"elModo7","description":"A library to unify gathering and managing emulated systems's RAM for many systems and emulators.","archived":false,"fork":false,"pushed_at":"2025-08-31T18:07:32.000Z","size":29543,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-01T03:38:13.927Z","etag":null,"topics":["debugger","emulator","hacking","memory","memory-analysis","memory-hacking","memory-scanner","memory-viewer","remote","speedrun-tool","speedrunning"],"latest_commit_sha":null,"homepage":"","language":"AutoHotkey","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elModo7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-08-13T23:32:45.000Z","updated_at":"2025-08-31T18:07:35.000Z","dependencies_parsed_at":"2025-08-14T01:21:04.133Z","dependency_job_id":"a292eab8-c14a-415a-aab0-eabb2ff57d2b","html_url":"https://github.com/elModo7/EmuHook","commit_stats":null,"previous_names":["elmodo7/emuhook"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/elModo7/EmuHook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elModo7%2FEmuHook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elModo7%2FEmuHook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elModo7%2FEmuHook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elModo7%2FEmuHook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elModo7","download_url":"https://codeload.github.com/elModo7/EmuHook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elModo7%2FEmuHook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29453399,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T15:52:44.973Z","status":"ssl_error","status_checked_at":"2026-02-14T15:52:11.208Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["debugger","emulator","hacking","memory","memory-analysis","memory-hacking","memory-scanner","memory-viewer","remote","speedrun-tool","speedrunning"],"created_at":"2025-09-01T03:19:27.788Z","updated_at":"2026-02-14T19:31:36.586Z","avatar_url":"https://github.com/elModo7.png","language":"AutoHotkey","readme":"\n![EmuHook](https://github.com/elModo7/EmuHook/blob/main/example_images/EmuHook.jpg?raw=true)\n\n# EmuHook — a unified memory-hooking library for emulators and PC games\n\n\u003e **Version:** 0.6.8  \n\u003e **Language:** AutoHotkey v1\n\u003e **HTTP REST API Bridge:** Java 18  \n\u003e **Core idea:** Hook an emulator’s process once, resolve the emulated console’s base RAM addresses, and expose a single, consistent API for reading/writing real-time game memory across many systems.\n\u003e **Extension:** Language agnostic HTTP, WebSocket \u0026 TCP interop with base lib.\n\n[⭐ Example videos here!](#demos)\n----------\n\n\u003e [!IMPORTANT] \n\u003e EmuHook is not public yet, however I will be posting updates and demos here.\n\u003e \n\u003e My free time IRL has gone quite tighter than I expected and I am not 100% comfortable having this out with no free time to keep track/support it.\n\n---\n\n## Index\n\n1. [TL;DR](#tldr)\n2. [Emulator - System Support](#emulator---system-support)\n3. [Why I built it](#why-i-built-it)\n4. [Feature highlights](#feature-highlights)\n5. [Quick start](#quick-start)\n6. [API (practical)](#api-practical)\n   - [Constructor](#constructor)\n   - [Basic I/O](#basic-io)\n   - [Pointer chains](#pointer-chains)\n   - [Endianness \u0026 cleanup](#endianness--cleanup)\n7. [Address-space detection](#address-space-detection-what-happens-behind-the-scenes)\n8. [Real examples](#real-examples-you-can-paste)\n9. [Performance \u0026 design choices](#performance--design-choices)\n10. [Building overlays \u0026 Twitch plugins](#building-overlays--twitch-plugins-on-top-of-emuhook)\n11. [Changelog](#changelog)\n12. [Supplementary Examples \u0026 Variants](#supplementary-examples--variants)\n    - [Memory Viewer](#memory-viewer-gbc-example)\n    - [EmuHookHTTP](#emuhookhttp)\n    - [EmuHookServer](#emuhookserver)\n13. [ TO-DOs](#to-do)\n14. [Final notes](#final-notes)\n15. [Demo images and Videos](#demos)\n16. [My projects using EmuHook](#my-projects-using-emuhook)\n17. [Tools used](#tools-used)\n\n----------\n\n\n## TL;DR\n\nEmuHook lets you:\n\n-   **Attach once** to an emulator (by EXE or PID) and keep a **persistent handle** for fast memory I/O.\n    \n-   **Auto-resolve base addresses** (WRAM, IRAM, SRAM…) per system/emulator.\n    \n-   **Read/write** memory in **little- or big-endian** (e.g., GC/Wii on Dolphin).\n    \n-   **Follow multi-level pointer chains**.\n    \n-   Use a **common address model** for your overlays, automated race trackers, autosplitters, crowd-control plugins, real-time event dispatchers, data mining tools, bot automation frameworks, debugging tools and many more.\n    \n\n----------\n## Emulator - System Support\n\n\n| Emulator                         | GB | SGB | GBC | GBA | PSX | NDS | NES | SNES | GC | Wii | SMS | MD | 32x | SG1000 | PS2 | N64 | WiiU | PSP | PS3 | 3DS |\n| -------------------------------- | ----------------: | ----------------------: | ----------------------: | ------------------------: | -----------------: | ----------: | ----------------------------: | ----------------------------------: | ----------------: | -----------: | -----------------: | ------------------------: | -------: | -----------: |-----------: |-----------: |-----------: |-----------: |-----------: |-----------: |\n| mGBA                             |                 ✔ |                       ✔ |                       ✔ |                         ✔ |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| VisualBoyAdvance-Link            |                 ✔ |                       ✔ |                       ✔ |                         ✔ |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| VBA-H                            |                 ✔ |                       ✔ |                       ✔ |                         ✔ |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| VBA-rr                           |                 ✔ |                       ✔ |                       ✔ |                         ✔ |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| BGB                              |                 ✔ |                       ✔ |                       ✔ |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| Gambatte Speedrun                |                 ✔ |                       ✔ |                       ✔ |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| GSE (Game Boy Speedrun Emulator) |                 ✔ |                       ✔ |                       ✔ |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |\n| BizHawk (EmuHawk)                |                 ✔ |                       ✔ |                       ✔ |                         ✔ |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| DuckStation                      |                 — |                       — |                       — |                         — |                  ✔ |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| MelonDS                          |                 — |                       — |                       — |                         — |                  — |           ✔ |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| FCEUX                            |                 — |                       — |                       — |                         — |                  — |           — |                             ✔ |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| SNES9x                           |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   ✔ |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| Dolphin                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 ✔ |            ✔ |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            — |\n| Kega Fusion                      |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  ✔ |                         ✔ |        ✔ |            ✔ |            — |            — |            — |            — |            — |            — |\n| PCSX2                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            ✔ |            — |            — |            — |            — |            — |\n| Project64                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            ✔ |            — |            — |            — |            — |\n| Cemu                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            ✔ |            — |            — |            — |\n| PPSSPP                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            ✔ |            — |            — |\n| RPCS3                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            ✔ |            — |\n| Azahar                          |                 — |                       — |                       — |                         — |                  — |           — |                             — |                                   — |                 — |            — |                  — |                         — |        — |            — |            — |            — |            — |            — |            — |            🔶 |\n\n\n**Supported emulators (as of 0.6.7):** \n\n - mGBA (GB/GBC/GBA)\n - VisualBoyAdvance-Link (GB/GBC/GBA)\n - VBA-H (GB/GBC/GBA)\n - VBA-rr (GB/GBC/GBA)\n - BGB (GB/GBC)\n - Gambatte Speedrun (GB/GBC)\n - GSE (Game Boy Speedrun Emulator) (GB/GBC)\n - BizHawk (EmuHawk) (GB/GBC/GBA)\n - DuckStation (PSX)\n - MelonDS (NDS)\n - FCEUX (NES)\n - SNES9x (SNES)\n - Dolphin (GC/Wii)\n - Kega Fusion (Sega: SMS, MD/Genesis, 32x, SG-1000)\n - PCSX2 (PS2)\n - Project64 (N64)\n - Cemu (WiiU)\n - PPSSPP (PSP)\n - RPCS3 (PS3)\n - Azahar (3DS) (preliminar, help needed)\n\n\n\n**Supported Systems (as of 0.6.7):** \n\n - Nintendo Game Boy\n - Nintendo Super Game Boy\n - Nintendo Game Boy Color\n - Nintendo Game Boy Advance\n - Sony PlayStation 1\n - Sony PlayStation 2\n - Sony PlayStation 3\n - Sony PlayStation Portable\n - Nintendo DS\n - Nintendo 3DS (preliminar, help needed)\n - Nintendo Entertainment System\n - Super Nintendo Entertainment System\n - Nintendo GameCube\n - Nintendo Wii\n - Nintendo WiiU\n - Nintendo 64\n - Sega Master System\n - Sega Mega Drive / Genesis\n - Sega 32x\n - Sega SG-1000\n - Native PC Games\n----------\n\n## Why I built it\n\nEmulator memory tooling is traditionally **per-emulator and per-system**. That fractures tooling for overlays, routing, races, or Twitch integrations. EmuHook normalizes those differences behind a single AHK class, TCP sockets, WebSockets or HTTP REST API (Java), so your higher-level code (events, UI, networking) doesn’t care which emulator or system you’re using.\n\n----------\n\n## Feature highlights\n\n-   **One class to hook them all:** `EmuHook` manages PID discovery, base module resolution, and a **long-lived process handle**.\n    \n-   **Per-emulator base address resolution:** Internals know where each emulator keeps the emulated RAM (pointer chains or offsets).\n    \n-   **Dynamic address-space detection** (`detectAddressSpace`): Pass a console address like `0x02000000` (GBA WRAM) and EmuHook maps it to the real process address automatically.\n    \n-   **Endianness toggle** (`setEndian`): Global big/little endian handling; **Dolphin** is auto-set to **big-endian**.\n    \n-   **Address conversion for GC/Wii** (`addrCnv`): Transparently converts `0x80000000..` style addresses to process addresses (including Wii’s dual block `0x8E000000` segment).\n    \n-   **Pointer helpers:** `rmp/rmpd` (read-multi-pointer), `wmp/wmpd` (write-multi-pointer), with final-byte-size support.\n    \n-   **Hex helpers:** `rmwh/rmwhd` return 0-padded hex strings for UI/debug output.\n    \n-   **Multi-instance** support via PID: pass `\"ahk_pid 1234\"` to target a specific emulator window.\n    \n\n----------\n\n## Quick start\n\n```autohotkey\n#Include \u003cEmuHook\u003e\n\n; Attach to mGBA (GBA)\nemu := new EmuHook(\"ahk_exe mGBA.exe\", \"gba\")\n\n; Read a GBA WRAM address directly by console address\n; GBA WRAM: 0x02000000..0x02FFFFFF  (EmuHook maps this for you)\nhp := emu.rmd(0x02037D00, 2, \"wram\")   ; read 2 bytes\nToolTip, HP := %hp%\n\n; Write a byte (e.g., set flag)\nemu.wmd(1, 0x0203A120, 1, \"wram\")\n\n; Clean up when done\nemu.Destroy()\nExitApp\n\n```\n\nAttach by **PID** instead:\n\n```autohotkey\nemu := new EmuHook(\"ahk_pid 12345\", \"gba\")\n\n```\n\nOr auto-detect one running emulator:\n\n```autohotkey\nexe := checkRunningEmulator()          ; returns e.g. \"ahk_exe mGBA.exe\", \"\" or \"multiple\"\nemu := new EmuHook(exe, \"gba\")\n\n```\n\n\u003e **Tip:** Some emulators—**BizHawk, DuckStation, Dolphin, melonDS, PCSX2, RPCS3, Cemu, Azahar, PPSSPP**—require **AutoHotkeyU64** due to 64-bit pointers.\n\n----------\n\n## API (practical)\n\n### Constructor\n\n```autohotkey\nemu := new EmuHook(\"ahk_exe mGBA.exe\", \"gba\")\nemu := new EmuHook(\"ahk_pid 1234\", \"gbc\")\n\n```\n\n-   `romType` recognized in code paths: **gbc, gb, gba, nds/ds, nes, snes/sfc, gc, wii, ps2, psx, sg-1000, sms, md, pc** (exact checks vary per emulator).\n    \n-   On construct:\n    \n    -   Resolves **PID** and **window handle**.\n        \n    -   Opens a **persistent process handle** (`OpenProcess`).\n        \n    -   Resolves `ram`, and when relevant, `wram/sram`.\n        \n    -   For **GC/Wii**, flips global endian to **big** and enables address conversion.\n        \n\n### Basic I/O\n\n```autohotkey\n; Raw read/write (process address) – use when you already know the resolved process address\nval := emu.rm(addr, bytes := 1)\nemu.wm(value, addr, bytes := 1)\n\n; Auto address-space detected versions\nval := emu.rmd(consoleAddr, bytes := 1, ramBlock := \"ram|wram|sram\")\nemu.wmd(value, consoleAddr, bytes := 1, ramBlock := \"ram|wram|sram\")\n\n; Hex helpers (0-padded)\nhex := emu.rmwh(addr, bytes := 1)                 ; raw\nhex := emu.rmwhd(consoleAddr, bytes := 1, \"wram\") ; detected\n\n```\n\n### Pointer chains\n\n```autohotkey\n; Read through pointers:  base -\u003e +o1 -\u003e +o2 ... -\u003e value\nval := emu.rmp(base, [o1, o2, ...], byt := 4, finalByt := \"\")\n\n; Auto-detected address space\nval := emu.rmpd(consoleAddr, [o1, o2, ...], byt := 4, finalByt := \"\")\n\n; Write via pointer chains\nemu.wmp(value, base, [o1, o2, ...], byt := 4, finalByt := \"\")\nemu.wmpd(value, consoleAddr, [o1, o2, ...], byt := 4, finalByt := \"\")\n\n```\n\n### Endianness \u0026 cleanup\n\n```autohotkey\nemu.setEndian(\"l\") ; little (default)\nemu.setEndian(\"b\") ; big (auto-set for GC/Wii)\n\nemu.Destroy()      ; closes handle\n; or automatic via __Delete\n\n```\n\n----------\n\n## Address-space detection (what happens behind the scenes)\n\n`detectAddressSpace(targetAddr, ramBlock := \"ram\")` transforms a **console** address into the **real process** address based on the system:\n\n-   **GBC**\n    \n    -   `0xA000..0xBFFF` → **SRAM**\n        \n    -   `0xC000..0xCFFF` → **RAM**\n        \n    -   `0xD000..0xEFFF` → **WRAM**\n        \n-   **GBA**\n    \n    -   `0x02000000..0x02FFFFFF` → **WRAM**\n        \n    -   `0x03000000..0x03FFFFFF` → **IRAM** (exposed as `ram`)\n        \n-   **Other systems**  \n    If you specify `ramBlock` (`\"ram\" | \"wram\" | \"sram\"`) and that base exists, EmuHook just **adds** it and you’re done. This greatly shortens overlay code.\n    \n\nFor **Dolphin (GC/Wii)**, `addrCnv()` auto-converts the `0x80000000` (and Wii’s `0x8E000000`) spaces to process addresses.\n \n----------\n\n## Real examples you can paste\n\n### 1) Following a pointer chain\n\n```autohotkey\n; Follow base + [0x28, 0x30, 0x43] then read a 4-byte value at the final address\nval := emu.rmp(emu.baseProc + 0x275CFC4, [0x28, 0x30, 0x43], 4)\n\n; Same idea but from a console address and auto-detected space\nval := emu.rmpd(0x02000000, [0x1C, 0x8], 4, 2) ; e.g., final 2-byte value\n\n```\n\n### 2) Dolphin (GC/Wii) big-endian write\n\n```autohotkey\nemu := new EmuHook(\"ahk_exe Dolphin.exe\", \"gc\")\n; For Dolphin, endian is auto \"b\" and 0x8000_0000 space is auto converted.\nemu.wmd(0x0032, 0x8034A0B2, 2) ; write big-endian halfword\n\n```\n\n----------\n\n## Performance \u0026 design choices\n\n-   **OpenProcess once, reuse**: handle stays open until `Destroy`/script exit → lower overhead for high-frequency reads (\u003e~300.000 reads per second on a Intel i7 8700K).\n    \n-   **No repeated PID lookups**: resolved once in `__New`.\n    \n-   **Endian handling** centralized**: write path builds a byte array for big-endian writes; reads recompose integers properly.\n    \n-   **Auto-mapping**: `detectAddressSpace` reduces boilerplate and mismatches when you switch emulators.\n    \n----------\n\n## Building overlays \u0026 Twitch plugins on top of EmuHook\n\n-   **Overlay UI:** Use AHK GUIs or offload to a browser source via local WebSocket/HTTP (e.g., AHK ↔ Node/WS).\n    \n-   **Event system:** Wrap reads in a tiny dispatcher.\n    \n-   **Races/crowd control:** Expose a simple command bus (e.g., read chat → translate into `wmd()` writes).\n    \n\n----------\n\n## Changelog\n\n-   **0.6.8** - Add text extraction/injection support.\n\n-   **0.6.7** - Add support for Nintendo 3DS via Azahar (preliminar, help needed).\n\n-   **0.6.6** - Add support for Sony PlayStation 3 via RPCS3.\n\n-   **0.6.5** - Add support for Nintendo WiiU via Cemu.\n\n-   **0.6.4** - Add support for Sony PlayStation Portable via PPSSPP.\n\n-   **0.6.2 - 0.6.3** - Add support for Nintendo64 via Project64 \u0026 add functions to handle module base address resolution \u0026 dynamic n64 address resolution.\n\n-   **0.6.1** - Add support for Sony PlayStation 2 via PCSX2.\n\n-   **0.6.0** — Add support for Sega Mega Drive, 32x. Minor improvements to dynamic read system.\n\n-   **0.5.9** — Add support for some Sega systems through Kega Fusion (SG-1000, SMS)\n\n-   **0.5.8** — PC game hooking (not just emulators)\n    \n-   **0.5.7** — Major GC/Wii upgrades; inner pointers usable with unconverted addresses\n    \n-   **0.5.5** — Endianness is global and auto-set for GC/Wii\n    \n-   **0.5.4** — Dynamic address-space fallback shortens commands\n    \n-   **0.5.1** — GC/Wii support for Dolphin 2506a + endian toggle\n    \n-   **0.5.0** — Keep handles open until destroyed (perf boost)\n    \n-   **0.4.x** — DuckStation (PSX), melonDS (NDS), GSE (Gambatte), FCEUX (NES), SNES9x (SNES), pointer-chain helpers, BizHawk fixups\n    \n-   **0.3.x** — BizHawk, Gambatte, VBA variants; multi-instance; SRAM tracking\n    \n---\n\n## Supplementary Examples \u0026 Variants\n\nThese examples are built on the EmuHook core library described above, demonstrating practical applications and integrations.\n\n---\n\n### Memory Viewer (GBC Example)\n\n**Purpose:**  \nA standalone **real-time memory viewer** for Game Boy Color titles, using EmuHook’s address-space detection to read live game data.\n\n**Key points:**\n- Targets GBC emulators supported by EmuHook (`mGBA`, `VBA`, etc.).\n- Uses `rmd()` to fetch memory in **console address space**.\n- Displays values in a scrolling or fixed window for debugging/hacking.\n- Auto-refresh loop for live updates.\n\n**Usage:**  \nGreat for **reverse-engineering** games, finding health/score addresses, or monitoring event triggers.\n\n----------\n\n### EmuHookHTTP\n\n**Purpose:**  \nExtends EmuHook into a **local HTTP API**, allowing overlays, scripts, or remote services to query/write emulator memory without running AHK on the same machine.\n\n**Key points:**\n\n-   Wraps EmuHook calls inside a lightweight HTTP server.\n    \n-   Responds with JSON for memory reads, accepts POST for writes.\n    \n-   Can be polled by OBS browser sources, Node.js servers, or Twitch bots.\n    \n-   Supports **multiple endpoints** like `/read?addr=...` and `/write`.\n    \n\n**Usage:**  \nIdeal for **cross-language integrations** (e.g., JS overlays), race coordinators, or crowd-control tools.\n\n----------\n\n### EmuHookServer\n\n**Purpose:**  \nA **centralized service** that runs EmuHook and exposes its capabilities over the network, acting as a hub for multiple tools to interact with the emulator simultaneously.\n\n**Key points:**\n\n-   Built on `Socket.ahk` providing:\n    \n    -   TCP/WebSocket handling\n        \n    -   Config parameter (addresses, update interval...)\n        \n    -   Persistent memory watchers\n        \n-   Acts as a bridge between local emulator memory and multiple remote subscribers.\n- Reads config from a file and exposes those RAM addresses via a specific TCP port.\n    \n\n**Usage:**  \nPerfect for **multi-user setups** (e.g., a Twitch channel with both an overlay and a chat bot reading/writing memory in real time).\n\n----------\n\n## TO-DO\n\n-   Finish **SRAM mappings** across all emulators.\n    \n-   Improve **support for 3DS**.\n\n- Add support for Dreamcast, Sega Saturn, WonderSwan, NeoGeo.\n\n- Add support for (low-priority) Atari: (Lynx, Jaguar, 2600...), Amstrad CPC, ZX Spectrum, Vectrex, Commodore 64.\n\n-   Create search tool example.\n\n-   Unify GBC/GBA on all capable emulators.\n    \n-   Migrate to **AHK v2** ?.\n    \n\n----------\n\n## Final notes\n\nEmuHook’s power lies in its **consistency**: once you target an address for one emulator, you can usually switch emulators without changing your overlay logic. It’s a solid foundation for **interactive, real-time** tooling—speedrunning races, Twitch crowd-control, data mining, automation frameworks or just deep game debugging.\n\n----------\n\n## Demos\n\n#### ***[Wii, GBC, PSX, NDS \u0026 SNES]*** [🎬Real-Time RAM Viewer \u0026 Editor](https://youtu.be/Vbob-0w0Afk)\n[![](https://github.com/elModo7/EmuHook/blob/main/example_images/mem_viewer.jpg?raw=true)](https://youtu.be/Vbob-0w0Afk)\n\n---\n\n***[Game Boy Color]*** Pokemon Crystal - Multiplayer Proof of Concept\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/pokecrystal_multiplayer.png?raw=true)\n\u003e Tracks player positions and ***shares them between concurrent emulators*** so that you can see other players on your game.\n\u003e \n\u003e I made a long video explaining and testing this here.\n\u003e \n\u003e [***A small demo video can be found here***  \n\u003e     ![](https://i.ytimg.com/vi/CU6lkQsZhMY/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB\u0026rs=AOn4CLAu3t0CMYSFXpYEl-sz8OcnVY71tA)](https://www.youtube.com/watch?v=CU6lkQsZhMY)\n\u003e \n\u003e [***And here I have another demo video showcasing its usage***](https://youtu.be/fGthSATYbsU?si=XqFgtgnCzVnLQYpW)\n---\n\n***[Super Nintendo]*** Super Mario World - Web Tracker **(Java branch of EmuHook)**\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/smw.png?raw=true)\n\u003e Tracks player data and displays it in a transparent web panel that you can add to OBS.\n\u003e \n\u003e This example runs on the Java branch of EmuHook and has ***JavaScript routines*** that periodically calls each endpoint for collecting and displaying data.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/BcFzQ5KaX1s)\n---\n\n***[Game Boy Color]*** Kirby's Dream Land 2 - OBS Overlay + **Godot**\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/kirbydl2.png?raw=true)\n\u003e This overlay is made in the **Godot game engine**, EmuHook exposes a ***TCP socket / WebSockets endpoint*** and then Godot receives data periodically for updating the UI.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/Q8ny1_93EDs)\n---\n\n***[GameCube]*** Eternal Darkness: Sanity's Requiem - SRT\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/ed.png?raw=true)\n\u003e Tracks player data and shows a simple UI. This is what got me into ***inner pointers + big-endian*** settings being added to EmuHook!\n\u003e \n\u003e I have a small demo video here:\n\u003e \n\u003e [***Small demo video here: Eternal Darkness - Real-Time Tracker***](https://youtu.be/u-wg41RRoXI)\n---\n\n***[Game Boy Advance]*** Wario Land 4 - Multiplayer \u0026 Touch Controls\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/wl4_multiplayer.png?raw=true)\n\u003e Tracks player positions and shares them between concurrent emulators so that you can see other players on the ***Real-Time map, similar to Super Mario 64 DS.***\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/ZMIaK6Ex5Ls)\n---\n\n***[Game Boy Advance]*** Pokemon Fire Red - Spinda Pattern Generator (Real-Time)\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/pokefirered.png?raw=true)\n\u003e A **web connected to an EmuHook backend via WebSockets** allow you to draw a Spinda and will force the next encounter to ***find the desired Spinda that you just drew.***\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/TZWtNENz6po)\n\u003e \n\u003e [***I have a full explanation + live programming session here (long)***](https://youtu.be/ysw6vOrmmxI)\n---\n\n***[Game Boy Color]*** Pokemon Crystal - Data Mining \u0026 Automation Framework\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/pokecrystal.png?raw=true)\n\u003e **Where do I start?**\n\u003e \n\u003e There is a ***Trainer Card Tracker*** that tracks player data, such as casino coins, badges, play time, player id, name, money, current map name, current bgm name, repel steps...\n\u003e \n\u003e There is a ***Real-Time map*** that will change depending on the area you are in.\n\u003e \n\u003e There is an ***enemy team tracker + enemy pokemon stats viewer*** with all sorts of info.\n\u003e \n\u003e There is a ***player team tracker + active pokemon stats viewer.***\n\u003e \n\u003e There is a little ***Cheat Menu for debugging*** and quick testing.\n\u003e \n\u003e There is a ***Daycare Viewer*** with info on compatibility, steps, egg management, shinyness...\n\u003e \n\u003e There is a ***Real-Time Pokedex viewer*** showing what you have seen, not seend and captured.\n\u003e \n\u003e There is a ***Pokemon Announcer system*** made in **Godot** that gives alerts on certain events.\n\u003e \n\u003e And lastly an ***Active Pokemon's possible movepool*** so you don't have to search a guide on what your Pokemon will learn next.\n\u003e   \n\u003e  \n\u003e **I have a few demo videos on this one:**\n\u003e \n\u003e [***Pokemon Announcer System Demo***](https://youtu.be/n8Hv0ydb9OU)\n\u003e \n\u003e [***Pokemon Crystal Tools for Data Mining***](https://youtu.be/wny_OoMoA9w)\n\u003e \n\u003e [***Live Capture Alerts Demo***](https://youtu.be/f1iQT9MvXLQ)\n\u003e \n\u003e [***Daycare Shiny Egg Breeding Demo***](https://youtu.be/irIogYmYmmY)\n---\n\n***[Nintendo DS]*** Metroid Prime Hunters - Player Health \u0026 Points Tracker\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/mph.png?raw=true)\n\u003e A tracker made for online matches because ***the netcode in MPH is not really good***, this way you can ***predict lag*** seeing when you actually hit a player.\n\u003e \n\u003e Actually this only works for bot matches because health data is not shared in online matches, but it doesn't stop anyone from creating a middleware server for upgraded clients that do share this data using EmuHook (I am too lazy to do that right now but it should be a rather simple task, commissions are open here I guess hehe).\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/f7FraMlZ-gA)\n---\n\n***[Game Boy Color]*** Pokemon Crystal - HTTP REST API Pokemon Home/Bank\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/pokemon_home.png?raw=true)\n\u003e I ***don't like to depend on third party services*** like the actual Pokemon Home, so I made my own.\n\u003e \n\u003e I **can store my pokemons on the cloud, trade them back to the game and so on**.\n\u003e \n\u003e There is a **full video** explaining each and every step I did for making this project here:\n\u003e \n\u003e [***I made an Unofficial Pokemon Home Cloud Storage without Nintendo***](https://www.youtube.com/watch?v=2ntk2z2zldg)\n\u003e \n\u003e [***Second video demo explaining the usage a bit more here***](https://youtu.be/fGthSATYbsU?si=MsgduMuX_t5iSGyi)\n---\n\n***[PC \u0026 PSX]*** Resident Evil 1 (1996) - Real Time Map, Health Overlay \u0026 AutoSplitter\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/re1.png?raw=true)\n\u003e This is a set of tools I have made for RE1, it features a Real-Time map, just like the DS version, a health hud and an autosplitter.\n\u003e \n\u003e [***I have a demo video here***](https://youtu.be/R-Xl2rBG3Bc)\n\n***[Game Boy Advance]*** Wario Land 4 - Speedrun Tracker\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/wl4.png?raw=true)\n\u003e It tracks A LOT of data, it also calculates the completion percentage for 100% speedruns.\n\u003e \n\u003e [***A demo video can be found here***](https://youtu.be/t7dcZh4QINw)\n\u003e \n\u003e [***Another demo video can be found here***](https://youtu.be/jLcLBPUUhfs)\n\n---\n\n***[Game Boy Color]*** Pokemon Pinball - Adding Rumble Feature to unsupported emulators\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/pokepinball.png?raw=true)\n\u003e This example reads constantly the status of the rumble and then through the XInput.dll library it makes your controller vibrate, no matter if the emulator supports vibration or not.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/8nBiUiWHXtU)\n\n---\n\n***[PC \u0026 PSX]*** Resident Evil 1 (1996) - Entity Radar, IGT, Inventory Viewer\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/re1_2.png?raw=true)\n\u003e This overlay has a custom, *from scratch* ***IGT tracker, inventory tracker, autosplitter, entity radar and a health hud.***\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/cI4cBudCgV4)\n\n---\n\n***[Game Boy Advance]*** Wario Land 4 - Web Tracker\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/wl4_web_tracker.png?raw=true)\n\u003e This is one of my first ***Java branch testing*** that expose a ***REST API*** and via ***timed calls*** it does ***HTTP queries*** to the backend for gathering game info.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/a_KyjHa1NiI)\n\n---\n\n***[PSX]*** Parasite Eve 2 - SRT (Commission)\n![alt text](https://github.com/elModo7/EmuHook/blob/main/example_images/PE.png?raw=true)\n\u003e This is pretty much the one that started it all when dealing with emulators.\n\u003e I was commissioned to do this for practicing the Parasite Eve II speedrun, it tracks current enemy HP.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/M9eB8EqtNaU)\n\n---\n\n***[PC]*** Resident Evil 1 (1996) - Twitch Crowd Control\n![re1_crowd_control.png](https://github.com/elModo7/EmuHook/blob/main/example_images/re1_crowd_control.png?raw=true)\n\u003e This scripts hooks onto ***Twitch chat*** via IRC and then ***translates commands into in-game actions***, like playing with your inventory, health, enemies, status effects and so on.\n\u003e \n\u003e There are ***programmable cooldowns and multi language support***.\n\u003e \n\u003e [***I have a small demo video here***](https://youtu.be/T4YSzTgq_FU)\n---\nI also made some ***achievement systems*** using EmuHook similar to **Retro Achievements** like in [***this demo***](https://youtu.be/IK_mhlc3ncU).\n\n[Here is a **PS2 demo** video using PCSX2 and Haunting Ground.](https://youtu.be/7HKhcyOGACk)\n\n[Here is a **N64 demo** video using Project64 and Super Mario 64.](https://youtu.be/Q7lDY0NP6_g)\n\n[Here is a **WiiU and PSP demo** video using Cemu and PPSSPP on Zelda Breath of the Wild and God of War.](https://youtu.be/fytC6Ba9JuI)\n\n[Here is a **PS3 and 3DS demo** video using RPCS3 and Azahar on Sonic 4 Episode 1 and Super Mario 3D Land.](https://youtu.be/ywTp84Epl04)\n\n\n---\n\n## My projects using EmuHook\n\n - Pokémon Crystal: **Multiplayer** (You can see other players online real-time on the map)\n\n - Metroid Prime Hunters: Online Player **Health + Points Tracker**.\n\n - Kirby's Dream Land 2: **Animated Real-Time Overlay** (Godot).\n\n - Resident Evil 1: **Auto Splitter** for speedrunning.\n\n - Pokémon Crystal: **Pokemon Home Implementation** (MySQL + REST API Cloud Pokémon Storage System)\n \n - Resident Evil 1: **Real-Time Map**.\n\n- Resident Evil 2: **Health + Inventory HUD**.\n\n - Pokémon Crystal: **Data Mining Tools**.\n\n - Wario Land 4: **Multiplayer + Touch Controls** (Similar to Mario Maker)\n\n- Resident Evil 2: **Achievement System**.\n\n - Pokémon Crystal: **3D Pokémon Web Overlay**.\n\n - Parasite Eve 2: **Enemy Health Tracker** (Commission).\n\n - Pokémon Pinball, Perfect Dark: Emulator **Rumble Support**.\n\n - Super Mario World: Real-Time **Web Stats Tracker** for OBS Overlays.\n\n- Pokémon Fire Red: Speedrun **Tracker**.\n\n- Dino Crisis 2: **Health HUD**.\n\n- Call of Cthulhu Dark Corners of the Earth: **Health + Inventory HUD**.\n\n- Resident Evil 1: **IOT Tuya Home RGB Light Automation** based on in-game Health Status.\n\n- Pokémon Fire Red: **Spinda Pattern** Generator.\n\n - Eternal Darkness: Real-Time Player **Stats Tracker**.\n\n - Pokémon Crystal: **Multi-Instance Shiny Hunting BOT**.\n\n - Resident Evil 1: **Enemy Radar (Godot)**.\n\n - Wario Land 4: **Speedrun Tracker**.\n\n - Resident Evil 1: **Twitch Crowd Control** (Twitch chat can manage inventory, player health, enemies, camera status...)\n\n - Use a **Wii Balance Board** to control the Shinyness of Wild Pokémons.\n\n - Use a **TV Remote** to set in-game values for speedrun practice. \n\n---\n\n## Tools Used\n\nThis project would be nothing without people contributing to theese tools.\n\n - Each and every emulator.\n - [Cheat Engine.](https://github.com/cheat-engine/cheat-engine)\n - [Ghidra.](https://github.com/NationalSecurityAgency/ghidra)\n - [AutoHotkey](https://github.com/AutoHotkey/AutoHotkey/tree/v1.1) \u0026 theese libs:\n\t - [socket.ahk](https://github.com/G33kDude/Socket.ahk)\n\t - [cJSON.ahk](https://github.com/G33kDude/cJson.ahk/tree/main)\n\t - [AHKHTTP.ahk](https://github.com/zhamlin/AHKhttp)\n     - [Neutron.ahk](https://github.com/G33kDude/Neutron.ahk)\n - [Java](https://github.com/openjdk), specially JNI.\n - [Websockify.](https://github.com/novnc/websockify)\n - [Scite4Autohotkey.](https://github.com/fincs/SciTE4AutoHotkey)\n\n---\n\u003e *Some parts of this article have been auto-generated with AI because of lack of free time, however I have revised that the information given here meets the current version specification.*\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felmodo7%2Femuhook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felmodo7%2Femuhook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felmodo7%2Femuhook/lists"}