Launch: An In-Process Memory Editor Written in C++/DX11/ImGui
Launch is a Windows process memory viewer/editor. DX11 backs the window, ImGui draws the UI. Put simply, it’s a bare-bones Cheat Engine: hand it a PID to attach, fill addresses into a table, watch values in real time, and write them back too.
I wrote it to get a solid grip on process memory under Win32. Just reading the docs for ReadProcessMemory / WriteProcessMemory never clicked; rolling my own is what made it stick, and along the way I got to walk through the whole C++ / CMake / ImGui desktop flow. It was never meant to be a product, just practice. Being able to attach to a process and change a game’s HP was enough.
Launching as administrator is a hard requirement. Attaching needs PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, and without elevation most processes just won’t open. The UI is a single table, one address per row, press Enter to add a row. Addresses support three formats:
- Absolute address
0x605FFDA00 - Module + offset
th12.exe+0xB0C44, which looks up the module base first, then adds the offset - Multi-level pointer chain
th12.exe+0xB0C44->0x10->0x20, resolving to the final address one ReadProcessMemory step at a time
The pointer chains follow Cheat Engine’s approach. In games, stable addresses almost always hide behind pointers; hardcode an absolute address and it’s dead the next time you launch the game.
The tech stack is C++20, the GUI is Dear ImGui with the source vendored straight into include/, rendering goes through DX11 + Win32, and it builds under both CMake and VS. For Chinese fonts it looks for msyh → simsun → meiryo, falling back to the default if none are found, so the UI doesn’t turn into a wall of tofu boxes.
The feature set is deliberately minimal: only int read/write, one attached process at a time, no memory scanning, no additional value types, no automatic pointer scanning. The pitfall that stuck with me the most was casing: the repo actually had src/Gui while CMake referenced src/GUI, and on case-sensitive systems it just refused to build. It took me ages to figure out. There’s plenty in the code I could clean up, but I’m not going to rewrite it into a proper tool. I’m leaving it as it was back when I was just starting out with C++.