{"id":133,"date":"2021-05-04T11:08:59","date_gmt":"2021-05-04T09:08:59","guid":{"rendered":"https:\/\/security.humanativaspa.it\/?p=133"},"modified":"2025-09-15T13:37:13","modified_gmt":"2025-09-15T13:37:13","slug":"fox-fix-objectivec-xrefs-in-ghidra","status":"publish","type":"post","link":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/","title":{"rendered":"FOX &#8211; Fix Objective-C XREFs in Ghidra"},"content":{"rendered":"<p>Hi! This is my first article on <strong>HN Security<\/strong>&#8216;s blog and I think that showcasing a little tool developed <strong>together with Marco<\/strong> to help us in our everyday&#8217;s mobile assessments could be a good pick for a new beginning!<\/p>\n<p>The tool is called <a href=\"https:\/\/github.com\/federicodotta\/ghidra-scripts\/tree\/main\/FOX\"><strong>FOX<\/strong><\/a>. It&#8217;s a <strong>Ghidra<\/strong> script created to <strong>speed up iOS analysis<\/strong> by adding XREFs (and potential XREFs) to iOS disassembled and decompiled code. This tool will hopefully be <strong>the first of a series of useful Ghidra scripts<\/strong> that will be published in <a href=\"https:\/\/github.com\/federicodotta\/ghidra-scripts\">my repository<\/a> (and in <a href=\"https:\/\/github.com\/0xdea\/ghidra-scripts\">Marco&#8217;s repository<\/a>).<\/p>\n<p>First, why do we need such a tool?<\/p>\n<p>The reason is that Objective-C functions are executed using dynamic function pointers called &#8220;selectors&#8221;, which are resolved by name during runtime. In practice, this means that if we disassemble\/decompile an iOS binary and we look at Objective-C method invocations in the code, we will not find &#8220;classic&#8221; C-like function calls, but we will only see invocations to a bunch of methods (the most common is &#8220;objc_msgSend&#8221;, we will use a generic <strong>msgSend<\/strong> term in this article from now on to point to this group of functions). These particular methods are invoked supplying as arguments the class name, the method name and the method arguments (if any). For example:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-135 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/MsgSendExample1-2.png\" alt=\"\" width=\"661\" height=\"56\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/MsgSendExample1-2.png 661w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/MsgSendExample1-2-300x25.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/MsgSendExample1-2-350x30.png 350w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/p>\n<p>In this example, the method &#8220;decryptStrFromBase64:Key:IV:&#8221; of class &#8220;FWEncryptorAES&#8221; is executed, probably (if the decompiler has not made any mistake) with arguments &#8220;local_28&#8221;, &#8220;local_30&#8221; and &#8220;local_38&#8221;.<\/p>\n<p>From a reverse engineer&#8217;s perspective, this mechanism <strong>has both pros and cons<\/strong>: the binary is usually <strong>more readable<\/strong>, because method names are passed as strings to the msgSend function, but on the other hand <strong>we don&#8217;t have cross-references<\/strong> (XREFs): XREFs are very valuable during reverse engineering sessions because they create links between a function and all the locations in the binary in which that function is called, improving the efficiency of reversing, without having to employ dynamic analysis techniques.<\/p>\n<p>This is FOX&#8217;s purpose: it tries to <strong>add XREFs<\/strong> to the functions called with the msgSend mechanisms.<\/p>\n<p>Let&#8217;s have a look at how it works. From a high-level perspective, the script simply scans the binary, searches for msgSend functions, tries to infer the class name and the method name from the msgSend parameters and finally adds the XREFs.<\/p>\n<p>Extracting class names and method names from the disassembled code in most situations is not difficult, but sometimes it can require complex logic. Luckily, Ghidra takes care of this during its analysis tasks, in order to populate the &#8220;Decompiler&#8221; pane.<\/p>\n<p>FOX uses the following approach:<\/p>\n<ol>\n<li>It searches for msgSend functions in the symbol table of the binary<\/li>\n<li>It retrieves the list of all functions that call one of those msgSend functions<\/li>\n<li>It decompiles each function and stores information related to all msgSend calls, extracting class and method names if present<\/li>\n<li>Finally, it adds the XREFs (and some useful PRE and PLATE comments)<\/li>\n<\/ol>\n<p>As a result, the following msgSend call in the decryptResponse function&#8230;<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-157 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF7-1.png\" alt=\"\" width=\"407\" height=\"21\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF7-1.png 407w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF7-1-300x15.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF7-1-350x18.png 350w\" sizes=\"(max-width: 407px) 100vw, 407px\" \/><\/p>\n<p>&#8230; produces the following XREF reported at the beginning of method &#8220;b:&#8221; of A class:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-146 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF1-1.png\" alt=\"\" width=\"678\" height=\"44\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF1-1.png 678w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF1-1-300x19.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF1-1-350x23.png 350w\" sizes=\"(max-width: 678px) 100vw, 678px\" \/><\/p>\n<p>Unfortunately, Ghidra&#8217;s analyzer is not always able to retrieve class and method names. Especially the class name is often missing. In order to overcome this issue, the user can supply the output of a <a href=\"https:\/\/github.com\/federicodotta\/ghidra-scripts\/blob\/main\/FOX\/extractFunctionList.py\">Frida script<\/a> that can be found in the same repository (this step is not mandatory). This script retrieves a complete list of all Objective-C classes and methods of the application. This list cannot be retrieved statically from the analyzed binary itself, because it lacks all the methods of the system libraries and of other libraries packed with the target application.<\/p>\n<p>Based on this list, the script is able to insert an XREF even if the class name has not been retrieved by Ghidra&#8217;s analyzer, <strong>if and only if there is only one method in the binary with that specific method name<\/strong>. Without this list, the script would not be able to know if there are other methods with the same name outside the binary.<\/p>\n<p>Additionally, a <strong>PRE comment is inserted in the objSend line<\/strong>, containing the retrieved class name (either external or internal to the binary) and, if available, also the function address:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-148 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF3-1.png\" alt=\"\" width=\"648\" height=\"44\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF3-1.png 648w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF3-1-300x20.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF3-1-350x24.png 350w\" sizes=\"(max-width: 648px) 100vw, 648px\" \/><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-147 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF2-1.png\" alt=\"\" width=\"717\" height=\"57\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF2-1.png 717w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF2-1-300x24.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF2-1-350x28.png 350w\" sizes=\"(max-width: 717px) 100vw, 717px\" \/><\/p>\n<p>If there is more than one method with the same name (or if the Frida-generated list has not been supplied), a <strong>PRE comment with a list of the potential callers<\/strong> (external or internal) is added to the msgSend call:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-149 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF4-1.png\" alt=\"\" width=\"716\" height=\"59\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF4-1.png 716w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF4-1-300x25.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF4-1-350x29.png 350w\" sizes=\"(max-width: 716px) 100vw, 716px\" \/><\/p>\n<p>The PRE comment is also added to the msgSend call if both class name and method name are present in the decompiled code, in order to <strong>simplify analysis executed directly on the disassembly<\/strong>:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-151 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF6-1.png\" alt=\"\" width=\"738\" height=\"117\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF6-1.png 738w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF6-1-300x48.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF6-1-350x55.png 350w\" sizes=\"(max-width: 738px) 100vw, 738px\" \/><\/p>\n<p>When we have potential XREFs related to internal methods, the script also adds a <strong>PLATE comment with the potential XREFs<\/strong> at the beginning of potentially referenced internal methods, like the following one:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-150 aligncenter\" src=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF5-1.png\" alt=\"\" width=\"497\" height=\"114\" srcset=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF5-1.png 497w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF5-1-300x69.png 300w, https:\/\/hnsecurity.it\/wp-content\/uploads\/2021\/04\/XREF5-1-350x80.png 350w\" sizes=\"(max-width: 497px) 100vw, 497px\" \/><\/p>\n<p>The script can be executed directly from the GUI or can be executed in <strong>headless mode<\/strong> as follows:<br \/>\n<code><br \/>\n$ analyzeHeadless #PROJECT_DIRECTORY #PROJECT_NAME -import #BINARY_PATH \\<br \/>\n-scriptPath #SCRIPT_FOLDER_PATH -postScript FOX.java #OPTIONAL_FRIDA_OUTPUT_PATH<br \/>\n<\/code><br \/>\nIn the same repository I added<a href=\"https:\/\/github.com\/federicodotta\/ghidra-scripts\/tree\/main\/ExportToGzf\"> a simple Ghidra script<\/a> to<strong> output the project in the gzf archive format<\/strong>, useful if the project is analyzed on one computer and then opened on another machine. The script is a Java transposition of beigela&#8217;s code, posted <a href=\"https:\/\/github.com\/NationalSecurityAgency\/ghidra\/issues\/2104\">here<\/a>. Headless analysis followed by export can be executed as follows:<br \/>\n<code><br \/>\n# without deleting the project folder after the export<br \/>\n$ analyzeHeadless #PROJECT_DIRECTORY #PROJECT_NAME -import #BINARY_PATH \\<br \/>\n-scriptPath #SCRIPT_FOLDER_PATH -postScript FOX.java #OPTIONAL_FRIDA_OUTPUT_PATH \\<br \/>\n-postScript ExportToGzf.java #ARCHIVE_OUTPUT_PATH<\/code><\/p>\n<p># deleting the project folder after the export<br \/>\n$ analyzeHeadless #PROJECT_DIRECTORY #PROJECT_NAME -import #BINARY_PATH \\<br \/>\n-scriptPath #SCRIPT_FOLDER_PATH -postScript FOX.java #OPTIONAL_FRIDA_OUTPUT_PATH \\<br \/>\n-postScript ExportToGzf.java #ARCHIVE_OUTPUT_PATH -deleteProject<\/p>\n<p>The .gzf file can then be imported by creating a new Ghidra project and selecting the &#8220;Import file&#8230;&#8221; option. One <strong>attention point<\/strong>: if <em>deleteProject<\/em> option is selected, the project will be deleted also in the case of errors in the plugins (an example is if there is already a file at the path selected for the export). The risk, especially for binaries that require long analysis time, is to wait for hours for nothing. If you need at least the output of the Ghidra analysis and you have a rigid schedule, it is advisable to avoid the <em>deleteProject<\/em> option. The project can be safely manually deleted after checking the output of the exporter plugins.<\/p>\n<p>Finally, let&#8217;s talk about the <strong>processing time <\/strong>of the script. By looking at the code, it may seem more complex and articulated than necessary (and probably it is! \ud83d\ude00 ). The reason of this complexity is that I tried to scroll the binary listing the least possible to create XREFs and comments, instead of going back and forth multiple times, populating Maps and Lists with the references to functions and msgSend calls that I needed to create the XREFs. Consequently, the code is less readable but it <strong>should<\/strong> be more performing (but surely there are much better ways to do the same thing&#8230;).<\/p>\n<p>The script can be downloaded from my Ghidra scripts repository: <a href=\"https:\/\/github.com\/federicodotta\/ghidra-scripts\">https:\/\/github.com\/federicodotta\/ghidra-scripts<\/a><\/p>\n<p>A lighter version of the script that uses a slightly <strong>different approach<\/strong> can be downloaded from <a href=\"https:\/\/github.com\/0xdea\/ghidra-scripts\">Marco&#8217;s Ghidra scripts repository<\/a>. This version tries to recover class and method names from the <strong>disassembly code<\/strong>, instead of relying on the decompiled code. It has less features than the one based on the decompiler and it makes some approximations, but it usually uses less memory and anyhow it is always better to have more alternative tools with this kind of analysis.<\/p>\n<p>In Marco&#8217;s repository you can also find <a href=\"https:\/\/github.com\/0xdea\/ghidra-scripts\/blob\/main\/Rhabdomancer.java\"><strong>Rhabdomancer<\/strong><\/a>, a simple Ghidra script to assist with <strong>vulnerability research<\/strong> tasks based on a candidate point strategy, against closed source software written in <strong>C\/C++<\/strong>. The purpose of this tool is to <strong>speed up<\/strong> vulnerability research activities on C\/C++ code.<\/p>\n<p>Well, if you are interested in our Ghidra scripts, <strong>follow our repositories<\/strong>! We will soon release other useful tools! \ud83d\ude42<\/p>\n<p>Cheers!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi! This is my first article on HN Security&#8216;s blog and I think that showcasing a little tool developed together [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":159913,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[88],"tags":[83,84,85,86,87],"class_list":["post-133","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools","tag-ghidra","tag-ios","tag-mobile","tag-penetration-test","tag-reverse-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HN Security - FOX - Fix Objective-C XREFs in Ghidra -<\/title>\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\/fox-fix-objectivec-xrefs-in-ghidra\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HN Security - FOX - Fix Objective-C XREFs in Ghidra -\" \/>\n<meta property=\"og:description\" content=\"Hi! This is my first article on HN Security&#8216;s blog and I think that showcasing a little tool developed together [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/\" \/>\n<meta property=\"og:site_name\" content=\"HN Security\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-04T09:08:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-15T13:37:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.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=\"Federico Dotta\" \/>\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=\"Federico Dotta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/\"},\"author\":{\"name\":\"Federico Dotta\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#\\\/schema\\\/person\\\/e0e6046bd2bc829f7d945ad361bce702\"},\"headline\":\"FOX &#8211; Fix Objective-C XREFs in Ghidra\",\"datePublished\":\"2021-05-04T09:08:59+00:00\",\"dateModified\":\"2025-09-15T13:37:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/\"},\"wordCount\":1296,\"publisher\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/GHIDRA.jpg\",\"keywords\":[\"ghidra\",\"iOS\",\"mobile\",\"penetration test\",\"reverse engineering\"],\"articleSection\":[\"Tools\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/\",\"name\":\"HN Security - FOX - Fix Objective-C XREFs in Ghidra -\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/GHIDRA.jpg\",\"datePublished\":\"2021-05-04T09:08:59+00:00\",\"dateModified\":\"2025-09-15T13:37:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/GHIDRA.jpg\",\"contentUrl\":\"https:\\\/\\\/hnsecurity.it\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/GHIDRA.jpg\",\"width\":1600,\"height\":836,\"caption\":\"GHIDRA logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/fox-fix-objectivec-xrefs-in-ghidra\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FOX &#8211; Fix Objective-C XREFs in Ghidra\"}]},{\"@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\\\/e0e6046bd2bc829f7d945ad361bce702\",\"name\":\"Federico Dotta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g\",\"caption\":\"Federico Dotta\"},\"url\":\"https:\\\/\\\/hnsecurity.it\\\/it\\\/blog\\\/author\\\/federico-dotta\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HN Security - FOX - Fix Objective-C XREFs in Ghidra -","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\/fox-fix-objectivec-xrefs-in-ghidra\/","og_locale":"it_IT","og_type":"article","og_title":"HN Security - FOX - Fix Objective-C XREFs in Ghidra -","og_description":"Hi! This is my first article on HN Security&#8216;s blog and I think that showcasing a little tool developed together [&hellip;]","og_url":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/","og_site_name":"HN Security","article_published_time":"2021-05-04T09:08:59+00:00","article_modified_time":"2025-09-15T13:37:13+00:00","og_image":[{"width":1600,"height":836,"url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","type":"image\/jpeg"}],"author":"Federico Dotta","twitter_card":"summary_large_image","twitter_creator":"@hnsec","twitter_site":"@hnsec","twitter_misc":{"Scritto da":"Federico Dotta","Tempo di lettura stimato":"8 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#article","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/"},"author":{"name":"Federico Dotta","@id":"https:\/\/hnsecurity.it\/it\/#\/schema\/person\/e0e6046bd2bc829f7d945ad361bce702"},"headline":"FOX &#8211; Fix Objective-C XREFs in Ghidra","datePublished":"2021-05-04T09:08:59+00:00","dateModified":"2025-09-15T13:37:13+00:00","mainEntityOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/"},"wordCount":1296,"publisher":{"@id":"https:\/\/hnsecurity.it\/it\/#organization"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","keywords":["ghidra","iOS","mobile","penetration test","reverse engineering"],"articleSection":["Tools"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/","url":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/","name":"HN Security - FOX - Fix Objective-C XREFs in Ghidra -","isPartOf":{"@id":"https:\/\/hnsecurity.it\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#primaryimage"},"image":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#primaryimage"},"thumbnailUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","datePublished":"2021-05-04T09:08:59+00:00","dateModified":"2025-09-15T13:37:13+00:00","breadcrumb":{"@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#primaryimage","url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","contentUrl":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","width":1600,"height":836,"caption":"GHIDRA logo"},{"@type":"BreadcrumbList","@id":"https:\/\/hnsecurity.it\/it\/blog\/fox-fix-objectivec-xrefs-in-ghidra\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hnsecurity.it\/it\/"},{"@type":"ListItem","position":2,"name":"FOX &#8211; Fix Objective-C XREFs in Ghidra"}]},{"@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\/e0e6046bd2bc829f7d945ad361bce702","name":"Federico Dotta","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/02d5d800b81f2a125ac23ee31a108ee2404d123bd3b722f2e263f0130cc1df42?s=96&d=mm&r=g","caption":"Federico Dotta"},"url":"https:\/\/hnsecurity.it\/it\/blog\/author\/federico-dotta\/"}]}},"jetpack_featured_media_url":"https:\/\/hnsecurity.it\/wp-content\/uploads\/2025\/09\/GHIDRA.jpg","_links":{"self":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/133","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\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/comments?post=133"}],"version-history":[{"count":1,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"predecessor-version":[{"id":159972,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/posts\/133\/revisions\/159972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media\/159913"}],"wp:attachment":[{"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hnsecurity.it\/it\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}