dwgx@blog:~$dwgx
> cd ../posts

DXSense: Stuffing an ImGui Debug Panel Into the Identity V Process

// created

DXSense injects a DLL into the Identity V process and uses Dear ImGui to draw a debug overlay inside the game, so you can watch process memory in real time, tweak values, and track rendering frame by frame. Identity V runs on DX11, which makes it a solid target to practice on. I only played with it in an offline demo, never touched online matches, and you shouldn’t either. The project stopped back in April 2026; the repo stays up as an archive. Below are the notes from back then.

The whole thing splits in two: a DLL that gets injected, and an injector. The injector takes the most basic route: VirtualAllocEx to write the path, CreateRemoteThread to call LoadLibraryW, and stuff DXSense.dll in. Once the DLL is inside, a few points were on my mind at the time:

  • Do nothing in DllMain — spin up a boot thread and return immediately. Running the whole DX11 init inside the loader lock deadlocks in seconds; you learn that lesson once and never forget it.
  • Don’t hardcode vtable offsets. Build a dummy swapchain with a message-only HWND (D3D11CreateDeviceAndSwapChain), scan Present / ResizeBuffers off the real vtable on the fly, then hook them with MinHook. A hardcoded index table breaks the moment the SDK bumps a version.
  • Input goes through WndProc subclassing. SetWindowLongPtrW only swaps the swapchain’s window — no global SetWindowsHookEx, since that one pollutes every window in the whole session, way too dirty.
  • Hook lifecycle managed with RAII. Everything goes into one HookManager and gets torn down all at once, so no stray MH_* calls leak a hook.
  • Static-link the CRT with /MT to dodge fights with the host process’s MSVC runtime version.

Two things I was fairly happy with. One is the Procedure Fabric: I didn’t want to manage those long-running behaviors with a pile of ad-hoc threads, so I abstracted them into a Loom plus typed Pins plus a Tick flow — engage/disengage is fully declarative, and toggling a behavior stays clean. The other is an embedded Python bridge, so at runtime you can peek / poke / call without recompiling the DLL every time you change an address; you script it right in the panel and try things, which speeds up debugging noticeably.

The render backend layer was abstracted behind IRenderBackend, though in practice I only finished DX11. INSERT toggles the whole overlay. Dependencies are just two: Dear ImGui (docking branch) and MinHook.

The code is All Rights Reserved; it’s public only to show the thinking to people who want to learn the architecture: DLL injection, hook lifecycle, ImGui integration, Procedure Fabric, patterns like these. Don’t take it into online matches to fight anti-cheat, don’t redistribute it, don’t compile it into a finished product and ship it — I’m not covering for you if something goes wrong. Not maintained, not fixed, no PRs. If you want something similar, the kiero / GuidedHacking / MinHook upstream docs explain it more clearly than I do, and rolling your own from scratch is the more reliable path.