AppImage 需先 chmod +x 赋予可执行权限才能运行;本地开发安装须用 git clone --recursive 拉取子模块,否则依赖不全;非官方支持发行版(如 AUR、Nixpkgs)的问题不被接受,需先在 AppImage 或受支持发行版复现。
PINCE
korcankaraokcu活跃维护面向 Linux 的逆向工程与内存修改工具,集成调试器、反汇编器、十六进制编辑和代码注入,可像 Cheat Engine 一样搜索修改游戏内存。
Reverse engineering tool for Linux
chmod +x PINCE-x86_64.AppImageREADME 未说明硬件要求;面向 Linux 平台,AppImage 需 Ubuntu 22.04 或更新版本的发行版,本地开发需 Python 3.11+ 与 PyQt 6.11+。
基于 GDB 的 Linux 游戏逆向工程前端,可做内存扫描、调试与代码注入
面向 Linux 的逆向工程与内存修改工具,集成调试器、反汇编器、十六进制编辑和代码注入,可像 Cheat Engine 一样搜索修改游戏内存。
核心能力
- 用 libmemscan 高效扫描内存与指针
- 内置 Linux 原生及 WINE/Proton 兼容的变速齿轮
- 提供 Libpince 脚本引擎,支持代码注入等高级操作
- 支持类 CheatEngine 值类型与 1–64 位 BitField 读写
- 可解剖 Mono/IL2CPP 运行时,浏览类、字段并调用方法
容易踩的坑
- v0.10.2最新正式版2026-09-18 · 2026-09-18 16:22 UTC
Full Changelog: https://github.com/korcankaraokcu/PINCE/compare/v0.10.1...v0.10.2
New Features
Value Editing
- Numeric values can now be entered as basic math expressions, such as
100+20,0x40*2or(15-3)/2.- Works for integer, float and BitField entries, both in the address table and in "Structure View".
- Supports
+,-,*,/and parentheses, with decimal or0xhex numbers.
Memory Viewer
- The disassembly view now supports selecting multiple rows with Ctrl/Shift click and Ctrl+A selects every row currently on screen.
- Copy Address, Bytes, Instruction, Comment and All Columns copy every selected row, one per line.
- Actions that only make sense for a single instruction are disabled while more than one row is selected.
- The selection is now kept when the disassembly view refreshes.
- Copy Address now copies only the address itself instead of the whole column, so breakpoint markers and symbol names are left out.
Sessions
- New "Remember last file save/open across restarts" setting for keeping the directory of the last saved or loaded
.pctfile.- When enabled, the session file dialogs open in that directory again after restarting PINCE.
- Disabled by default and turning it off forgets the stored directory.
- Dialogs fall back to your home directory if the remembered directory no longer exists.
Improvements
Memory Viewer
- Dissect Code now runs inside PINCE instead of GDB.
- The scanned region, current address and reference counts now update while a region is being scanned instead of only when it finishes.
- Cancelling stops the scan directly instead of interrupting GDB and scanning no longer keeps GDB busy.
Scanning
- Toggling the Hex checkbox now converts the value already typed in the scan boxes between decimal and hex instead of rereading the same digits in the other base.
Bug Fixes
Scanning
- Scan input that the current value type can't parse no longer breaks the scan.
- The second scan box is only read by Between scans now, so a leftover value in it can no longer break other scan types.
Memory Viewer
- Disassembly arrows now keep the column they were drawn in when new arrows show up, instead of fanning wider and jumping around on every refresh.
Address Table
- The default "No Description" text in Add Address Manually is now translated instead of always showing in English.
General
- Typing
phase-outorphase-inin the GDB console now does the same work as the attach hotkey, so PINCE follows the new attach state and speedhack is cleaned up before detaching. - The log file is no longer truncated every time GDB's Python scripts load, so
/var/log/pince.logkeeps everything logged during the current run.
- Numeric values can now be entered as basic math expressions, such as
- v0.10.12026-08-08 · 2026-08-08 23:49 UTC
查看更新说明
Just a small hotfix release intended to:
- Fix PINCE crashing on startup in specific shell environments (such as envs where you have bash functions exported or multi line env vars)
- Fix GTK theming not being respected, which was a regression introduced in
v0.10
Bonus: Slimmed down PINCE AppImage size from high 300s to low 200s MBs.
- v0.102026-07-27 · 2026-07-27 09:59 UTC
查看更新说明
Full Changelog: https://github.com/korcankaraokcu/PINCE/compare/v0.9.3...v0.10
IMPORTANT: LIBPINCE SCRIPT API BREAKAGE
v0.10 changes the Libpince ValueType API. Existing scripts that use
VALUE_INDEX, constructtypedefs.ValueType(...), call removed helpers such asutils.parse_stringor use the olddebugcore.read_memory/write_memorysignatures must be updated.Existing
.pctfiles remain compatible, but embedded legacy scripts may fail when run.New Features
BitFields
- Address table entries can now target 1–64 bit fields at any bit offset within the first byte, with unsigned, signed and hexadecimal representations.
- Reads and writes span bytes as needed while preserving the surrounding bits.
- Libpince Engine scripts can use
read_bitfield()andwrite_bitfield()for direct BitField access. .pctfiles containing BitField entries require PINCE v0.10 or newer. Older PINCE versions reject the entire file as invalid.- More info about BitFields here.
Pointer Scanner
- Pointer scans now have a Last Offset option for setting the exact final offset in a pointer path.
Bug Fixes
Scanning
- AOB results now use the right byte length when the pattern has extra spaces or tabs.
- Existing AOB and string results now keep the length they were scanned with after changing the scan input or value type.
- Refreshing, double-clicking or copying a result no longer uses the length from the new scan settings.
Address Table
- Dragging address table entries now refreshes relative addresses after the move and marks the session as changed.
- Create Group now works properly while the address table is sorted.
- Selected rows always go into the new group instead of another row or themselves.
- Clearing the address table now counts as an unsaved session change.
- Editing several rows with different value types now checks the value against every writable selected row before writing anything.
- A bad value can no longer change some rows before failing on another one.
- Browse Memory Region no longer throws an error for unresolved or invalid address table entries.
Structures
- Invalid structure member offsets are no longer treated as zero. Invalid, zero or negative lengths are now rejected.
- Open Structure View windows now close when another process is attached or the current process exits, so they cannot keep using addresses from the old process.
- Recursive structures no longer blow up into huge address table trees that freeze the UI and eat memory.
- A repeated structure type now stops that branch instead of expanding it again.
Sessions
- Keeping a session after switching to a different process now marks it as changed, so the new process name is not quietly lost.
- Choosing not to keep a session while switching processes no longer ties the old session to the new process if saving is cancelled.
- That unsaved changes prompt no longer has the extra Cancel button. Cancelling the file picker cancels the reset and tells you why.
Memory Viewer
- Dissect Code now finds normal x86-64 RIP-relative data and string references instead of treating the offset as a full address.
- After cancelling Dissect Code, the button stays in Cancel mode until the old scan has fully stopped.
- This keeps another scan from starting too early and breaking later cancellation.
- Breakpoint and watchpoint tracker windows now close when switching processes, so an old tracker cannot read or delete breakpoints in the new process.
- Functions Info now clears when the target changes or exits. Late results from the old process are ignored too.
- Cancelling Trace Instructions while it is waiting for the breakpoint now removes the pending breakpoint instead of leaving the trace armed.
Libpince Engine
- Clearing the address table, loading a session or starting a n
- Address table entries can now target 1–64 bit fields at any bit offset within the first byte, with unsigned, signed and hexadecimal representations.
- v0.9.32026-07-18 · 2026-07-18 01:03 UTC
查看更新说明
Full Changelog: https://github.com/korcankaraokcu/PINCE/compare/v0.9.2...v0.9.3
New Features
- Disassembly Reference Arrows: Jump and call references are now drawn as interactive arrows in the Disassembly View.
- Nearby jumps and calls are shown even if you haven't run Dissect Code. Running it adds nearby incoming references too.
- Jump arrows use solid lines and call arrows use dashed lines.
- Hover over an arrow to highlight it and see its source and target. Click it to jump between them.
- Arrows can point towards off-screen callers and targets instead of disappearing at the edge.
- Colors adjust to light, dark and colorblind-friendly themes.
- The disassembly columns are now wider and the upper Memory Viewer pane gets more space by default.
Improvements
Scanning
Speedhack
Bug Fixes
Scanning
- Pointer scans no longer give up on the rest of a memory region after hitting an unreadable hole.
- Filtering and index building are also faster and use less memory.
- WINE/Proton's real .exe will now show up in regions list and be accounted for in normal and pointer scans.
- Previously only
wine-preloaderwould count as the game's.exeinstead of the true executable.
- Previously only
- Pointer scans now work with older WINE games without DEP and their results resolve correctly in the address table.
- PINCE now recognizes their merged PE mappings as modules and resolves bare module names from logical load bases instead of the first mapped region.
- Current scan values now update correctly when they return to the value shown in Previous.
- Failed scans and Undo Scan no longer leave the scan controls stuck or in the wrong state.
- Scan errors are now shown in a dialog and a failed first scan returns to First Scan mode.
- Undo Scan only becomes available after a successful Next Scan.
Address Table
- Address table expressions no longer stay stale after GDB Console commands, Libpince scripts or target stops.
- Grouping a selection that contains both parents and children now keeps their existing hierarchy intact.
- Directional freezes now compare signed integer values correctly.
- Basically, negative values are no longer compared as large unsigned integers.
Structures
- Renaming a structure now updates every member that references it, including self-references.
- Expanded structure pointers now refresh their targets and rebuild child rows when the pointer changes.
Sessions
- [Address table edits made after starting a new session are now tracked properly, so PINCE will
- Disassembly Reference Arrows: Jump and call references are now drawn as interactive arrows in the Disassembly View.
- v0.9.22026-07-01 · 2026-07-01 21:05 UTC
查看更新说明
Full Changelog: https://github.com/korcankaraokcu/PINCE/compare/v0.9.1...v0.9.2
Improvements
Scanning
- Reset regions button has been added inside Manage Scan Regions window.
- Use this new button to reset the removed regions you didn't want removed from the scan list.
General
- DLL injection for WINE/Proton is more reliable, especially under vanilla WINE.
- Libpince Engine code injection template now uses a separate code cave allocation path.
- The new
alloc_caveanddealloc_cavealiases should try to allocate memory near injection site so relative jumps work. - If they can't find free memory close enough for a relative jump,
alloc_cavewill simply return 0 for easy error checking.
- The new
Bug Fixes
Scanning
- Regions no longer get silently dropped during initial scan due to unreadable pages.
- This will result in initial scans gathering more matches (that were being silently skipped) than before.
Mono Dissector
- Fixed Mono Dissector failing sometimes for native Linux targets.
- Also fixed Mono Dissector failing sometimes under vanilla WINE.
Injection
Speedhack
- Fixed speedhack failing to install on hardened kernels.
- Fixed rare speedhack timing underflow issues.
- Improved speedhack install, uninstall and speed-change stability.
- Native Linux targets no longer require stops for changing speed so micro-stutters while holding increase/decrease keybind are gone.
- WINE/Proton still require stops sadly due to the nature of the hook itself so micro-stutters on held keybinds are still present.
Address Table
- Reset regions button has been added inside Manage Scan Regions window.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
PINCE
PINCE is a front-end/reverse engineering tool for the GNU Project Debugger (GDB), focused on games. However, it can be used for any reverse-engineering related stuff. PINCE is an abbreviation for "PINCE is not Cheat Engine".
Read Features part of the project to see what is done and Roadmap part to see what is currently planned. Also, please read Wiki Page of the project to understand how PINCE works.
Feel free to join our discord server!
Browse and download community cheat tables at the PCT-archive!
Disclaimer: Do not trust to any source other than this GitHub repo that claims to have the source code or package for PINCE and remember to report them immediately
Disclaimer: YOU are responsible for your actions. PINCE does NOT take any responsibility for the damage caused by the users
Features
- Memory and pointer scanning: PINCE uses libmemscan to scan the memory efficiently
- Speedhack: Both Linux native and WINE/Proton compatible speedhack built-in. No
LD_PRELOADor other libraries necessary - Libpince Engine: Powerful scripting engine built-in that allows you to perform advanced tasks such as code injection
- Background Execution: PINCE uses background execution by default, allowing users to run GDB commands while process is running
- Variable Inspection & Modification
- CheatEngine-like value type support: Currently supports all types of CE and memscan along with extended strings(utf-8, utf-16, utf-32)
- BitField support: Similarly to CE's
Binary, read and edit 1–64 bit fields at any bit offset as signed, unsigned or hexadecimal values without altering surrounding bits - Symbol Recognition: See here
- Automatic Variable Allocation: See here
- Dynamic Address Table: Supports drag&drop, recursive copy&pasting&inserting and many more
- Smart casting: PINCE lets you modify multiple different-type values together as long as the input is parsable. All parsing/memory errors are directed to the terminal
- Variable Locking: PINCE lets you freeze(constantly write a value to memory cell) variables
- Sessions: Save and restore your work as a session file (
.pct), including the address table, bookmarks, free-form session notes and structures. You can browse and share these tables in the community PCT-archive - Memory View
- Assembler: PINCE uses keystone engine to assemble code on the fly
- Dissect Code: You can dissect desired memory regions to find referenced calls, jumps and strings. Disassemble screen will automatically handle the referenced data and show you if there's a referenced address in the current disassemble view. It can be used from
Tools -> Dissect Codein the MemoryView window. Using its hotkey instead in the MemoryView window automatically dissects the currently viewed region. You can separately view referenced calls and strings after the search fromView -> Referenced Calls/Strings. Note: If you decide to uncheck 'Discard invalid strings' before the search, PINCE will try to search for regular pointers as well - Bookmarking: Bookmark menu is dynamically created when right clicked in the disassemble screen. PINCE also lets you set an unlimited number of bookmarks. List of bookmarks can also be viewed from
View -> Bookmarksin the MemoryView window. Commenting on an address automatically bookmarks it - Modify on the fly: PINCE lets you modify registers on the fly. Check GDB expressions in the Wiki page for additional information
- Instructions Search: You can search instructions with python regular expressions. To use this feature, click
Tools -> Search Instructionsin the MemoryView window - Search Functions: Search the target's defined functions and symbols with python regular expressions and jump straight to their addresses. Click
View -> Functionsin the MemoryView window - Memory Regions: View the target's memory map and jump to any of its regions. Click
View -> Memory Regionsin the MemoryView window - Restore Instructions: Revert instructions you've assembled over back to their original bytes. Click
View -> Restore Instructionsin the MemoryView window - Call Function: Call a function inside the target process with a GDB expression and inspect its return value. Click
Tools -> Call Functionin the MemoryView window
- Mono/IL2CPP Dissection
- Dissect the managed runtime of Mono and IL2CPP games. Browse classes along with their fields and methods, read static and instance field values, and drill into nested types. Accessible from
Tools -> Dissect Mono/IL2CPPin the MemoryView window. Works for both Linux native and WINE/Proton processes - Find Instances: Locate live instances of a class in the target process
- Invoke Methods: Call methods directly on a chosen instance and inspect the returned value
- Export to Structures: Turn a dissected class into a PINCE structure for reuse
- Dissect the managed runtime of Mono and IL2CPP games. Browse classes along with their fields and methods, read static and instance field values, and drill into nested types. Accessible from
- Structures: Define and view memory structures with named, typed members. Build them by hand or generate them automatically from a dissected Mono/IL2CPP class, then overlay them on any address to inspect memory through the structure
- Debugging
- Has basic debugging features such as stepping, stepping over, execute till return, break, continue. Also has breakpoints, watchpoints and breakpoint conditions. Has advanced debugging utilities such as Watchpoint/Breakpoint Tracking and Tracing
- Chained Breakpoints: Just like CE, PINCE allows you to set multiple, connected breakpoints at once. If an event(such as condition modification or deletion) happens in one of the breakpoints, other connected breakpoints will get affected as well
- Watchpoint Tracking: Allows you to see which instructions have been accessing to the specified address, just like "What accesses/writes to this address" feature in CE
- Breakpoint Tracking: Allows you to track down addresses calculated by the given register expressions at the specified instruction, just like "Find out what addresses this instruction accesses" feature in CE with a little addon, you can enter multiple register expressions, this allows you to check the value of "esi" even if the instruction is something irrelevant like "mov [eax],edx"
- Tracing: Almost the same with CE. But unlike CE, you can stop tracing whenever you want. Created from scratch with custom features instead of using gdb's built-in trace commands, this allows tracing to be done without the need of a gdbserver
- Collision Detection: GDB normally permits setting unlimited watchpoints next to each other. But this behaviour leads to unexpected outcomes such as causing GDB or the inferior become completely inoperable. GDB also doesn't care about the number(max 4) or the size(x86->max 4, x64->max 8) of hardware breakpoints. Fortunately, PINCE checks for these problems whenever you set a new breakpoint and detects them before they happen and then inhibits them in a smart way. Lets say you want to set a breakpoint in the size of 32 bytes. But the maximum size for a breakpoint is 8! So, PINCE creates 4 different breakpoints with the size of 8 bytes and then chains them for future actions
- Stack Trace: View the call stack of the stopped thread along with the return and frame addresses of each frame. Click
View -> StackTrace Infoin the MemoryView window - Signal Handling: Configure how the inferior handles each signal, choosing whether GDB stops on it and whether it's passed on to the program, just like GDB's
handlecommand. Accessible from PINCE's Settings
- Code Injection
- Run-time injection: Both native
.soinjection and WINE/Proton DLL injection are supported. In the MemoryView window, clickTools -> Inject .so fileorTools -> Inject DLL fileto select the file
- Run-time injection: Both native
- GDB Console: You can use the GDB Console to interact with GDB, it's on the top right in main window
- libpince library: PINCE provides a reusable python library. You can either read the code or check the Github Pages for documentation. Additionally, libpince can be used via console by following these instructions.
Installing and running PINCE
Users
No need to install anything. Just grab the latest AppImage over at Releases and mark it as executable. You can then double click on the AppImage or run it through terminal, however you prefer.
To mark as executable, either:
- Run the following command in terminal in the same folder as the downloaded AppImage:
chmod +x PINCE-x86_64.AppImage - Or you can right-click on the AppImage, click on Properties and tick "Allow this file to run as a program" under "Permissions"
- The last step might be different depending on your desktop environment, but most of them should have similar words so just make sure to edit permissions to allow running as executable.
Developers and Contributors
- If you want to have a local install of PINCE so you can modify code or contribute with PRs, you'll have to use our installer script in the repo to setup a venv dev environment or do it yourself.
- To install local dev environment, run the following commands in a terminal anywhere you'd like to have the PINCE folder:
git clone --recursive https://github.com/korcankaraokcu/PINCE
sh PINCE/install.sh
- Make sure to check our Officially supported platforms section below. Our installer might not work on distros that are not listed there, but it will still try to install using some package managers, just follow the on-screen instructions.
- If installer fails trying to install on an unsupported distro, you're on your own on trying to get the local dev environment up and running. Check
install.shto get an idea about what you might need. - If you'd like to uninstall PINCE, just delete this folder, almost everything is installed locally. Config and user files of PINCE can be found in "~/.config/PINCE", you can manually delete them as well if you want.
Notes
- Check https://github.com/korcankaraokcu/PINCE/issues/116 for a possible fix if you encounter
'GtkSettings' has no property named 'gtk-fallback-icon-theme'
Officially supported platforms
AppImage
Our AppImage should run on any distro that is as new or newer than Ubuntu 22.04. Anything older than this might not work and is not officially supported.
Local dev
Local dev installs of PINCE should technically run on any distro that comes with Python 3.11+ and PyQt 6.11+ installed or available in the package manager, but below is the list of distros that we officially support, as in we actively test on these and help with issues:
- Kubuntu 22.04+
- Arch Linux (Not AUR)
Additionally the distros below are "partially" supported as our installer will try to install on them but they're not actively tested:
- Debian 12+ (or Testing)
- Fedora 35+
- OpenSUSE
Notes
- If you encounter issues installing local dev and you're on one of these distros, feel free to open a PR fixing the installation process for your platform.
- If your distro has any of the above as its base, you can still try to use the installer anyway and pick the relevant package manager. If this still does not work then sorry, you're on your own.
- DO NOT open issues if you cannot repro using a local dev build on a supported distro from above or AppImage!
- This includes AUR or NIXPKGS. We don't care about the issues present on these packaged versions unless you can repro them on AppImage (or also local dev if you're on Arch).
Contributing
Want to help? Check out CONTRIBUTING.md
License
GPLv3+. See COPYING file for details