{"id":19363,"date":"2026-05-01T13:36:00","date_gmt":"2026-05-01T11:36:00","guid":{"rendered":"https:\/\/www.corelan.be\/?p=19363"},"modified":"2026-05-01T18:12:49","modified_gmt":"2026-05-01T16:12:49","slug":"mona-v3-released","status":"publish","type":"post","link":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/","title":{"rendered":"Mona v3 Released: \u26a1 Faster   \ud83c\udfaf Leaner   \u2699\ufe0f Broader"},"content":{"rendered":"\n<h2>Long overdue...<\/h2>\n<p>Woohoo! It (finally) happened!<\/p>\n<p>I'm really proud to announce the release of <strong>mona v3<\/strong>!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: block; margin-left: auto; margin-right: auto;\" title=\"monav3 ascii glow.png\" src=\"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/monav3-ascii-glow.png\" alt=\"Monav3 ascii glow\" width=\"600\" height=\"198\" border=\"0\" \/><\/p>\n<p>This release has been a long time in the making.<br \/>\nWhile it still builds on some of the solid foundations of earlier versions, substantial parts of the codebase have been completely reworked, refactored, and modernized.<\/p>\n<p>The result is a cleaner and broader version of mona, with improved compatibility and a more consistent runtime across supported environments.<\/p>\n<h2>What\u2019s new<\/h2>\n<h3>The good news<\/h3>\n<p>This new version is not only faster and leaner, it also brings a broader and more flexible runtime:<\/p>\n<ul>\n<li>Full support for Python 2 <em>and<\/em> Python 3. We do recommend running mona on <strong>Python3<\/strong><\/li>\n<li>Runs on WinDBG, WinDBGX, and Immunity Debugger<\/li>\n<li>Works with both 32-bit and 64-bit processes<\/li>\n<li>Uses a more recent pykd library and the pykd-ext bootstrapper<\/li>\n<\/ul>\n<p>Additionally, mona v3:<\/p>\n<ul>\n<li>Relies less on pykd's access to symbols to run.  Mona now natively does most of the heavy lifting, in a lot of areas of the process (modules, heap, etc).<\/li>\n<li>Allows us to specify addresses, registers, symbol names, dereferenced registers with offsets, module names etc any time you can specific an address as an argument<\/li>\n<li>Has improved table-based output<\/li>\n<li>Features significant performance improvements in certain time-consuming routines (such as <mono>mona rop<\/mono>)<\/li>\n<li>Helps you manage symbols, clean up unwanted disk space consumption caused by failed symbol file downloads<\/li>\n<li>Has an improved wildcard search routine (<mono>findwild<\/mono>)<\/li>\n<li>Shows an eta for long-running actions and searches<\/li>\n<li>Allows you to interrupt long-running searches without killing your debugging session.<\/li>\n<li>Uses clickable links in some output, making use and navigation even easier<\/li>\n<\/ul>\n<p>The vast majority of existing <mono>mona<\/mono> commands remain available, and - as suggested in the list above - many have been improved in terms of behavior, stability, compatibility and\/or performance. <\/p>\n<p>The overall goal remains unchanged: to deliver <strong>high-quality, actionable output out of the box<\/strong>, while still allowing detailed control over search scope and behavior. <\/p>\n<p>In addition, mona v3 includes a number of new features and commands.<br \/>\nSome of those will be covered in more detail in follow-up posts.<\/p>\n<p>So, that's the good news.<\/p>\n<h3>Less-than-ideal news<\/h3>\n<p>There is also some less encouraging news to share.<\/p>\n<p>When I started developing the first version of <mono>mona.py<\/mono> back in 2011, the primary goal was simple: make the tool easy to use and capable of producing actionable results out of the box. It was designed to run on a default installation of Python 2 together with Immunity Debugger \u2014 no additional libraries required.<\/p>\n<p>Later, when adding support for WinDBG, that principle had to be relaxed with the introduction of the <mono>pykd<\/mono> library.<\/p>\n<p>Today, as part of the ongoing effort to bring more functionality into 64-bit debugging sessions, I ran into another limitation: WinDBG(X) does not natively support assembling 64-bit mnemonics.<\/p>\n<p>Crazy, right? \ud83e\udd37\ud83c\udffc\u200d\u2642\ufe0f<\/p>\n<p>Since <mono>pykd<\/mono> depends on WinDBG and doesn't have its own built-in assembler, this created a new challenge: <em>how to provide reliable 64-bit assembly capabilities without building and maintaining a custom assembler myself?<\/em><\/p>\n<p>An initial attempt involved building a cache of commonly used instructions. However, while working on improvements to the <mono>findwild<\/mono> wildcard search command, it quickly became clear that this approach would not scale in a practical or maintainable way.<\/p>\n<p>For now, the solution is to rely on the <mono>keystone-engine<\/mono> library.<br \/>\nTo get the most out of <mono>mona.py<\/mono> on 64-bit targets, you will need to install <mono>keystone-engine<\/mono> via pip.<br \/>\nWhen installed, <mono>windbglib<\/mono> will automatically import and use it.<br \/>\nIf not, it will fall back to the limited instruction cache and whatever WinDBG provides.<br \/>\nEven on 32-bit targets, <mono>windbglib<\/mono> will prefer Keystone if it is present before falling back to WinDBG\u2019s native assembler.<\/p>\n<p>That said, it appears the Keystone project is no longer actively maintained. Still, that didn\u2019t stop us from using <mono>pykd<\/mono> either.<\/p>\n<p>If you are aware of viable alternatives \u2014 ideally a lightweight, actively maintained assembler library with solid 32-bit and 64-bit support and easy installation via pip on Python 3.9+ \u2014 feel free to reach out.<\/mono><\/p>\n<h2>Acknowledgements<\/h2>\n<p>Before we dive into the practical side, I want to take a moment to give credit where it\u2019s due.<\/p>\n<p>A huge thank you to <a href=\"https:\/\/github.com\/apl3b\" target=\"_blank\" rel=\"noopener\">@apl3b<\/a> for his dedication, persistence, and high-quality work.<\/p>\n<p>He rewrote significant parts of the core routines, improved performance across multiple areas, and introduced several new features and commands.<\/p>\n<p>This release would not be what it is without his contribution.<\/p>\n<p>I would also like to thank <a href=\"https:\/\/github.com\/angelo5d0\"  target=\"_blank\" rel=\"noopener\">angelo5d0<\/a> for his help testing the various features and commands in the updated mona\/windbglib codebase.<\/p>\n<h2>Prerequisites<\/h2>\n<p>Before installing mona v3, it\u2019s worth making sure your environment is clean and ready.<\/p>\n<h3>Cleaning up<\/h3>\n<p>If you have older versions of <mono>mona<\/mono> lying around, now is a good time to remove them.<\/p>\n<ul>\n<li>Delete existing <mono>mona.py<\/mono> and <mono>windbglib.py<\/mono> copies from your debugger directories<\/li>\n<li>Remove the <mono>pykd.pyd<\/mono> file from your WinDBG Program folder as well<\/li>\n<li>Remove any Python installations that you're not using or plan on using<\/li>\n<\/ul>\n<p>Starting clean helps avoid subtle issues later on.<\/p>\n<h3>Installing dependencies<\/h3>\n<h4>Python 3.9 + PyKD + bootstrapper + libraries<\/h4>\n<p>The <a href=\"https:\/\/github.com\/corelan\/mona3\"  target=\"_blank\" rel=\"noopener\">mona3 github repo<\/a> contains the full setup instructions. <\/p>\n<p>The main prerequisites are:<\/p>\n<ul>\n<li>Python3.9.13 (32bit and 64bit) - that's the most recent Python3 version that ships the PyKD Python library version via pip<\/li>\n<li>The corresponding PyKD Python library for both Python architectures<\/li>\n<li>PyKD-ext WinDBG Extension, used as bootstrapper.<\/li>\n<li>The keystone-engine Python library for both Python architectures<\/li>\n<\/ul>\n<p>You can have other Python 3 versions installed on the system, but please note that mona won't run in a Python version that doesn't have the pykd library. <\/p>\n<p>The <a href=\"https:\/\/github.com\/corelan\/CorelanTraining\"  target=\"_blank\" rel=\"noopener\">CorelanTraining github repository<\/a> contains a <mono>CorelanPyKDInstall.ps1<\/mono> powershell script that will  install all of the aforementioned components. I recommend using the script and carefully checking the output for errors.<br \/>\nThe script has been tested on a handful of virtual machines, Windows 10 and Windows 11.  Make sure your machines are up-to-date and everything should run smoothly.<\/p>\n<p>Of course, you can also install all required components by hand.<br \/>\nIn that case, I'd like to refer you to the corresponding procedure as documented in <a href=\"https:\/\/www.corelan.be\/index.php\/2026\/04\/17\/debugging-windbgx-automation-scripting-part-1\/\"  target=\"_blank\" rel=\"noopener\">this blogpost on WinDBG Automation and Scripting<\/a>.  (Check out the section on PyKD.)<\/p>\n<p>Note: That procedure does not cover how to install keystone-engine. That means you'll have to add the following 2 steps to the procedure:<\/p>\n<pre><cmd>py -3.9-32 -m pip install keystone-engine<\/cmd><\/pre>\n<p>and<\/p>\n<pre><cmd>py -3.9-64 -m pip install keystone-engine<\/cmd><\/pre>\n<h4>Feeling adventurous?<\/h4>\n<p>A few days after publishing my <a href=\"https:\/\/www.corelan.be\/index.php\/2026\/04\/17\/debugging-windbgx-automation-scripting-part-1\/\"  target=\"_blank\" rel=\"noopener\">blog post on WinDBG automation<\/a>, I received a message on X from <a href=\"https:\/\/x.com\/gerhart_x\"  target=\"_blank\" rel=\"noopener\">@gerhart_x<\/a>.<br \/>\nHe explaineded that he managed to compile pykd against Python 3.14.  You can find the release <a href=\"https:\/\/github.com\/gerhart01\/Hyper-V-scripts\/releases\/tag\/pykd-python3.14\"  target=\"_blank\" rel=\"noopener\">here<\/a>.<br \/>\nSo in theory, it means you may be able to install Python 3.14 and load the corresponding pykd.dll<\/p>\n<h2>Installing mona.py<\/h2>\n<h3>Putting mona.py and windbglib.py in the right place<\/h3>\n<p>With mona3, you still have the option to put both <mono>mona.py<\/mono> and <mono>windbglib.py<\/mono> inside your WinDBG program folder.<\/p>\n<p>However, we're proposing a different approach now.<\/p>\n<p>The mona3 GitHub repository <a href=\"https:\/\/github.com\/corelan\/mona3#22-centralized-installation-recommended\"  target=\"_blank\" rel=\"noopener\">has instructions on performing a centralized installation<\/a>, which involves creating a local folder.<\/p>\n<p>We're using <mono>C:\\Tools\\mona3<\/mono> in the documentation, but you can obviously put it anywhere you'd like. <\/p>\n<p>Both <mono>mona.py<\/mono> and <mono>windbglib.py<\/mono> should reside in the same folder. <\/p>\n<p>Of course, you can also simply perform a <mono>git clone https:\/\/github.com\/corelan\/mona3.git<\/mono> into <mono>C:\\Tools<\/mono> if you'd like.  That will also create the mona3 folder and put all the files from the repository inside that folder.  (which is a bit overkill really, we only need the 2 python files)<br \/>\nWhatever you do, just take note of the full path of <mono>mona.py<\/mono> and make sure <mono>windbglib.py<\/mono> sits in the same folder.  We'll need the full path to run <mono>mona<\/mono> in WinDBG.<\/p>\n<p>A centralized setup simplifies maintance. Whenever you decide to run <mono>!mona up<\/mono>, it will update the scripts for all debuggers using it.<\/p>\n<p>In WinDBG and WinDBGX, the <mono>mona.py<\/mono> script is referenced via its full path.  We'll have the ability to use WinDBG aliases to provide us with the ability to just run <mono>!mona<\/mono> (instead of having to type the full path every time). We'll talk about this in a moment.<\/p>\n<p>In Immunity Debuger, a symbolic link can be used to make <mono>mona.py<\/mono> appear in the <mono>PyCommands<\/mono> folder.  That way, we can invoke <mono>mona<\/mono> just like before, by running <mono>!mona<\/mono>.<\/p>\n<p>From an admin command prompt:<\/p>\n<pre>C:\\><cmd>mklink \"c:\\Program Files (x86)\\Immunity Inc\\Immunity Debugger\\PyCommands\\mona.py\" C:\\Tools\\mona3\\mona.py<\/cmd>\nsymbolic link created for c:\\Program Files (x86)\\Immunity Inc\\Immunity Debugger\\PyCommands\\mona.py &lt;&lt;===&gt;&gt; C:\\Tools\\mona3\\mona.py<\/pre>\n<h3>mona.ini<\/h3>\n<p>Mona uses a <mono>mona.ini<\/mono> file to store certain configurations.<br \/>\nIf you already had a mona.ini file present on your system and discovered by mona3, it will be moved over into the folder that contains <mono>mona.py<\/mono>.<br \/>\nIn other words, everything will be centralized in one place.<\/p>\n<h2>Running mona.py<\/h2>\n<p>Once installed, running mona should feel familiar.<\/p>\n<p>In WinDBG \/ WinDBGX, load the <mono>pykd<\/mono> bootstrapper:<\/p>\n<pre><cmd>!load pykd<\/cmd><\/pre>\n<p>(unlike what we did with previous versions of mona, we're <strong>not<\/strong> loading <mono>pykd.pyd<\/mono>!   We're loading <mono>pykd.dll<\/mono> instead.<\/p>\n<p>Next, execute mona using Python 3.9:<\/p>\n<pre><cmd>!py -3.9 C:\\Tools\\mona3\\mona.py<\/cmd><\/pre>\n<p>If multiple Python versions are installed, specifying 3.9 avoids ambiguity. The debugger will automatically use the correct architecture.<\/p>\n<p>As indicated above, we can make our lives easier by creating the following alias:<\/p>\n<pre><cmd>as !mona !py -3.9 C:\\Tools\\mona3\\mona.py<\/cmd><\/pre>\n<p>This now allows us to run<\/p>\n<pre><cmd>!mona<\/cmd><\/pre>\n<p>As <a href=\"https:\/\/github.com\/corelan\/mona3?tab=readme-ov-file#32-auto-loading-pykd-and-creating-an-alias-in-windbgx\"  target=\"_blank\" rel=\"noopener\">explained in the documentation<\/a>, you can have WinDBG execute the required commands to load pykd and set up the alias automatically.<\/p>\n<p>From there, all your usual commands are available \u2014 only now faster, more consistent, and working across more environments.<\/p>\n<h2>mona commands<\/h2>\n<p>First and foremost, the Mona3 Github repository has a <a href=\"https:\/\/github.com\/corelan\/mona3\/wiki\"  target=\"_blank\" rel=\"noopener\">wiki<\/a> which has up-to-date documentation for every available command and global search options.<\/p>\n<p>The table below provides a current (and possibly outdated) overview of the available <mono>mona.py<\/mono> commands at the moment of release.<br \/>\nAs commands may be removed, changed or added, please check the actual list of commands on your system to see what options you have.<br \/>\nJust like before, when running <mono>!mona<\/mono> without arguments, you'll see the Global Options, followed by a table of available commands.<br \/>\nThe commands are filtered by architecture and debugger type.<\/p>\n<p>Run <mono>!mona<\/mono> without arguments to see the commands that are available on your debugger \/ architecture combination.<\/p>\n<table class=\"corelan-table\">\n<thead>\n<tr>\n<th>Command \/ Alias<\/th>\n<th>x86<\/th>\n<th>x64<\/th>\n<th>Info<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><mono>?<\/mono> \/ <mono>eval<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Evaluate expression<\/td>\n<\/tr>\n<tr>\n<td><mono>allocmem<\/mono> \/ <mono>alloc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>Allocate memory<\/td>\n<\/tr>\n<tr>\n<td><mono>assemble<\/mono> \/ <mono>asm<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Assemble instructions. \u26a0\ufe0f Needs keystone-engine on x64<\/td>\n<\/tr>\n<tr>\n<td><mono>bpseh<\/mono> \/ <mono>sehbp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\ud83d\udd32<\/td>\n<td>x64: No SEH on stack<\/td>\n<td>Set breakpoint on SEH funcs (stack)<\/td>\n<\/tr>\n<tr>\n<td><mono>breakfunc<\/mono> \/ <mono>bf<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Breakpoint on function<\/td>\n<\/tr>\n<tr>\n<td><mono>breakpoint<\/mono> \/ <mono>bp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Manage breakpoints<\/td>\n<\/tr>\n<tr>\n<td><mono>bytearray<\/mono> \/ <mono>ba<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Create bytearray<\/td>\n<\/tr>\n<tr>\n<td><mono>changeacl<\/mono> \/ <mono>ca<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>Change memory protection<\/td>\n<\/tr>\n<tr>\n<td><mono>cleanlog<\/mono> \/ <mono>clean<\/mono> \ud83c\udd95<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Free up diskspace by cleaning old log files<\/td>\n<\/tr>\n<tr>\n<td><mono>compare<\/mono> \/ <mono>cmp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Compare memory with contents of a file<\/td>\n<\/tr>\n<tr>\n<td><mono>config<\/mono> \/ <mono>conf<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Config settings<\/td>\n<\/tr>\n<tr>\n<td><mono>copy<\/mono> \/ <mono>cp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Copy memory<\/td>\n<\/tr>\n<tr>\n<td><mono>dump<\/mono> \/ <mono>dmp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Dump memory<\/td>\n<\/tr>\n<tr>\n<td><mono>dumplog<\/mono> \/ <mono>dl<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>Dump log file<\/td>\n<\/tr>\n<tr>\n<td><mono>dumpobj<\/mono> \/ <mono>do<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>Dump object<\/td>\n<\/tr>\n<tr>\n<td><mono>egghunter<\/mono> \/ <mono>egg<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2013<\/td>\n<td><\/td>\n<td>Create egghunter<\/td>\n<\/tr>\n<tr>\n<td><mono>encode<\/mono> \/ <mono>enc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2013<\/td>\n<td><\/td>\n<td>Encode payload<\/td>\n<\/tr>\n<tr>\n<td><mono>filecompare<\/mono> \/ <mono>fc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Compare files<\/td>\n<\/tr>\n<tr>\n<td><mono>fillchunk<\/mono> \/ <mono>fchunk<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Fill (overwrite) a heap chunk<\/td>\n<\/tr>\n<tr>\n<td><mono>find<\/mono> \/ <mono>f<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find pattern (bytes, strings, pointers, etc)<\/td>\n<\/tr>\n<tr>\n<td><mono>findmsp<\/mono> \/ <mono>findmsf<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find cyclic offset on stack and registers<\/td>\n<\/tr>\n<tr>\n<td><mono>findwild<\/mono> \/ <mono>fw<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Powerful wildcard search. \u26a0\ufe0f Needs keystone-engine on x64<\/td>\n<\/tr>\n<tr>\n<td><mono>fwptr<\/mono> \/ <mono>fwp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2013<\/td>\n<td><\/td>\n<td>Find writeable ptr that gets called<\/td>\n<\/tr>\n<tr>\n<td><mono>geteat<\/mono> \/ <mono>eat<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>List\/Query EAT<\/td>\n<\/tr>\n<tr>\n<td><mono>getiat<\/mono> \/ <mono>iat<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>List\/Query IAT<\/td>\n<\/tr>\n<tr>\n<td><mono>getpc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Produce GetPC code<\/td>\n<\/tr>\n<tr>\n<td><mono>gflags<\/mono> \/ <mono>gf<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Show active global flags<\/td>\n<\/tr>\n<tr>\n<td><mono>header<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Parse a file and transform it into python code that generates it<\/td>\n<\/tr>\n<tr>\n<td><mono>heap<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Heap analysis. (work in progress!)<\/td>\n<\/tr>\n<tr>\n<td><mono>help<\/mono> \/ <mono>h<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Show help<\/td>\n<\/tr>\n<tr>\n<td><mono>info<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Show info about a given address<\/td>\n<\/tr>\n<tr>\n<td><mono>infodump<\/mono> \/ <mono>if<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Dump process contents for comparison<\/td>\n<\/tr>\n<tr>\n<td><mono>jmp<\/mono> \/ <mono>j<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find 'JMP' to register trampoline<\/td>\n<\/tr>\n<tr>\n<td><mono>jop<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find JOP gadgets<\/td>\n<\/tr>\n<tr>\n<td><mono>jseh<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\ud83d\udd32<\/td>\n<td>x64: no SEH on stack<\/td>\n<td>Find SEH trampolines outside of modules (may not be executable!)<\/td>\n<\/tr>\n<tr>\n<td><mono>load<\/mono> \/ <mono>ld<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Load file and copy contents to a memory location<\/td>\n<\/tr>\n<tr>\n<td><mono>moduleinfo<\/mono> \/ <mono>modinfo<\/mono> \ud83c\udd95<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Module details<\/td>\n<\/tr>\n<tr>\n<td><mono>modules<\/mono> \/ <mono>mod<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>List modules<\/td>\n<\/tr>\n<tr>\n<td><mono>offset<\/mono> \/ <mono>os<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Calc offset<\/td>\n<\/tr>\n<tr>\n<td><mono>pageacl<\/mono> \/ <mono>pacl<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Process layout and permissions (pages)<\/td>\n<\/tr>\n<tr>\n<td><mono>pattern_create<\/mono> \/ <mono>pc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Create pattern<\/td>\n<\/tr>\n<tr>\n<td><mono>pattern_offset<\/mono> \/ <mono>po<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find pattern offset<\/td>\n<\/tr>\n<tr>\n<td><mono>peb<\/mono> \/ <mono>peb<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Show address of PEB<\/td>\n<\/tr>\n<tr>\n<td><mono>proclayout<\/mono> \/ <mono>pl<\/mono> \ud83c\udd95<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Process layout (entities)<\/td>\n<\/tr>\n<tr>\n<td><mono>rop<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find ROP gadgets<\/td>\n<\/tr>\n<tr>\n<td><mono>ropfunc<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find interesting functions for ROP in module IATs<\/td>\n<\/tr>\n<tr>\n<td><mono>seh<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\ud83d\udd32<\/td>\n<td>x64: no SEH on stack<\/td>\n<td>Find trampolines for SEH overwrite<\/td>\n<\/tr>\n<tr>\n<td><mono>sehchain<\/mono> \/ <mono>exchain<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\ud83d\udd32<\/td>\n<td>x64: no SEH on stack<\/td>\n<td>Get SEH chain (stack)<\/td>\n<\/tr>\n<tr>\n<td><mono>skeleton<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Exploit skeleton<\/td>\n<\/tr>\n<tr>\n<td><mono>stackpivot<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find stackpivots<\/td>\n<\/tr>\n<tr>\n<td><mono>stacks<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>List stacks for all threads<\/td>\n<\/tr>\n<tr>\n<td><mono>string<\/mono> \/ <mono>str<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Read\/Write a string from\/to memory<\/td>\n<\/tr>\n<tr>\n<td><mono>stringpos<\/mono> \/ <mono>strpos<\/mono> \ud83c\udd95<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Find position of content at address in ascii\/unicode string in memory<\/td>\n<\/tr>\n<tr>\n<td><mono>suggest<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Suggest exploit (create metasploit module) (needs stack corruption with cyclic pattern)<\/td>\n<\/tr>\n<tr>\n<td><mono>sym<\/mono> \ud83c\udd95<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>List, fetch & clean symbols<\/td>\n<\/tr>\n<tr>\n<td><mono>teb<\/mono> \/ <mono>teb<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Show address of TEB<\/td>\n<\/tr>\n<tr>\n<td><mono>tobp<\/mono> \/ <mono>2bp<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>WinDBG only<\/td>\n<td>Convert to bp<\/td>\n<\/tr>\n<tr>\n<td><mono>unicodealign<\/mono> \/ <mono>ua<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2013<\/td>\n<td><\/td>\n<td>Unicode align<\/td>\n<\/tr>\n<tr>\n<td><mono>update<\/mono> \/ <mono>up<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Update mona<\/td>\n<\/tr>\n<tr>\n<td><mono>write<\/mono> \/ <mono>w<\/mono><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td><\/td>\n<td>Write bytes to a memory location<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>As you can see, most of the commands will run under 64bit as well.  We'll keep working on offering even more logic for both 32bit and 64bit in the future.<\/p>\n<h2>Basic Usage<\/h2>\n<p>Comands are executed using<\/p>\n<pre>!mona &lt;command&gt; [arguments]<\/pre>\n<p>For example, if you'd like to run the \"assemble\" routine and you'd like to get the opcode for the \"jmp eax\" instruction, you can run<\/p>\n<pre><cmd>!mona asm -s \"jmp eax\"<\/cmd><\/pre>\n<p>It's a good idea to tell mona to write its output into specific folders instead of writing them inside the WinDBG Program Folder.<br \/>\nYou can do so by setting a configuration variable <mono>workingfolder<\/mono> to a path.<br \/>\nWe recommend adding a <mono>%p<\/mono> subfolder to that path, telling mona to organize the output into subfodlers that have the process' imagename.<\/p>\n<pre>0:000> <cmd>!mona config -set workingfolder c:\\logs\\%p<\/cmd>\nHold on...\n\n[ -- START -- ] Mona command started on 2026-04-19 11:44:18 (v3.0, rev 3000) 64bit \n[ -- START -- ] Python: 3.9.13 (tags\/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)])\n[ -- START -- ] PyKD: 0.3.4.15 \n\n[+] Command used: !py c:\\Tools\\mona3\\mona.py config -set workingfolder c:\\logs\\%p\n\n[+] Saving new value for parameter 'workingfolder'\n    Config file: c:\\Tools\\mona3\\mona.ini\n    Old value of parameter workingfolder = c:\\logs\\%p\n    New value:\n\n[+] Saving config file, modified parameter workingfolder\n    mona.ini saved under c:\\Tools\\mona3\n    Parameter       New value  \n    -------------   -----------\n    <high>workingfolder    c:\\logs\\%p<\/high>\n\n[ -- END -- ] This mona.py action took 0:00:00.069025\n[ -- END -- ] Current date\/time: 2026-04-19 11:44:18\n<\/pre>\n<p>Also, it would be great to adopt the habit of checking for updates on a regular basis. We're actively fixing bugs, adding features and making changes overall.<\/p>\n<p>Just like before, checking for updates and updating itself in-place is as easy as running <mono>!mona up<\/mono><br \/>\n(Make sure you have an active internet connection).<\/p>\n<p>As explained before, if you're using a centralized setup, all of your debuggers will be using the updated version automatically.<\/p>\n<h3>Global options & default filters<\/h3>\n<p>The Global Options are a set of arguments and criteria that allow you to steer and control the searches that mona performs.<br \/>\nYou'll get to see them when running <mono>!mona<\/mono> without arguments:<\/p>\n<pre>\nGlobal options :\n----------------\nYou can use one or more of the following global options on any command that will perform\na search in one or more modules, returning a list of pointers :\n\n  Global options affecting selection of modules:\n\n  -n                     : Skip modules that start with a null byte. If this is too broad, use\n                           option -cp nonull instead\n  -o                     : Ignore OS modules\n  -m &lt;module,module,...&gt; : only query the given modules. Be sure what you are doing !\n                           You can specify multiple modules (comma separated)\n                           Tip : you can use -m *  to include all modules.\n                           All other module criteria will be ignored\n                           Other wildcards : *blah.dll = ends with blah.dll, blah* = starts with blah,\n                           blah or *blah* = contains blah\n  -cm &lt;crit,crit,...&gt;    : Apply some additional criteria to the modules to query.\n                           You can use one or more of the following criteria :\n                           aslr,safeseh,rebase,nx,cfg,os\n                           You can enable or disable a certain criterium by setting it to true or false\n                           Example :  -cm aslr=true,safeseh=false\n                           Suppose you want to search for p\/p\/r in aslr enabled modules, you could call\n                           !mona seh -cm aslr\n  -cmp &lt;regex&gt;           : Only include modules whose full path matches the given regex (case-insensitive)\n                           Example : -cmp kernel32  -cmp \"C:\\\\Windows\"  -cmp \"\\.dll$\"\n\n  Global options affecting addresses:\n\n  -p &lt;nr&gt;                : Stop search after <nr> pointers.\n  -cp &lt;crit,crit,...&gt;    : Apply some criteria to the pointers to return\n                           Available options are :\n                           unicode,ascii,asciiprint,upper,lower,uppernum,lowernum,\n                           numeric,alphanum,nonull,startswithnull,unicoderev\n                           Note : Multiple criteria will be evaluated using 'AND', \n                                  except if you are looking for unicode + one crit\n  -cpb '\\x00\\x01'      : Provide list with bad chars, applies to pointers\n                           You can use .. to indicate a range of bytes (in between 2 bad chars)\n  -x &lt;access&gt;            : Specify desired access level of the returning pointers. If not specified,\n                           only executable pointers will be returned.\n                           Access levels can be one of the following values : R,W,X,RW,RX,WX,RWX or *\n\n\n  Other global options:\n\n  -h                     : Show help \/ usage for the selected command \n  -debug                 : Enable debug routines in mona\/windbglib.\n                           Don't use this option unless you've been asked to do so<\/pre>\n<p>There are 2 major types:<\/p>\n<ul>\n<li>Options that affect the search scope, what areas of memory will be considered for the search<\/li>\n<li>Options that affect the characteristics of the resulting addresses. Access controls, bad chars, things like that.<\/li>\n<\/ul>\n<p>By default, almost all <mono>mona<\/mono> searches will exclude any module that has been REBASED or is ASLR enabled. <\/p>\n<p>If you're looking for helpful pointers in relation with an exception handler overwrite, then it will exclude SAFESEH modules as well.   <\/p>\n<p>Within the remaining modules, mona will limit itself to pages that are marked as executable.<br \/>\nTechnically, if your target does not have DEP enabled, then you may get away by selecting a pointer from a page that is not executable... <\/p>\n<p>The exceptions to the non-rebase, non-aslr rule are:<\/p>\n<ul>\n<li><mono>findwild<\/mono> (will search in all executable pages)<\/li>\n<li><mono>getiat<\/mono> (will search in all modules)<\/li>\n<li><mono>geteat<\/mono> (will search in all modules)<\/li>\n<\/ul>\n<p>You can overrule mona's default search scope behaviour at any time.<br \/>\nYou can tell <mono>mona.py<\/mono> to search in specific modules regardless of their mitigations. (use options <mono>-m<\/mono> or <mono>-cmp<\/mono>)<br \/>\nOr you can overrule the non-aslr and\/or non-rebase filter generically using something like: <mono>-cm aslr=True,rebase=True<\/mono><br \/>\nYou can also overrule the decision to limit itself to executable pages with the <mono>-x<\/mono> flag. For instance, search in all readable pages: <mono>-x R<\/mono><\/p>\n<p>In any case, all of this implies you understand what you're doing.   The fact that <mono>mona.py<\/mono> was not able to find something by default is very likely caused by a relevant mitigation or access level, and is usually not a mistake.<br \/>\nbe careful when you overrule the default scope and criteria. <\/p>\n<p>But sometimes is does make sense to overrule.<br \/>\nIn full ASLR applications, after obtaining an information leak, we'd have to tell mona to search in the module that we leaked.<br \/>\nAs indicated, Mona's <mono>-m<\/mono> flag allows you to specify the module you want to search in, overruling its default filters. <\/p>\n<p>The mona output will now show the active filters and default choices it has made, reminding you of the importance and effect of those choices.<\/p>\n<p>For example:<\/p>\n<pre>\n0:000> <cmd>!mona jmp -r esp<\/cmd>\nHold on...\n\n[ -- START -- ] Mona command started on 2026-04-16 14:59:37 (v3.0, rev 3000) 32bit \n[ -- START -- ] Python: 3.9.13 (tags\/v3.9.13:6de2ca5, May 17 2022, 16:24:45) [MSC v.1929 32 bit (Intel)])\n[ -- START -- ] PyKD: 0.3.4.15 \n\n[+] Command used: !py C:\\Tools\\mona3\\mona.py jmp -r esp\n\n[+] Processing arguments and criteria\n<high>    - Pointer access level : X<\/high>\n[+] Generating module info table, hang on...\n    - Processing modules\n    - Done. Let's rock 'n roll.\n<high>[+] Criteria: ASLR = False | REBASE = False<\/high>\n[+] Querying 1 modules\n    - Querying module blah\n    - Search complete, processing results\n[+] Preparing output file 'jmp.txt'\n    - (Re)setting output file c:\\logs\\blah\\jmp.txt\n\n<\/pre>\n<p>Likewise, the list of loaded modules now indicates some selection and ordering criteria. Let's say you're connected to MS Edg (64bit) and you'd like to see all modules that contain the word \"edge\" in the full path:<\/p>\n<pre>\n0:015> <cmd>!mona mod -cmp edge<\/cmd>\nHold on...\n\n[ -- START -- ] Mona command started on 2026-04-16 15:27:11 (v3.0, rev 3000) 64bit \n[ -- START -- ] Python: 3.9.13 (tags\/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)])\n[ -- START -- ] PyKD: 0.3.4.15 \n\n[+] Command used: !py C:\\Tools\\mona3\\mona.py mod -cmp edge\n\n[+] Processing arguments and criteria\n    - Pointer access level : X\n    - Filtering modules by path matching : edge\n[+] Generating module info table, hang on...\n    - Processing modules\n    - Done. Let's rock 'n roll.\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n <high>Total nr of modules loaded: 20 | Nr of modules displayed after filters: 4 | PEB order: InLoadOrder<\/high>\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n <high>Module filter applied: cmp = edge<\/high>\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n Base               | Top                | Size               | Rebase | ASLR  | CFG   | NXCompat | OS Dll | Version, ImageName & Path, DLLCharacteristics\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n 0x00007ff774ec0000 | 0x00007ff7753a3000 | 0x00000000004e3000 | True   | True  | True  |  True    | False  | 147.0.3912.60 [msedge.exe] (C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe) 0xc160\n 0x00007ffdfe1e0000 | 0x00007ffdfe696000 | 0x00000000004b6000 | True   | True  | True  |  True    | False  | 147.0.3912.60 [msedge_elf.dll] (C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\147.0.3912.60\\msedge_elf.dll) 0x4160\n 0x00007ffdc1710000 | 0x00007ffdd4849000 | 0x0000000013139000 | True   | True  | True  |  True    | False  | 147.0.3912.60 [msedge.dll] (C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\147.0.3912.60\\msedge.dll) 0x4160\n 0x00007ffdfdd70000 | 0x00007ffdfe1df000 | 0x000000000046f000 | True   | True  | True  |  True    | False  | 0.0.0.0 [ffmpeg.dll] (C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\147.0.3912.60\\ffmpeg.dll) 0x4160\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n[+] Preparing output file 'modules.txt'\n    - (Re)setting output file c:\\logs\\msedge\\modules.txt\n\n[ -- END -- ] This mona.py action took 0:00:00.368993\n[ -- END -- ] Current date\/time: 2026-04-16 15:27:11\n<\/pre>\n<p>When specifying module criteria and filters, you'll see them appear in the header of the module table.<\/p>\n<h3>Getting help<\/h3>\n<p>Unsure what arguments are certain command takes?   Simply run the command with the <mono>-h<\/mono> flag, or run <mono>!mona help command<\/mono> (where \"command\" is the name of the command you're interested in)<\/p>\n<p>For example:<\/p>\n<pre><cmd>!mona asm -h<\/cmd>\n\nYou've asked for help about the 'assemble' command.  Here is the requested information:\n\nBasic command:\n--------------\n   !py mona assemble\n   !py mona asm\n\nUsage:\n------\nConvert instructions to opcode. Separate multiple instructions with #.\n\nMandatory argument : -s &lt;instructions&gt; : the sequence of instructions to assemble to opcode\n\n<\/pre>\n<h3>Interrupting mona.py<\/h3>\n<p>You can interrupt (most) potentially long-running routines in <mono>mona.py<\/mono> by creating a file named <mono>stop<\/mono> in the same folder as <mono>mona.py<\/mono><\/p>\n<p>For example:<\/p>\n<pre><cmd>echo \"stop\" > c:\\tools\\mona3\\stop<\/cmd><\/pre>\n<p><mono>mona.py<\/mono> will check for the file on a recurring basis (but it may not be instant though) and will hard-terminate the script if the file was found.<br \/>\nYou obviously won't get results, but at least you don't have to kill your debugging session in case you'd like to try something else.<\/p>\n<h3>Customizing clickable links<\/h3>\n<p>Some <mono>mona.py<\/mono> commands will show clickable links in WinDBG(X), facilitating easy navigation.<br \/>\nBy default, <mono>mona.py<\/mono> assumes that you've created a WinDBG alias, allowing you to run <mono>!mona<\/mono> at the WinDBG Command prompt.<br \/>\n(In fact, <mono>mona.py<\/mono> will query the WinDBG aliases to find the one that you're using, but it will only work if you have only one alias defined that points to the <mono>mona.py<\/mono> script)<\/p>\n<p>The clickable links will have that alias name hardcoded in their commands (either the actual alias name, or just <mono>!mona<\/mono> if no unique alias was found.<\/p>\n<p>However, you can avoid doing the lookup and set your alias name as a mona configuration variable.<br \/>\nSuppose you have decided to name your WinDBG alias <mono>!mona3<\/mono> instead of <mono>!mona<\/mono> and you don't want to rely on <mono>mona.py<\/mono> to extracting it from your WinDBG aliases, you can tell <mono>mona.py<\/mono> to use the <mono>!mona3<\/mono> alias in its clickable links by setting the <mono>alias<\/mono> config variable:<\/p>\n<pre><cmd>!mona3 config -set alias #mona3<\/cmd><\/pre>\n<p>(In order to avoid alias substitution when using the <mono>config<\/mono> command, please a <mono>#<\/mono> instead of <mono>!<\/mono>. <mono>mona.py<\/mono> will replace it back to <mono>!<\/mono>)<\/p>\n<p>From this point forward, the clickable links will use <mono>!mona3<\/mono>.<\/p>\n<p>Perhaps you don't even want to use a WinDBG alias.<br \/>\nIn that case, you can set the <mono>alias<\/mono> config value to the actual command you're using.  Again, don't forget to replace the <mono>!<\/mono> with a <mono>#<\/mono>.<br \/>\nOnce set, mona will use whatever value you've set in it clickable links.<\/p>\n<p>For example:<\/p>\n<pre><cmd>!py -3.9 c:\\Tools\\mona3\\mona.py config -set alias \"#py -3.9 c:\\Tools\\mona3\\mona.py\"<\/cmd><\/pre>\n<p>Note: if a <mono>mona.py<\/mono> config value <mono>alias<\/mono> is set, it will use that one instead of doing an active lookup in your aliases.<\/p>\n<h2>Questions on using mona.py?<\/h2>\n<p>Feel free to drop by our <a href=\"\/index.php\/discord\/\">Discord server<\/a> and ask questions in the <mono>#mona<\/mono> channel.  We'll be more than happy to help<\/p>\n<h2>Found a bug?<\/h2>\n<p>Please <a href=\"https:\/\/github.com\/corelan\/mona3\/issues\"  target=\"_blank\" rel=\"noopener\">open an issue on Github<\/a> and provide the steps to reproduce the problem.<br \/>\nFor more sophisticated issues, we may ask you to run the command again with the <mono>-debug<\/mono> flag and to provide us the output.<br \/>\n(On WinDBG(X), the <mono>-debug<\/mono> flag will write the output to a logfile automatically using WinDBGs <mono>.logopen<\/mono> command.<\/p>\n<h2>What\u2019s next<\/h2>\n<p>This release is just the beginning.<\/p>\n<p>We\u2019ll explore some of the new features and improvements in more detail in future posts, and we continue to work on adding more to mona v3.<\/p>\n<p>Of course, we also encourage and invite anyone to write code, to add more cool features to mona and submit PRs.<br \/>\nPlease check the <a href=\"https:\/\/github.com\/corelan\/mona3\/blob\/main\/CONTRIBUTING.md\"  target=\"_blank\" rel=\"noopener\">CONTRIBUTING.md<\/a> file for more info.<\/p>\n<p>Stay tuned.<\/p>\n<h2>Stay in the loop<\/h2>\n<p>If you want to be the first to hear about new releases, deep dives, and upcoming content:<\/p>\n<p>\ud83d\udc49 If you haven't done so already, subscribe to the blog - you'll receive an update in your mailbox as soon as I publish a new post.<br \/>\n\ud83d\udc49 <a href=\"https:\/\/www.corelan.be\/index.php\/contact\/\"  target=\"_blank\" rel=\"noopener\">Follow on social media<\/a>.  If you see something you like, please share it with others.<\/p>\n<p>More is coming.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Long overdue\u2026 but today it finally happened. <\/p>\n<p>We\u2019re proud to announce the release of mona v3.<\/p>\n<p>This new version brings Python 2 and Python 3 compatibility (Python 3 recommended), support for both 32-bit and 64-bit targets, full integration with WinDBG and WinDBGX, continued compatibility with Immunity Debugger, and the use of the pykd-ext bootstrapper. <\/p>\n<p>It also includes a substantial refactor and modernization of the codebase, making it faster, leaner, and better prepared for the future.<\/p>\n<p>This post covers what changed, key improvements, important prerequisites, installation and migration guidance, and the current list of supported commands.<br \/>\nContinue reading to learn all the details and discover how to get mona v3 up and running in your environment.<br \/>\nDownload links, setup instructions, and the GitHub repository are provided further down in this post.<\/p>\n","protected":false},"author":1,"featured_media":19403,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[488,3708,244,245,2561,3180,373,127,3643],"tags":[3816,3815,3814,3813,3812,3797,3758,2802,285],"class_list":["post-19363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-corelan-free-tools","category-debugging","category-exploit-writing-tutorials","category-exploits","category-malware-and-reversing","category-mona","category-scripts","category-security","category-windows-internals","tag-pykd-ext","tag-windbglib","tag-x64","tag-x86","tag-python3","tag-pykd","tag-windbgx","tag-mona-py","tag-windbg"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mona v3 Released: \u26a1 Faster  \ud83c\udfaf Leaner  \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research<\/title>\n<meta name=\"description\" content=\"Corelan mona v3 is now released. This major update brings Python 2 &amp; Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mona v3 Released: \u26a1 Faster  \ud83c\udfaf Leaner  \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"og:description\" content=\"Corelan mona v3 is now released. This major update brings Python 2 &amp; Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/\" \/>\n<meta property=\"og:site_name\" content=\"Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/corelanconsulting\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-01T11:36:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-01T16:12:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png\" \/>\n\t<meta property=\"og:image:width\" content=\"272\" \/>\n\t<meta property=\"og:image:height\" content=\"272\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"corelanc0d3r\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@corelanc0d3r\" \/>\n<meta name=\"twitter:site\" content=\"@corelanc0d3r\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/\"},\"author\":{\"name\":\"corelanc0d3r\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/3be5542b9b0a0787893db83a5ad68e8f\"},\"headline\":\"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader\",\"datePublished\":\"2026-05-01T11:36:00+00:00\",\"dateModified\":\"2026-05-01T16:12:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/\"},\"wordCount\":3287,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Corelan-MONAv3-Small.png\",\"keywords\":[\"pykd-ext\",\"windbglib\",\"x64\",\"x86\",\"python3\",\"pykd\",\"windbgx\",\"mona.py\",\"windbg\"],\"articleSection\":[\"Corelan Free Tools\",\"Debugging\",\"Exploit Writing Tutorials\",\"Exploits\",\"Malware and Reversing\",\"mona\",\"Scripts\",\"Security\",\"Windows Internals\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/\",\"name\":\"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Corelan-MONAv3-Small.png\",\"datePublished\":\"2026-05-01T11:36:00+00:00\",\"dateModified\":\"2026-05-01T16:12:49+00:00\",\"description\":\"Corelan mona v3 is now released. This major update brings Python 2 & Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \\\/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Corelan-MONAv3-Small.png\",\"contentUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Corelan-MONAv3-Small.png\",\"width\":272,\"height\":272},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2026\\\/05\\\/01\\\/mona-v3-released\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.corelan.be\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"name\":\"Corelan CyberSecurity Research\",\"description\":\"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.corelan.be\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\",\"name\":\"Corelan CyberSecurity Research\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"contentUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"width\":200,\"height\":200,\"caption\":\"Corelan CyberSecurity Research\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/corelanconsulting\",\"https:\\\/\\\/x.com\\\/corelanc0d3r\",\"https:\\\/\\\/x.com\\\/corelanconsulting\",\"https:\\\/\\\/instagram.com\\\/corelanconsult\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/3be5542b9b0a0787893db83a5ad68e8f\",\"name\":\"corelanc0d3r\",\"pronouns\":\"he\\\/him\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x\",\"caption\":\"corelanc0d3r\"},\"description\":\"Peter Van Eeckhoutte is the founder of Corelan and a globally recognized expert in exploit development and vulnerability research. With over two decades in IT security, he built Corelan into a respected platform for deep technical research, hands-on training, and knowledge sharing. Known for his influential exploit development tutorials, tools, and real-world training, Peter combines a strong research mindset with a passion for education\u2014helping security professionals understand not just how exploits work, but why.\",\"sameAs\":[\"https:\\\/\\\/www.corelan-training.com\",\"https:\\\/\\\/instagram.com\\\/corelanc0d3r\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/petervaneeckhoutte\\\/\",\"https:\\\/\\\/x.com\\\/corelanc0d3r\"],\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/author\\\/admin0\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mona v3 Released: \u26a1 Faster  \ud83c\udfaf Leaner  \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research","description":"Corelan mona v3 is now released. This major update brings Python 2 & Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/","og_locale":"en_US","og_type":"article","og_title":"Mona v3 Released: \u26a1 Faster  \ud83c\udfaf Leaner  \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research","og_description":"Corelan mona v3 is now released. This major update brings Python 2 & Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.","og_url":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/","og_site_name":"Corelan | Exploit Development &amp; Vulnerability Research","article_publisher":"https:\/\/www.facebook.com\/corelanconsulting","article_published_time":"2026-05-01T11:36:00+00:00","article_modified_time":"2026-05-01T16:12:49+00:00","og_image":[{"width":272,"height":272,"url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","type":"image\/png"}],"author":"corelanc0d3r","twitter_card":"summary_large_image","twitter_creator":"@corelanc0d3r","twitter_site":"@corelanc0d3r","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#article","isPartOf":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/"},"author":{"name":"corelanc0d3r","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/3be5542b9b0a0787893db83a5ad68e8f"},"headline":"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader","datePublished":"2026-05-01T11:36:00+00:00","dateModified":"2026-05-01T16:12:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/"},"wordCount":3287,"commentCount":0,"publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"image":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#primaryimage"},"thumbnailUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","keywords":["pykd-ext","windbglib","x64","x86","python3","pykd","windbgx","mona.py","windbg"],"articleSection":["Corelan Free Tools","Debugging","Exploit Writing Tutorials","Exploits","Malware and Reversing","mona","Scripts","Security","Windows Internals"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/","url":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/","name":"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader - Corelan | Exploit Development &amp; Vulnerability Research","isPartOf":{"@id":"https:\/\/www.corelan.be\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#primaryimage"},"image":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#primaryimage"},"thumbnailUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","datePublished":"2026-05-01T11:36:00+00:00","dateModified":"2026-05-01T16:12:49+00:00","description":"Corelan mona v3 is now released. This major update brings Python 2 & Python 3 support, full 32-bit and 64-bit compatibility, native WinDBG \/ WinDBGX integration, and continued Immunity Debugger support. Learn what\u2019s new and how to install mona v3.","breadcrumb":{"@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#primaryimage","url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","contentUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","width":272,"height":272},{"@type":"BreadcrumbList","@id":"https:\/\/www.corelan.be\/index.php\/2026\/05\/01\/mona-v3-released\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.corelan.be\/"},{"@type":"ListItem","position":2,"name":"Mona v3 Released: \u26a1 Faster \ud83c\udfaf Leaner \u2699\ufe0f Broader"}]},{"@type":"WebSite","@id":"https:\/\/www.corelan.be\/#website","url":"https:\/\/www.corelan.be\/","name":"Corelan CyberSecurity Research","description":"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.","publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.corelan.be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.corelan.be\/#organization","name":"Corelan CyberSecurity Research","url":"https:\/\/www.corelan.be\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/","url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","contentUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","width":200,"height":200,"caption":"Corelan CyberSecurity Research"},"image":{"@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/corelanconsulting","https:\/\/x.com\/corelanc0d3r","https:\/\/x.com\/corelanconsulting","https:\/\/instagram.com\/corelanconsult"]},{"@type":"Person","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/3be5542b9b0a0787893db83a5ad68e8f","name":"corelanc0d3r","pronouns":"he\/him","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","url":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3783bed6acd72d7fa5bb2387d88acbb9a3403e7cada60b2037e1cbb74ad451f9?s=96&d=mm&r=x","caption":"corelanc0d3r"},"description":"Peter Van Eeckhoutte is the founder of Corelan and a globally recognized expert in exploit development and vulnerability research. With over two decades in IT security, he built Corelan into a respected platform for deep technical research, hands-on training, and knowledge sharing. Known for his influential exploit development tutorials, tools, and real-world training, Peter combines a strong research mindset with a passion for education\u2014helping security professionals understand not just how exploits work, but why.","sameAs":["https:\/\/www.corelan-training.com","https:\/\/instagram.com\/corelanc0d3r","https:\/\/www.linkedin.com\/in\/petervaneeckhoutte\/","https:\/\/x.com\/corelanc0d3r"],"url":"https:\/\/www.corelan.be\/index.php\/author\/admin0\/"}]}},"views":524,"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/04\/Corelan-MONAv3-Small.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/19363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/comments?post=19363"}],"version-history":[{"count":104,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/19363\/revisions"}],"predecessor-version":[{"id":19649,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/19363\/revisions\/19649"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/media\/19403"}],"wp:attachment":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/media?parent=19363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/categories?post=19363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/tags?post=19363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}