{"id":5276,"date":"2025-04-15T06:22:09","date_gmt":"2025-04-15T04:22:09","guid":{"rendered":"https:\/\/security.humanativaspa.it\/?p=5276"},"modified":"2025-10-21T09:04:37","modified_gmt":"2025-10-21T09:04:37","slug":"aiding-reverse-engineering-with-rust-and-a-local-llm","status":"publish","type":"post","link":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/","title":{"rendered":"Aiding reverse engineering with Rust and a local LLM"},"content":{"rendered":"<blockquote><p><em>&#8220;A large fraction of the flaws in software development are due to programmers not fully understanding all the possible states their code may execute in.&#8221;<br \/>\n&#8212; John Carmack<\/em><\/p>\n<p><em>&#8220;Can it run Doom?&#8221;<br \/>\n&#8212; <a href=\"https:\/\/canitrundoom.org\/\">canitrundoom.org<\/a><\/em><\/p><\/blockquote>\n<h3>TL;DR<\/h3>\n<p>There\u2019s a new entry in my ever-growing <em>vulnerability divination<\/em> <a href=\"https:\/\/hnsecurity.it\/streamlining-vulnerability-research-with-ida-pro-and-rust\/\">tool suite<\/a>, designed to assist with <strong>reverse engineering and <\/strong><strong>vulnerability research against binary targets<\/strong>: <a href=\"https:\/\/github.com\/0xdea\/oneiromancer\">oneiromancer.<\/a><\/p>\n<p>It&#8217;s a reverse engineering assistant that uses a <a href=\"https:\/\/www.atredis.com\/blog\/2024\/6\/3\/how-to-train-your-large-language-model\">fine-tuned<\/a>, <strong>locally running LLM to aid with code analysis<\/strong>. It can analyze a function or a smaller code snippet, returning a high-level description of what the code does, a recommended name for the function, and variable renaming suggestions based on the results of the analysis.<\/p>\n<p>As you&#8217;ve probably guessed, oneiromancer is written in <strong>Rust<\/strong> \ud83e\udd80 While working on this tool, I also <a href=\"https:\/\/github.com\/rust-lang\/crates.io\/pull\/10905\">contributed<\/a> the new <a href=\"https:\/\/crates.io\/categories\/security\"><em>security<\/em> category<\/a> to crates.io. I hope you&#8217;ll find it useful for your projects.<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"550\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">My first official rust-lang contribution \ud83d\ude1c<a href=\"https:\/\/t.co\/SLQ0tnSGXj\">https:\/\/t.co\/SLQ0tnSGXj<\/a><\/p>\n<p>On <a href=\"https:\/\/t.co\/Uo0aEhEXyU\">https:\/\/t.co\/Uo0aEhEXyU<\/a>, you can now categorize your crates under \u201csecurity\u201d (\u201cCrates related to cybersecurity, penetration testing, code review, vulnerability research, and reverse engineering.\u201d).<\/p>\n<p>&mdash; raptor@infosec.exchange (@0xdea) <a href=\"https:\/\/twitter.com\/0xdea\/status\/1905726544720625976?ref_src=twsrc%5Etfw\">March 28, 2025<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>This article is the fourth installment in our <a href=\"https:\/\/hnsecurity.it\/tag\/rust\/\">Offensive Rust series<\/a>. In it, I will introduce my new tool and guide you further along your journey into Rust programming. Let&#8217;s dive in!<\/p>\n<h3>Backstory<\/h3>\n<p>Last February, the winners of the annual <a href=\"https:\/\/hex-rays.com\/blog\/2024-plugin-contest-winners\">Hex-Rays Plugin Contest<\/a> were announced:<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"550\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">We are thrilled to announce the winners of the 2024 Hex-Rays Plugin Contest!<\/p>\n<p>\ud83e\udd471st Place: hrtng<br \/>\ud83e\udd482nd Place: aiDAPal<br \/>\ud83e\udd493rd Place: idalib Rust bindings<\/p>\n<p>Check out our reviews of the winners and other notable submissions here: <a href=\"https:\/\/t.co\/XgkQHfktAF\">https:\/\/t.co\/XgkQHfktAF<\/a><br \/>Huge thank you to all\u2026 <a href=\"https:\/\/t.co\/rw1qzmLjdf\">pic.twitter.com\/rw1qzmLjdf<\/a><\/p>\n<p>&mdash; Hex-Rays SA (@HexRaysSA) <a href=\"https:\/\/twitter.com\/HexRaysSA\/status\/1891516388742766720?ref_src=twsrc%5Etfw\">February 17, 2025<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>The awesome <a href=\"https:\/\/hnsecurity.it\/streamlining-vulnerability-research-with-ida-pro-and-rust\/\">idalib Rust bindings<\/a> were awarded a well-deserved third place! But another project caught my attention among the winners: <a href=\"https:\/\/plugins.hex-rays.com\/atredispartners\/aidapal\">aiDAPal<\/a> by <a href=\"https:\/\/www.atredis.com\/\">Atredis Partners<\/a>. It&#8217;s an IDA Pro plugin that uses a <strong>locally running LLM<\/strong> that has been <strong>fine-tuned for Hex-Rays pseudo-code<\/strong> to assist with code analysis.<\/p>\n<p>Personally, I&#8217;m not buying into the current frenzy around <strong><em>vibe reversing <\/em>and large language models<\/strong> in general. However, I grudgingly have to recognize that <strong>there&#8217;s more to LLMs than just hype<\/strong> (stay tuned to this blog for some innovative developments in this field that we can&#8217;t disclose just yet). Anyway, the premise behind aiDAPal intrigued me, and therefore I decided to <strong>test it in the field<\/strong>.<\/p>\n<p>Long story short &#8212; I didn&#8217;t care much for the plugin&#8217;s UX, but I did find the <a href=\"https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\">fine-tune of <em>mistral7b-instruct<\/em><\/a> quite impressive. It runs very smoothly under <a href=\"https:\/\/ollama.com\/\">Ollama<\/a> on my MacBook Air M3 and provides generally actionable output. For the nitty-gritty details behind this custom LLM, I recommend reading <a href=\"https:\/\/www.atredis.com\/blog\/2024\/6\/3\/how-to-train-your-large-language-model\">How to Train Your Large Language Model<\/a> by <a href=\"https:\/\/github.com\/AverageBusinessUser\">Chris Bellows<\/a>.<\/p>\n<p>Since the fine-tuned model is freely <a href=\"https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\">available on Hugging Face<\/a> under a permissive license, I thought I could write <strong>my own standalone tool<\/strong> to query it. And in my never-ending quest to become a better Rust programmer, I decided to write it in Rust. Really fell in love with this language! I never considered myself a <strong>real programmer<\/strong> to begin with (although I&#8217;ve always enjoyed coding since I started as a kid with <a href=\"https:\/\/github.com\/angea\/pocorgtfo\/blob\/master\/contents\/articles\/01-07.pdf\">BASIC<\/a> in the 80s), and I&#8217;m definitely no evangelist. I couldn&#8217;t care less which language you use \ud83e\udd37 However, <span class=\"il\">Rust<\/span> has got something that makes me really want to <strong>keep digging deeper and building stuff<\/strong>. But I digress&#8230;<\/p>\n<h3>Soundtr-hack<\/h3>\n<blockquote><p><em>&#8220;Secret agent man, secret agent man<br \/>\nThey&#8217;ve given you a number<br \/>\nAnd taken away your name&#8221;<br \/>\n&#8212; Johnny Rivers, Secret Agent Man (1966)<\/em><\/p><\/blockquote>\n<p>Before we look at some Rust learning resources and deep-dive into oneiromancer&#8217;s implementation, let&#8217;s uphold our tradition by recommending an appropriate <strong>soundtrack<\/strong> for your hacking delight! \ud83d\udd75\ud83c\udffb\u200d\u2642\ufe0f<\/p>\n<p><iframe title=\"Secret Agent Man - Johnny Rivers | The Midnight Special\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/PWkGQYpdSGA?feature=oembed&#038;width=840&#038;height=1000&#038;discover=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<h3>Learning resources<\/h3>\n<p class=\"p1\">Here are some <strong>little gems<\/strong> that I recently discovered:<\/p>\n<ul>\n<li><a href=\"https:\/\/codeandbitters.com\/rust-2024-upgrade\/\">Updating a Large Codebase to Rust 2024<\/a>. I found this article useful when upgrading my crates to the <a href=\"https:\/\/doc.rust-lang.org\/edition-guide\/rust-2024\/\">Rust 2024 edition<\/a>. See also <a href=\"https:\/\/bertptrs.nl\/2025\/02\/23\/rust-edition-2024-annotated.html\">Rust Edition 2024 Annotated<\/a> for a deeper coverage of what&#8217;s new in Rust 2024.<\/li>\n<li><a href=\"https:\/\/blog.guillaume-gomez.fr\/articles\/2020-03-12+Guide+on+how+to+write+documentation+for+a+Rust+crate\">How to Write Documentation<\/a>. This guide provides clear indications on how to write documentation for a Rust crate, from the basics to more advanced <a href=\"https:\/\/doc.rust-lang.org\/stable\/rustdoc\/\">rustdoc<\/a> features.<\/li>\n<li><a href=\"https:\/\/develop.sentry.dev\/engineering-practices\/rust\/\">Sentry Rust Development<\/a>. Another guide that contains a bunch of resources for getting started with Rust and adhering to sound coding principles and engineering practices.<\/li>\n<li><a href=\"https:\/\/www.shuttle.dev\/blog\/2025\/01\/23\/setup-rust-ci-cd\">Setting up effective CI\/CD for Rust projects<\/a>. This short primer demonstrates how to create robust and efficient CI\/CD for Rust projects through Github Actions.<\/li>\n<li><a href=\"https:\/\/crates.io\/crates\/cargo-semver-checks\">Cargo SemVer Checks<\/a>. Easily scan your Rust crate for semantic versioning violations, either manually or as part of your <a href=\"https:\/\/github.com\/obi1kenobi\/cargo-semver-checks-action\">CI workflow<\/a>.<\/li>\n<li><a href=\"https:\/\/corrode.dev\/blog\/pitfalls-of-safe-rust\/\">Pitfalls of Safe Rust<\/a>. This article showcases a few common gotchas in safe Rust that the compiler doesn\u2019t detect and explains how to avoid them.<\/li>\n<li><a href=\"https:\/\/cliffle.com\/p\/dangerust\/\">Learn Rust the Dangerous Way<\/a>. A series of articles that show how to translate an optimized, SSE-using, heap-eschewing C program to Rust, making it immune to crashes and buffer overflows and slightly <em>faster<\/em> than the original.<\/li>\n<li><a href=\"https:\/\/minikin.me\/blog\/transition-systems-in-rust\">Transition Systems in Rust<\/a>. This article covers how to implement robust transition systems in Rust, leveraging the language\u2019s powerful type system and ownership model to create maintainable state machines.<\/li>\n<li><a href=\"https:\/\/security.googleblog.com\/2024\/09\/deploying-rust-in-existing-firmware.html\">Deploying Rust in Existing Firmware Codebases<\/a>. Google&#8217;s Android Team shows how to gradually introduce <a href=\"https:\/\/security.googleblog.com\/2021\/04\/rust-in-android-platform.html#:~:text=But%20what%20about%20all%20that%20existing%20C%2B%2B%3F\">Rust into existing firmware<\/a>, prioritizing new code and the most security-critical code, with drop-in Rust replacements for bare-metal targets.<\/li>\n<li><a href=\"https:\/\/blog.reverberate.org\/2025\/02\/03\/no-panic-rust.html\">No-Panic Rust<\/a>. This article explores the no-panic technique for systems programming, providing an in-depth discussion of how it works and what problems it solves.<\/li>\n<\/ul>\n<p>If you&#8217;re still struggling with <strong>starting your first Rust project<\/strong>, even after perusing the extensive list of learning resources that I&#8217;ve shared here and in <a href=\"https:\/\/hnsecurity.it\/tag\/rust\/\">my past articles<\/a>, I have a final recommendation for you: <a href=\"https:\/\/bitfieldconsulting.com\/books\/rust-tools\">The Secrets of Rust: Tools<\/a>. It&#8217;s a recent <strong>beginner-friendly book<\/strong> that will guide you through the process of designing command-line tools in Rust, step by step. If you&#8217;re stuck, you might want to give it a try.<\/p>\n<h3>Querying the Oneiromancer<\/h3>\n<blockquote><p><em><i>Oneiromancer<\/i><br \/>\n<i>\/\u014d-n\u012b\u2032r\u0259-m\u0103n\u2033-s\u0259r\/<\/i><br \/>\n<i>Someone who divines through the interpretation of dreams.<\/i><br \/>\n<\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/github.com\/0xdea\/oneiromancer\">Oneiromancer<\/a> is a reverse engineering assistant that uses a <strong>locally running LLM<\/strong> that has been <a href=\"https:\/\/www.atredis.com\/blog\/2024\/6\/3\/how-to-train-your-large-language-model\">fine-tuned<\/a> for Hex-Rays decompiler&#8217;s pseudo-code, to <strong>aid with code analysis<\/strong>. It can analyze a function or a smaller code snippet, returning a high-level description of what the code does, a recommended name for the function, and variable renaming suggestions based on the results of the analysis. Its main\u00a0<strong>features<\/strong> are:<\/p>\n<ul dir=\"auto\">\n<li>Cross-platform support for the <strong>fine-tuned LLM<\/strong>\u00a0<a href=\"https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\" rel=\"nofollow\">aidapal<\/a> based on <em>mistral7b-instruct<\/em>.<\/li>\n<li>Easy integration with my <strong>pseudo-code extractor<\/strong> <a href=\"https:\/\/github.com\/0xdea\/haruspex\">haruspex<\/a>\u00a0and popular IDEs.<\/li>\n<li>Code <strong>description<\/strong>, recommended <strong>function name<\/strong>, and variable <strong>renaming suggestions<\/strong> are printed to the terminal.<\/li>\n<li><strong>Improved pseudo-code<\/strong> of each analyzed function is saved in a separate file for easy inspection.<\/li>\n<li>External crates can invoke <em>analyze_code<\/em> or <em>analyze_file<\/em> to analyze pseudo-code and then process analysis results.<\/li>\n<\/ul>\n<p>Additional information on oneiromancer&#8217;s features and usage is available at <a href=\"https:\/\/crates.io\/crates\/oneiromancer\">crates.io<\/a> and in the official <a href=\"https:\/\/docs.rs\/oneiromancer\/latest\/oneiromancer\/\">documentation<\/a>.<\/p>\n<p>Let&#8217;s <strong>install<\/strong> it and take it for a spin! The easiest way to get the latest release is via <a href=\"https:\/\/crates.io\/crates\/oneiromancer\">crates.io<\/a>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-linenumbers=\"false\" data-enlighter-theme=\"minimal\">$ cargo install oneiromancer\r\n<\/pre>\n<p>Before you can use it, however, you must download and install <a href=\"https:\/\/ollama.com\/\" rel=\"nofollow\">ollama<\/a>. Then, download the fine-tuned weights and the Ollama modelfile from <a href=\"https:\/\/huggingface.co\/\" rel=\"nofollow\">Hugging Face<\/a>:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"minimal\" data-enlighter-linenumbers=\"false\">$ wget https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\/resolve\/main\/aidapal-8k.Q4_K_M.gguf \r\n$ wget https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\/resolve\/main\/aidapal.modelfile<\/pre>\n<\/div>\n<p>Finally, configure Ollama by running the following commands within the directory in which you downloaded the files:<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"minimal\" data-enlighter-linenumbers=\"false\">$ ollama create aidapal -f aidapal.modelfile \r\n$ ollama list<\/pre>\n<p>Time to <strong>run<\/strong> oneiromancer against a <strong>sample pseudo-code file<\/strong> that was previously <a href=\"https:\/\/hnsecurity.it\/streamlining-vulnerability-research-with-ida-pro-and-rust\/\">extracted by haruspex:<\/a><\/p>\n<figure id=\"attachment_5543\" aria-describedby=\"caption-attachment-5543\" style=\"width: 2220px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1.png\"><img decoding=\"async\" class=\"wp-image-5543 size-full\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1.png\" alt=\"\" width=\"2220\" height=\"1606\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1.png 2220w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-300x217.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-1024x741.png 1024w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-768x556.png 768w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-1536x1111.png 1536w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-2048x1482.png 2048w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.24.19-1-350x253.png 350w\" sizes=\"(max-width: 2220px) 100vw, 2220px\" \/><\/a><figcaption id=\"caption-attachment-5543\" class=\"wp-caption-text\">To run oneiromancer against a target pseudo-code file, simply specify its path as the only argument<\/figcaption><\/figure>\n<p>Oneiromancer conveniently saves <strong>improved pseudo-code<\/strong> in a separate file:<\/p>\n<figure id=\"attachment_5547\" aria-describedby=\"caption-attachment-5547\" style=\"width: 2167px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.37.17-2.png\"><img decoding=\"async\" class=\"wp-image-5547 size-full\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/04\/Screenshot-2025-04-11-at-12.37.17-2.png\" alt=\"\" width=\"2167\" height=\"1088\" \/><\/a><figcaption id=\"caption-attachment-5547\" class=\"wp-caption-text\">Enjoy the improved pseudo-code in your favorite IDE!<\/figcaption><\/figure>\n<\/div>\n<p>By the way, the above <a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a> screenshot also shows a <strong>useful extension<\/strong> that&#8217;s relatively new and therefore wasn&#8217;t mentioned in <a href=\"https:\/\/hnsecurity.it\/big-update-to-my-semgrep-c-cpp-ruleset\/\">my previous article<\/a> that introduced a simple code review workflow: <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=trailofbits.sarif-explorer\">SARIF Explorer<\/a> by <a href=\"https:\/\/blog.trailofbits.com\/2024\/03\/20\/streamline-the-static-analysis-triage-process-with-sarif-explorer\/\">Trail of Bits<\/a>. Much better than the <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=MS-SarifVSCode.sarif-viewer\">alternatives<\/a>, in my opinion.<\/p>\n<p>The oneiromancer crate can also be <strong>easily used<\/strong><strong> as a library<\/strong> in your own crate. Refer to the <a href=\"https:\/\/docs.rs\/oneiromancer\/latest\/oneiromancer\/\">documentation<\/a> to see how.<\/p>\n<h3>A peek behind the curtain<\/h3>\n<p>Let&#8217;s take a look at the <strong>code<\/strong> now. The core of the oneiromancer crate is actually quite simple. The custom LLM developed by <a href=\"https:\/\/www.atredis.com\/\">Atredis Partners<\/a> takes care of the bulk of the work and we just need to query it via the <strong>Ollama API<\/strong>.<\/p>\n<p>The\u00a0<strong><em>run<\/em> function<\/strong> reads the pseudo-code from the target file at the specified path, submits it to the local LLM for analysis, and parses the results. It then outputs to the terminal a high-level description of what the code does, a recommended name for the function, and variable renaming suggestions based on the results of the analysis. Finally, it saves improved pseudo-code to a separate file:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\" data-enlighter-theme=\"minimal\">pub fn run(filepath: &amp;Path) -&gt; anyhow::Result&lt;()&gt; {\r\n    \/\/ Open target source file for reading\r\n    println!(\"[*] Analyzing source code in {filepath:?}\");\r\n    let file = File::open(filepath).with_context(|| format!(\"Failed to open {filepath:?}\"))?;\r\n    let mut reader = BufReader::new(file);\r\n    let mut source_code = String::new();\r\n    reader\r\n        .read_to_string(&amp;mut source_code)\r\n        .with_context(|| format!(\"Failed to read from {filepath:?}\"))?;\r\n\r\n    \/\/ Submit source code to local LLM for analysis\r\n    let mut sp = Spinner::new(\r\n        Spinners::SimpleDotsScrolling,\r\n        \"Querying the Oneiromancer\".into(),\r\n    );\r\n    let analysis_results =\r\n        analyze_code(&amp;source_code, None, None).context(\"Failed to analyze source code\")?;\r\n    sp.stop_with_message(\"[+] Successfully analyzed source code\".into());\r\n    println!();\r\n\r\n    \/\/ Create function description in Phrack-style, wrapping to 76 columns\r\n    let options = textwrap::Options::new(76)\r\n        .initial_indent(\" * \")\r\n        .subsequent_indent(\" * \");\r\n    let function_description = format!(\r\n        \"\/*\\n * {}()\\n *\\n{}\\n *\/\\n\\n\",\r\n        analysis_results.function_name(),\r\n        textwrap::fill(analysis_results.comment(), &amp;options)\r\n    );\r\n    print!(\"{function_description}\");\r\n\r\n    \/\/ Apply variable renaming suggestions\r\n    println!(\"[-] Variable renaming suggestions:\");\r\n    for variable in analysis_results.variables() {\r\n        let original_name = variable.original_name();\r\n        let new_name = variable.new_name();\r\n        println!(\"    {original_name}\\t-&gt; {new_name}\");\r\n\r\n        let re = Regex::new(&amp;format!(r\"\\b{original_name}\\b\")).context(\"Failed to compile regex\")?;\r\n        source_code = re.replace_all(&amp;source_code, new_name).into();\r\n    }\r\n\r\n    \/\/ Save improved source code to output file\r\n    let outfilepath = filepath.with_extension(\"out.c\");\r\n    println!();\r\n    println!(\"[*] Saving improved source code in {outfilepath:?}\");\r\n\r\n    let mut writer = BufWriter::new(\r\n        File::create_new(&amp;outfilepath)\r\n            .with_context(|| format!(\"Failed to create {outfilepath:?}\"))?,\r\n    );\r\n    writer.write_all(function_description.as_bytes())?;\r\n    writer.write_all(source_code.as_bytes())?;\r\n    writer.flush()?;\r\n\r\n    println!(\"[+] Done analyzing source code\");\r\n    Ok(())\r\n}<\/pre>\n<p>The following functions, that can also be called by external crates, are in charge of <strong>submitting pseudo-code<\/strong> (either directly or contained in a file) to the local LLM for analysis. If needed, you can specify custom <em>OLLAMA_BASEURL <\/em>and <em>OLLAMA_MODEL<\/em> values via the environment.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\" data-enlighter-theme=\"minimal\">pub fn analyze_code(\r\n    source_code: &amp;str,\r\n    baseurl: Option&lt;&amp;str&gt;,\r\n    model: Option&lt;&amp;str&gt;,\r\n) -&gt; Result&lt;OneiromancerResults, OneiromancerError&gt; {\r\n    \/\/ Check environment variables\r\n    let env_baseurl = env::var(\"OLLAMA_BASEURL\");\r\n    let env_model = env::var(\"OLLAMA_MODEL\");\r\n\r\n    \/\/ Send Ollama API request and parse response\r\n    let request = OllamaRequest::new(\r\n        model.unwrap_or_else(|| env_model.as_deref().unwrap_or(OLLAMA_MODEL)),\r\n        source_code,\r\n    );\r\n    request\r\n        .send(baseurl.unwrap_or_else(|| env_baseurl.as_deref().unwrap_or(OLLAMA_BASEURL)))?\r\n        .parse()\r\n}\r\n\r\npub fn analyze_file(\r\n    filepath: impl AsRef&lt;Path&gt;,\r\n    baseurl: Option&lt;&amp;str&gt;,\r\n    model: Option&lt;&amp;str&gt;,\r\n) -&gt; Result&lt;OneiromancerResults, OneiromancerError&gt; {\r\n    \/\/ Open target source file for reading\r\n    let file = File::open(&amp;filepath)?;\r\n    let mut reader = BufReader::new(file);\r\n    let mut source_code = String::new();\r\n    reader.read_to_string(&amp;mut source_code)?;\r\n\r\n    \/\/ Analyze `source_code`\r\n    analyze_code(&amp;source_code, baseurl, model)\r\n}<\/pre>\n<p>The\u00a0<strong><em>analyze_code<\/em> and\u00a0<em>analyze_file<\/em> functions<\/strong>\u00a0use the <em>OllamaRequest<\/em>, <em>OllamaResponse<\/em>, <em>OneiromancerResults<\/em>, and <em>OneiromancerError<\/em> abstractions defined in separate files.<\/p>\n<p>For further details, refer to <strong>oneiromancer&#8217;s source code on GitHub<\/strong>:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/0xdea\/oneiromancer\">https:\/\/github.com\/0xdea\/oneiromancer<\/a><\/li>\n<\/ul>\n<h3>Acknowledgments<\/h3>\n<p>Once again, the heavy lifting of fine-tuning the local LLM to analyze pseudo-code generated by the Hex-Rays decompiler was done by <a href=\"https:\/\/github.com\/AverageBusinessUser\">Chris Bellows<\/a> and <a href=\"https:\/\/www.atredis.com\/\">Atredis Partners<\/a>. They deserve all credit for training the <a href=\"https:\/\/huggingface.co\/AverageBusinessUser\/aidapal\" rel=\"nofollow\">aidapal<\/a> custom LLM that&#8217;s queried by oneiromancer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;A large fraction of the flaws in software development are due to programmers not fully understanding all the possible states [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":159953,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[88,91],"tags":[82,87,90,206,220,221],"class_list":["post-5276","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools","category-articles","tag-vulnerability-research","tag-reverse-engineering","tag-pseudocode","tag-rust","tag-ai","tag-ollama"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HN Security Aiding reverse engineering with Rust and a local LLM<\/title>\n<meta name=\"description\" content=\"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HN Security Aiding reverse engineering with Rust and a local LLM\" \/>\n<meta property=\"og:description\" content=\"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/\" \/>\n<meta property=\"og:site_name\" content=\"HN Security\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-15T04:22:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-21T09:04:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"836\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Marco Ivaldi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hnsec\" \/>\n<meta name=\"twitter:site\" content=\"@hnsec\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marco Ivaldi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/\"},\"author\":{\"name\":\"Marco Ivaldi\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#\\\/schema\\\/person\\\/89a4174c275f05d6148fb0fdedc8de4f\"},\"headline\":\"Aiding reverse engineering with Rust and a local LLM\",\"datePublished\":\"2025-04-15T04:22:09+00:00\",\"dateModified\":\"2025-10-21T09:04:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/\"},\"wordCount\":1538,\"publisher\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/RUST.jpg\",\"keywords\":[\"vulnerability research\",\"reverse engineering\",\"pseudocode\",\"rust\",\"ai\",\"ollama\"],\"articleSection\":[\"Tools\",\"Articles\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/\",\"name\":\"HN Security Aiding reverse engineering with Rust and a local LLM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/RUST.jpg\",\"datePublished\":\"2025-04-15T04:22:09+00:00\",\"dateModified\":\"2025-10-21T09:04:37+00:00\",\"description\":\"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/RUST.jpg\",\"contentUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/RUST.jpg\",\"width\":1600,\"height\":836,\"caption\":\"Rust logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/aiding-reverse-engineering-with-rust-and-a-local-llm\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aiding reverse engineering with Rust and a local LLM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/\",\"name\":\"HN Security\",\"description\":\"Offensive Security Specialists\",\"publisher\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#organization\",\"name\":\"HN Security\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/hn-libellula.jpg\",\"contentUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/hn-libellula.jpg\",\"width\":696,\"height\":696,\"caption\":\"HN Security\"},\"image\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/hnsec\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/hnsecurity\\\/\",\"https:\\\/\\\/github.com\\\/hnsecurity\",\"https:\\\/\\\/infosec.exchange\\\/@hnsec\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#\\\/schema\\\/person\\\/89a4174c275f05d6148fb0fdedc8de4f\",\"name\":\"Marco Ivaldi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g\",\"caption\":\"Marco Ivaldi\"},\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/author\\\/marco-ivaldi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HN Security Aiding reverse engineering with Rust and a local LLM","description":"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.","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:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/","og_locale":"it_IT","og_type":"article","og_title":"HN Security Aiding reverse engineering with Rust and a local LLM","og_description":"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.","og_url":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/","og_site_name":"HN Security","article_published_time":"2025-04-15T04:22:09+00:00","article_modified_time":"2025-10-21T09:04:37+00:00","og_image":[{"width":1600,"height":836,"url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","type":"image\/jpeg"}],"author":"Marco Ivaldi","twitter_card":"summary_large_image","twitter_creator":"@hnsec","twitter_site":"@hnsec","twitter_misc":{"Scritto da":"Marco Ivaldi","Tempo di lettura stimato":"7 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#article","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/"},"author":{"name":"Marco Ivaldi","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/89a4174c275f05d6148fb0fdedc8de4f"},"headline":"Aiding reverse engineering with Rust and a local LLM","datePublished":"2025-04-15T04:22:09+00:00","dateModified":"2025-10-21T09:04:37+00:00","mainEntityOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/"},"wordCount":1538,"publisher":{"@id":"https:\/\/hnsecurity.it\/it\/#organization"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","keywords":["vulnerability research","reverse engineering","pseudocode","rust","ai","ollama"],"articleSection":["Tools","Articles"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/","url":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/","name":"HN Security Aiding reverse engineering with Rust and a local LLM","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#primaryimage"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","datePublished":"2025-04-15T04:22:09+00:00","dateModified":"2025-10-21T09:04:37+00:00","description":"Offensive Rust series article that introduces a new AI tool (oneiromancer) to aid with reverse engineering.","breadcrumb":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#primaryimage","url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","contentUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","width":1600,"height":836,"caption":"Rust logo"},{"@type":"BreadcrumbList","@id":"https:\/\/hnsecurity.it\/it\/blog\/aiding-reverse-engineering-with-rust-and-a-local-llm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hnsecurity.it\/it\/"},{"@type":"ListItem","position":2,"name":"Aiding reverse engineering with Rust and a local LLM"}]},{"@type":"WebSite","@id":"https:\/\/hnsecurity.it\/it\/#website","url":"https:\/\/hnsecurity.it\/it\/","name":"HN Security","description":"Offensive Security Specialists","publisher":{"@id":"https:\/\/hnsecurity.it\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hnsecurity.it\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/hnsecurity.it\/it\/#organization","name":"HN Security","url":"https:\/\/hnsecurity.it\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/","url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg","contentUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2026\/01\/hn-libellula.jpg","width":696,"height":696,"caption":"HN Security"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/hnsec","https:\/\/www.linkedin.com\/company\/hnsecurity\/","https:\/\/github.com\/hnsecurity","https:\/\/infosec.exchange\/@hnsec"]},{"@type":"Person","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/89a4174c275f05d6148fb0fdedc8de4f","name":"Marco Ivaldi","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a8a96db06e7315a061d28b320ee7bb4c9d0f1535c58bf0f54218bf8a7569bea0?s=96&d=mm&r=g","caption":"Marco Ivaldi"},"url":"https:\/\/hnsecurity.it\/it\/blog\/author\/marco-ivaldi\/"}]}},"jetpack_featured_media_url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/RUST.jpg","_links":{"self":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/5276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/comments?post=5276"}],"version-history":[{"count":4,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/5276\/revisions"}],"predecessor-version":[{"id":161115,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/5276\/revisions\/161115"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media\/159953"}],"wp:attachment":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media?parent=5276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/categories?post=5276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/tags?post=5276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}