MungPlex is a cheat search tool and game enhancer for various emulators and PC games. It allows you to experience and mung up your favorite games in multiple ways - hence the name MungPlex. Version 2.0.0 has re-implemented all features of the depricated repository and comes with some new features. You can also join the affiliated Discord Server (may be renamed).
The following feature illustration also guides you through the general usage of MungPlex.
If the app looks off go to Settings and change the UI scale.
It may happen for MungPlex to be unable to connect to a game. This might be due to changes to the emulator that make MungPlex incapable of finding the emulated RAM and game ID. If this is the case you can reach out to the MungPlex Discord Server and report any problems.
Even though this tool should not cause any damage to your games or system, it is possible to corrupt save data and cause blue screens and therefore result in data loss. It is good to have a backup of your save data and have every opened document and project saved.
It is also possible for flashing lights and sudden loud noises to appear when editing random values. Keep this in mind especially if you are easily startled or suffer from epilepsy.
Also do not use this tool for cheating online in public sessions/rooms! Only losers do that and you may get banned from your game's network.
None of the contributors of this project bear any warranty or responsibility for any damage happening.
- Releases
- Connection
- Memory Viewer
- Search
- Cheats
- Pointer Search
- Watch & Control
- Process Information
- Settings
- Data Conversion
- Compiling
- To Do
- Special Thanks
Find the latest release here
The Connection frame allows you to connect to the supported emulators or any PC game.
On the top-left you will find the tab item Emulator. Below you can select the target emulator from the drop-down menu. As of version 2.0.0 the following emulators and systems are supported:
- Mesen (SNES)
- Project64 (Nintendo 64)
- Dolphin (GameCube, Triforce, Wii, WiiWare)
- Cemu (Wii U)
- Yuzu (Switch) Experimental!
- melonDS (Nintendo DS)
- No$psx (PS1)
- PCSX2 (PS2)
- RPCS3 (PS3)
- PPSSPP (PSP)
- Fusion (Mega Drive, 32X, Mega-CD)
The choice for these emulators was made by considering factors like what other debugging features they offer and how easily the emulated RAM, loaded ROM (for older games) and game information can be found. Therefore an outdated emulator like Fusion has bullet-proof support where on the other hand support for frequently updated emulators like RPCS3 may need to be adjusted from time to time. Multi-platform emulators like RetroArch also make it unnecessarily difficult to find everything needed since it's not only the emulator itself that experiences updates but also the underlying cores.
Before clicking Connect ensure the emulator AND game are running.
Some emulators need special requirements in order to be connected to.
Open Mesen and disable rewind by going to Settings/Preferences/Advanced/
and uncheck Allow rewind to use up to...
. Also apply the contained lua script MungPlex/resources/setMesenMungPlexFlag.lua
: In Mesen navigate to Debug/Script Window/Open Script
and open setMesenMungPlexFlag.lua
. Click the little gear and change the selection of When a script window is opened
to Load the previous script
(needs to be done only once).
Click the play button (arrow pointing to the right) to execute.
Run this script every time you want to connect to Mesen.
The Nintendo Switch uses ASLR (Address space layout randomization) which causes base addresses to be randomized. Therefore no base can be determined and cheats have to be search again every time you start a game. But this should become easier if we find a way to figure out the base address each time.
On the tab bar click the tab labeled Native Application. Under the sub-tab of Application you can select from all windowed applications. There you should find any PC game that is currently running. Alternatively you can select from any process of your PC by clicking the Process tab instead.
If a game crashes or MungPlex has been opened before it, click Refresh List to refresh the process lists. Once a game has been selected click Connect.
Once Connected you can use MungPlex and open the Memory Viewer down below.
A simple memory viewer to view and edit any byte in real-time. To open click Open Memory Viewer in the Connection frame.
Region
: Select the desired memory regionJump to Address
: Jump to Address (d'uh)Read Size
: Change the size of the viewed memory by either typing any hexadecimal value or using the +/- buttons.Options
: Change view optionsEditing
: Simply click the byte(s) you wanna edit and type the desired hex values.
This frame allows for scanning a game's memory for values of several types under any desired conditions.
Here you can specify all value-related configurations.
-
Value Type
: Select the major value type.Primitive
: This covers all common primitive value types (signed/unsigned integers of 1, 2, 4 and 8 bytes, as well as floating point values of single and double precision)Array
: Allows you to specify an array of any length of unsigned integers (1, 2, 4 and 8 bytes). Additionally you can define wildcards (indices to ignore) by simply typing a # for the corresponding index. The hex check-box won't affect the numeral base so you have to prepend 0x for hex values. Example (unsigned int16 array): ´0x1337, 069, 420, #´. 0x1337 (hex), 069 (oct), 420 (dec), # (wildcard)Text
: Allows you to search for text values (strings) of different types of encodings. Currently supported encodings:ASCII
UTF-8
UTF-16 LE
UTF-16 BE
UTF-32 LE
UTF-32 BE
Shift-Jis
Jis X 0201 Full Width
Jis X 0201 Half Width
ISO-8859-1
toISO-8859-16
Color
: Allows you to search for color values. If you don't know what color type certain objects or textures use you may need to try different types.RGB888
: Common 24-bit color value commonly used in 3D gamesRGBA8888
: Same as above but with an additional alpha channelRGB565
: 16-bit color value commonly used in textures of GameCube/Wii gamesRGB5A3
: 16-bit color value with alpha flag commonly used in textures of GameCube/Wii gamesRGBF
: Floating point/HDR variant of RGB888. Commonly used of colors may do smooth transitions like the engine flames in F-Zero GX or ink in SplatoonRGBAF
: Same as RGBF but with an additional alpha channel
-
Primitive/Array/Text/Color Type
: Selections for the subsidiary data types. -
Big Endian
: Check this if the values should be treated as big endian (reversed byte order). The best option is auto-selected but you can always alter this by yourself if needed. -
Signed
: Check this if primitive integral types should be signed. -
Force Alpha
: Some Color types (RGB5A3) feature a color flag and have no dedicate type with its own alpha channel. Therefore forcing the alpha flag might come in handy.
Here you can select the memory ranges to be scanned.
Region
: Select a specific region.Start at (hex)
: Define the address of where the memory scan should start.End at (hex)
: Define the address of where the memory scan should end.Cross-Region
: Checking this will consider scanning all available memory regions. By altering Start at and End at you can skip certain regions.Re-reorder Region
: Some emulators and memory areas may be reordered in 4-byte chunks of the opposite endiannes. If this is the case you may check this. The best option is auto-selected but you can change if needed.Write
: Only accessible when connected to a PC game. This ensures all regions also have write permissions.Exec.
: Only accessible when connected to a PC game. This adds regions with execute permissions to the region list.
Here you can control the memory scan.
-
Counter Iteration
: Select the counter iteration you want to compare against. The last one is always auto-selected so if you happen to make an error during search you can always jump back. -
Alignment
: Specifies the byte alignment of each scanned value. An alignment of 4 is usually the best for any kind of value. Values of type int8 and int16 may use an alignment of 1 or 2 respectively. -
Comparision Type
:- Unknown Value: Compares the following iteration's values against the current/counter iteration ones.
- Known Value: Scans the memory against a specific value
-
Condition Type
:Equal
: Scans for equalityUnequal
: Scans for changed valuesGreater
: Scan for values greater than the current or known valueGreater or Equal
: Scan for values greater than or equal to the current or known valueLower
: Scan for values lower than the current or known valueLower or Equal
: Scan for values lower than or equal to the current or known valueIncreased by
: Scans for values increased by a specific amountDecreased by
: Scans for values decreased by a specific amountValue Between
: Scans for values between 2 specific valuesValue Not Between
: Scans for values outside the range of 2 specific valuesAND
: Scans for values where all true bits are set within the current or known valueOR
: Scans for values where at least one true bit is set within the current or known value
-
Value
: The known value, increment, decrement or range begin to be scanned for. -
Secondary Value
: Range end for range-based seraches. -
Precision (%)
: Accuracy for floating point and color searches. Best is a value of 90 - 100%. -
Cached
: Check if you want previous search results to be held in RAM (not recommended). This may speed up your search but also increases memory usage. -
Values are hex
: Interprets input integral values as hexadecimal. Do not prepend 0x. Results of integrals and arrays are also affected. Arrays to be scanned for are not. -
Case Sensitive
: Whether strings to be searched for should be case sensitive (recommended). Case insensitive searches are slow. -
Color Select
: Use this to select the target color value. -
Color Wheel
: Use color wheel instead of square. -
Pick color from screen
: Allows you to pick any color of the screen by click. -
Search
: Performs a new search or new iteration. -
Reset
: Resets current search.
Here are all results listed. Values can be altered and written back to the game for testing.
Results
: Displays the amount of found values.Address
: The address of the selected results item.Value
: The value of the selected reselts item.Page
: Page navigation through all results. Enter any number to jump to the desired page or click the +/- buttons.Previous
: Check this if you want to poke the previous value to the game.Multi-Poke
: Check this if you want to poke multiple values to the game. To select multiple values hold ctrl (de: strg) and click each item you want. To select a range of results click the first desired item and hold shift while clicking the last one. Sadly there's some bug going on so you might need to click again if the selection didn't update.Poke
: Writes all selected values to the game.Max. results per page
: Specify how many results you want to have been drawn on each page.
This frame allows you to execute cheats of your search results as lua scripts. If you don't know the lua programming language you can check out the official lua reference manual.
In order to interact with games it is necessary to have custom functionalities. In the following you will learn about all additional features required to create MungPlex cheat codes.
The following functions can be used to read data from game memory:
bool ReadBool(uint64 address)
: returns the boolean value located ataddress
of the game's memoryint8 ReadInt8(uint64 address)
: returns the signed 8-bit value located ataddress
of the game's memoryint16 ReadInt16(uint64 address)
: returns the signed 16-bit value located ataddress
of the game's memoryint32 ReadInt32(uint64 address)
: returns the signed 32-bit value located ataddress
of the game's memoryint64 ReadInt64(uint64 address)
: returns the signed 64-bit value located ataddress
of the game's memoryuint8 ReadUInt8(uint64 address)
: returns the unsigned 8-bit value located ataddress
of the game's memoryuint16 ReadUInt16(uint64 address)
: returns the unsigned 16-bit value located ataddress
of the game's memoryuint32 ReadUInt32(uint64 address)
: returns the unsigned 32-bit value located ataddress
of the game's memoryuint64 ReadUInt64(uint64 address)
: returns the unsigned 64-bit value located ataddress
of the game's memoryfloat ReadFloat(uint64 address)
: returns the float value located ataddress
of the game's memorydouble ReadDouble(uint64 address)
: returns the double value located ataddress
of the game's memorytable ReadArrayInt8(const uint64_t address, uint32_t size)
: returns the signed 8-bit array ofsize
located ataddress
of the game's memorytable ReadArrayUInt8(const uint64_t address, uint32_t size)
: returns the unsigned 8-bit array ofsize
located ataddress
of the game's memorytable ReadArrayInt16(const uint64_t address, uint32_t size)
: returns the signed 16-bit array ofsize
located ataddress
of the game's memorytable ReadArrayUInt16(const uint64_t address, uint32_t size)
: returns the unsigned 16-bit array ofsize
located ataddress
of the game's memorytable ReadArrayInt32(const uint64_t address, uint32_t size)
: returns the signed 32-bit array ofsize
located ataddress
of the game's memorytable ReadArrayUInt32(const uint64_t address, uint32_t size)
: returns the unsigned 32-bit array ofsize
located ataddress
of the game's memorytable ReadArrayInt64(const uint64_t address, uint32_t size)
: returns the signed 64-bit array ofsize
located ataddress
of the game's memorytable ReadArrayUInt64(uint64_t address, uint32_t size)
: returns the unsigned 64-bit array ofsize
located ataddress
of the game's memorytable ReadArrayFloat(uint64_t address, uint32_t size)
: returns the float array ofsize
located ataddress
of the game's memorytable ReadArrayDouble(uint64_t address, uint32_t size)
: returns the double array ofsize
located ataddress
of the game's memory
The following functions can be used to write data to game memory:
WriteBool(uint64 address, bool value)
: writes the booleanvalue
toaddress
of the game's memoryWriteInt8(uint64 address, int8 value)
: writes the int8value
toaddress
of the game's memoryWriteInt16(uint64 address, int16 value)
: writes the int16value
toaddress
of the game's memoryWriteInt32(uint64 address, int32 value)
: writes the int32value
toaddress
of the game's memoryWriteInt64(uint64 address, int64 value)
: writes the int64value
toaddress
of the game's memoryWriteFloat(uint64 address, float value)
: writes the floatvalue
toaddress
of the game's memoryWriteDouble(uint64 address, double value)
: writes the doublevalue
toaddress
of the game's memoryWriteArrayInt8(uint64_t address, table array)
: writes the int8array
toaddress
of the game's memoryWriteArrayInt16(uint64_t address, table array)
: writes the int16array
toaddress
of the game's memoryWriteArrayInt32(uint64_t address, table array)
: writes the int23array
toaddress
of the game's memoryWriteArrayInt64(uint64_t address, table array)
: writes the int64array
toaddress
of the game's memoryWriteArrayFloat(uint64_t address, table array)
: writes the floatarray
toaddress
of the game's memoryWriteArrayDouble(uint64_t address, table array)
: writes the doublearray
toaddress
of the game's memory
These functions consecutively write values and increment/decrement those alongside the address as many times as defined by count
. Note that an address increment does not consider the value size. For instance, to consecutively write int32 values the minimum desired address increment would be 4 or -4. Increment values are signed(!). The first write does not apply any increment. If you don't want a value increment just pass a valueIncrement of 0.
fillAndSlideInt8(uint64_t address, int64_t addressIncrement, int8_t value, int8_t valueIncrement, uint8_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
fillAndSlideInt16(uint64_t address, int64_t addressIncrement, int16_t value, int16_t valueIncrement, uint16_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
fillAndSlideInt32(uint64_t address, int64_t addressIncrement, int32_t value, int32_t valueIncrement, uint32_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
fillAndSlideInt64(uint64_t address, int64_t addressIncrement, int64_t value, int64_t valueIncrement, uint32_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
fillAndSlideFloat(uint64_t address, int64_t addressIncrement, float value, float valueIncrement, uint32_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
fillAndSlideDouble(uint64_t address, int64_t addressIncrement, double value, double valueIncrement, uint32_t count)
: consecutively writes value
+ valueIncrement
to address
+ addressIncrement
count
times
LogText(const char* text)
: Logs the giventext
to the log frameLogUInt8(const uint8_t value, bool hex)
: Logs the given uint8value
to the log frame. ifhex
is true printed value will be hexLogUInt16(const uint16_t value, bool hex)
: Logs the given uint16value
to the log frame. ifhex
is true printed value will be hexLogUInt32(const uint32_t value, bool hex)
: Logs the given uint32value
to the log frame. ifhex
is true printed value will be hexLogUInt64(const uint64_t value, bool hex)
: Logs the given uint64value
to the log frame. ifhex
is true printed value will be hexLogInt8(const int8_t value, bool hex)
: Logs the given int8value
to the log frame. ifhex
is true printed value will be hexLogInt16(const int16_t value, bool hex)
: Logs the given int16value
to the log frame. ifhex
is true printed value will be hexLogInt32(const int32_t value, bool hex)
: Logs the given int32value
to the log frame. ifhex
is true printed value will be hexLogInt64(const int64_t value, bool hex)
: Logs the given int64value
to the log frame. ifhex
is true printed value will be hexLogFloat(const float value)
: Logs the given floatvalue
to the log frameLogDouble(const double value)
: Logs the given doublevalue
to the log frameLogBool(const bool value)
: Logs the given boolvalue
to the log frame
- bool
IsInRange(uint64_t value, uint64_t start, uint64_t end)
: Checks if value is >= start and < end. This can be used to verify pointers are within a valid range to prevent possible crashes during loading times <!- - uint64_tGetModuleAddress(char* moduleName)
: returns the address of a processe's module (e.g. GetModuleAddress("mono.dll")) -> copyMemory(uint64_t source, uint64_t destination, uint32_t size)
: copies thesize
bytes of memory located atsource
otdestination
These variables can be used to store and keep values across execution cycles and different cheats.
INTREG00
-INTREG31
: Integer registersNUMREG00
-NUMREG31
: Float registersBOOLREG00
-BOOLREG31
: Boolean registers
Module addresses can be returned by calling the Modules
field and the target module name in brackets. (Modules["mono.dll"])
A list of all saved cheats. Check each one you want to be active.
This can be used to edit an existing cheat or add a new one.
Title
: The Cheat's titleHacker(s)
: Who has made the cheatLua Cheat
: The Lua Cheat scriptDescription
: Description and usage information about the cheatAdd To List
: Adds new cheat to listUpdate Entry
: Updates the currently selected entryDelete Entry
: Deletes the selected cheat from the list
This allows you to convert decrypted cheat codes to Lua. Note that some codes may not work because addresses may be shifted on emulators.
Cheat Format
: Select the input cheat formatCheat to be converted
: The decrypted cheat code you wish to be convertedConvert to Lua
: A button that does what it says
Gives you further control of the cheat(s).
Cheat List/Text Cheat
: Whether to execute all selected cheats or the cheat in the right text field (Lua Cheat)Interval
: How many times a secon the cheat(s) should be executed. If the game visibly overwrites your values you may move the slider to the right.Apply/Terminate Cheats
: Turns cheats on or off. If some syntactical error appears you will be notified bt the log window.
This frame allows scanning memory dumps for pointer paths. The used pointer search engine was developed by BullyWiiPlaza.
Opens a file dialog to add memory dumps to the list.
Starting Address
: The memory dump's virtual starting address.Target Address
: Where the value has been found within the memory dump.Correspondence
: The corresponding Search. 0 = initial, 1 = second, ...
System Preset
: Auto-selects certain settings depending on the selected system.Big Endian
: Whether the memory dumps are big endian (reversed byteorder)Print Visited Addresses
: Additionally print visited addressesPrint Module Names
: Whether to print file/module names instead of initial addressMinimum Offset
: Smallest offset value to be considered. Negative values allowed. A lower value may increase results count but also the scan timeMaximum Offset
: Biggest offset value to be considered. A bigger value may increase results count but also increase scan timeMin. Pointer Depth
: Minimum pointer depth level. A value of 1 means a single pointer redirection is being considered. Values bigger than 1 mean that pointers may redirect to other pointers. This value is usually always 1Max. Pointer Depth
: Maximum pointer depth level. A value of 1 means a single pointer redirection is considered. Values bigger than 1 mean that pointers may redirect to other pointers. This value can be the same as Min. Pointer Depth if you don't want any extra depth. A higher value will increase the results count but also scan timeAddress Width
: Address width of the dump's systemResults File
: Where to save the results fileMax. Pointer Count
: Maximum amount of pointers to be generated. Smaller values may decrease scan time and but also the likeability to find working pointer pathsInput Filetype
: Whether to use Memory Dumps or Pointer MapsClear List
: Clears the dump file listScan
: Performs the pointer scanResults
: Lists all resultsRegion
: Select region to be dumpedDump
: Dump selected region
This window allows for viewing and controlling certain values of various types.
-
New Item's Type
: Select the generic type of value watchIntegral
: Integer typesFloats
: Floating point typesBool
: Boolean valueDIP Switch
: 32-bit DIP Switch
-
Add Item
: Adds a new item of the selected type to the list -
Save List
: Saves list
Title
: Name of the entryActive
: Whether the view is active or notInt/Float Type
: Subsidiary type (not applicable for bools and DIP switches)Delete
: Deletes the entryWrite
: Writes the defined value to the game instead of reading itUse Module
: Use the given module for pointer pathPointer Path
: The Address/Pointer path expression where the target value is locatedTarget Addr Range
: Range the pointer path's final address must be within. Ignored if the path only consists of a single address
Hex
: Whether to view the value as hexValue (no label)
: The current value as either hex or decimalPlot Range
: Minimum and Maximum values to be represented by the histogramProgress Bar/Slider
: If the View is in read mode a Progress bar will be displayed. In Write more a Slider will be available for quick value adjustment
Value (no label)
: Current valuePlot Range
: Minimum and Maximum values to be represented by the histogramProgress Bar/Slider
: If the View is in read mode a Progress bar will be displayed. In Write more a Slider will be available for quick value adjustment
Is Set
: Whether the current boolean value is set
The top-left bit is the least significant bit of the 32-bit DIP. Each entry has a text field to describe what the flag represents
Displays various information about the connected game/process
Define various settings and preferences.
Documents Path
: Where MungPlex saves everything. It is recommended picking a place that is on an SSD for better performance since this tool may handle large filesUI-Scale
: Scale of the app. Change this if it looks offDefault Active Window
Color Theme
Case Sensitive by default
Color Wheel by default
Default Alignment
Values are hex by default
Cached Searches by default
Cheat List by default
Default Interval
A small conversion utility
- Float <-> Hex Conversion: Convert Float/Double to Hex and vice versa
- Change Endianness: Swap the byte order of the selected integer type
- Convert RGB(A) to RGB(A)F, RGB565, RGB5A3 and vice versa
- Convert UTF-8 Text to UTF-16 Little Endian, UTF-16 Big Endian, UTF-32 Little Endian, UTF-32 Big Endian, Shift-Jis, Jis x 0201 Full Width, Jis X 0201 Half Width, ASCII, ISO-8859-1 - 16 and vice versa
Open the project in Visual Studio as "Open as local folder".
Using vcpkg
, make sure to install the following libraries (vcpkg install xxx:x64-windows
):
sol2
(example project)glfw
nlohmann-json
To finally compile and launch MungPlex
, select MungPlex.exe
as startup item and build/debug as usual in Visual Studio.
- General
- Migrate
imgui
to usingvcpkg
(e.g. installimgui[glfw-binding]
) - Texture Streaming
- Corruptor
- Value watch and control
- Migrate
- Search
- Text Types:
JIS X 0208
, Pokemon game text encodings,EUC-KR
,EUC-JP
,EUC-CN
,EUC-TW
,Big5
,base64
, ... - Color types:
RGB332
,RGB444
,RGBA4444
,RGB555
,RGBA5551
,IA8
, ... - Array types: float, double
- Text Types:
- Pointer Search
- Fix potential problems with argument list
- Connection
- Mesen NES support
- More Emulators: Visual Boy Advance, Fusion, Yabause, NullDC, EPSXE, PCSX2, RPCS3, Citra, TeknoParrot, ...
- Cheats
- Syntax Highlighting, more OS functionalities
- Lawn Meower: Idea, code, reverse engineering
- BullyWiiPlaza: Code, Creation of Pointer Search Engine
- Divengerss: Testing, reporting bugs