{"id":4868,"date":"2023-01-31T09:05:43","date_gmt":"2023-01-31T08:05:43","guid":{"rendered":"https:\/\/sanctuary.dev\/?p=4868"},"modified":"2023-02-09T09:41:29","modified_gmt":"2023-02-09T08:41:29","slug":"hypervisor-assisted-debugging","status":"publish","type":"post","link":"https:\/\/sanctuary.dev\/de\/blog\/hypervisor-assisted-debugging\/","title":{"rendered":"Hypervisor-assisted Debugging"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"4868\" class=\"elementor elementor-4868\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4009ec4 nd-elementor-section-full elementor-section-height-default elementor-section-height-default\" data-id=\"4009ec4\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1c06d8c\" data-id=\"1c06d8c\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-70defa4 elementor-widget elementor-widget-text-editor\" data-id=\"70defa4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p class=\"nd-font-size-intro\">Die Arbeit an einem Hypervisor bringt eine Reihe von Herausforderungen mit sich. Eine besondere Herausforderung ist dabei die Ger\u00e4teemulation. Das mag \u00fcbertrieben sein, wenn man in simulierten Umgebungen wie der Fixed Virtual Platform von ARM arbeitet. Sobald man jedoch zu echter Hardware wechselt, k\u00f6nnen die Dinge aus dem Ruder laufen.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e0173ed nd-elementor-section-full elementor-section-height-default elementor-section-height-default\" data-id=\"e0173ed\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e21a2c8\" data-id=\"e21a2c8\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-32c916a elementor-widget elementor-widget-text-editor\" data-id=\"32c916a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2>Verlassen der simulierten Umgebung<\/h2>\n<p>Eine h\u00e4ufige Komponente in allen eingebetteten Ger\u00e4ten sind Power Management Integrated Circuit (PMIC) Regler. Ihre Grundfunktion ist relativ einfach: Sie verwalten den Fluss und die Richtung des Stroms. Dazu regeln sie die Eingangsspannungen und -str\u00f6me und schalten die verf\u00fcgbaren Ger\u00e4te ein. Aber die Dinge sind komplexer. In Wirklichkeit verwendet jeder Hersteller unz\u00e4hlige verschiedene Regler mit mindestens ebenso vielen Funktionen, die er noch zus\u00e4tzlich anh\u00e4uft. So kann z. B. ein bestimmter Ger\u00e4tetreiber eine Teilmenge der Funktionen des Leistungsreglertreibers implementieren und ihn direkt \u00fcber <a href=\"https:\/\/elixir.bootlin.com\/linux\/v4.0\/source\/Documentation\/devicetree\/bindings\/mfd\/syscon.txt\">syscon<\/a> direkt abfragen, um den Zustand eines zugeh\u00f6rigen Subsystems zu ermitteln. Bei diesem Teilsystem k\u00f6nnte es sich um einen Frequenzteiler handeln, der vor dem Zur\u00fccksetzen des Ger\u00e4ts aktiv sein muss.<\/p>\n\n<h2>Typische Probleme mit Power Regulators<\/h2>\n<p>All dies wird zu einem Problem, wenn die Integration in einem SoC zu unflexibel ist. Leistungsregler (oder deren Treiber) m\u00fcssen mit Blick auf die Virtualisierung entwickelt werden. Nehmen wir zum Beispiel an, es sollen Ger\u00e4te zwischen mehreren VMs aufgeteilen werden, wobei jede VM exklusiven Zugriff auf das ihr zugewiesene Ger\u00e4t hat. Da auf Arm-Architekturen Device Trees anstelle von Mechanismen wie <a href=\"https:\/\/www.kernel.org\/doc\/html\/v5.2\/firmware-guide\/acpi\/enumeration.html\">ACPI Device Enumeration<\/a>verwendet werden, ist der erste logische Schritt, die nicht ben\u00f6tigten Ger\u00e4teknoten aus dem Ger\u00e4tebaum der einzelnen VMs zu l\u00f6schen. Gesagt und getan. Aber jetzt stellt man fest, dass der Treiber der einen VM das Ger\u00e4t eingeschaltet hat, w\u00e4hrend der andere Treiber der zweiten VM es wieder ausgeschaltet hat. Und warum? Weil dieser Treiber erwartet hat, den Ger\u00e4teknoten der ersten VM im Device Tree zu finden und davon ausgeht, dass sein Fehlen bedeutet, dass das Ger\u00e4t deaktiviert wurde. Warum also nicht sicherstellen, dass seine Stromversorgung ebenfalls deaktiviert ist? Es kann sehr lange dauern bis solche Probleme aufgesp\u00fcrt werden. Dar\u00fcber hinaus sind Hardware-Debugging-L\u00f6sungen aufgrund mangelnder Unterst\u00fctzung f\u00fcr bestimmte Plattformen manchmal keine Option (normalerweise hat <a href=\"https:\/\/openocd.org\/\">OpenOCD<\/a> immerhin noch eine bessere Schnittstelle zu Hardware-Debuggern zu haben als OEM-Software). Und damit sind wir wieder beim eigentlichen Thema.<\/p>\n\n<h2>Vorteile des Hypervisor-assisted Debugging<\/h2>\n<p>Wenn man an einem Punkt angelangt ist, an dem nicht einmal ein \"printk\"-Debugging m\u00f6glich ist, scheinen die M\u00f6glichkeiten begrenzt zu sein. Tats\u00e4chlich bleibt ohne Hardware-Debugger nur die M\u00f6glichkeit, den ausf\u00fchrenden Kernel in EL2 (Hypervisor-Space) zu trappen, vorausgesetzt, es gibt einen Hypervisor. Dies kann auf verschiedene Weise geschehen:<\/p>\n\n<ul>\n \t<li><p><b>Speicherzugriffe trappen<\/b> , indem die physischen Adressbereiche des Hosts nicht auf den physischen Adressraum des Gastes abgebildet werden. Durch die Verwendung der Stage-2-Page-Table-Funktion in Arm-Prozessoren (auch bekannt als Extended Page Tables - Intel, Nested Page Tables - AMD) konfigurieren wir die MMU im Wesentlichen so, dass sie zwei \u00dcbersetzungen vornimmt: eine vom virtuellen Adressraum des Gastes in den physischen Adressraum des Gastes und eine weitere zwischen letzterem und dem physischen Adressraum des Hosts (d. h. der tats\u00e4chlichen physischen Adresse). Ein Fehler bei der ersten \u00dcbersetzung wird in EL1 (Kernel-Space) behandelt, w\u00e4hrend ein Fehler bei der zweiten \u00dcbersetzung vom Hypervisor behoben werden muss. Diese L\u00f6sung umfasst die Durchf\u00fchrung der beabsichtigten Operation (gem\u00e4\u00df dem Exception Syndrome Register), die Inkrementierung des Programmz\u00e4hlers und die R\u00fcckkehr zu EL1. Zwischen diesen Schritten k\u00f6nnen wir jede beliebige Debugging-bezogene Operation durchf\u00fchren, die wir w\u00fcnschen.<\/p><\/li>\n \t<li><p><b>Trap-Instruktionen einf\u00fcgen<\/b>, was entweder programmatisch erfolgen kann (wie bei Software-Breakpoints, d. h. Ersetzen des ersten Bytes der Zielanweisung durch ein <code>int 3<\/code> oder <code>brk<\/code> abh\u00e4ngig von der Architektur) oder manuell, durch Einf\u00fcgen von <code>hvc<\/code> oder <code>smc<\/code> Instruktionen im Kernel Code. Der Vorteil gegen\u00fcber der vorherigen Methode ist, dass sie eine gezieltere Fehlersuche mit weniger Aufwand erm\u00f6glicht.<\/p><\/li>\n \t<li><p><b>Hardware Debug Registers<\/b> erzielen mehr oder weniger den gleichen Effekt wie die erste Methode. Je nach Anforderungen k\u00f6nnen diese jedoch n\u00fctzlich sein, um Single Stepping zu implementieren und Speicherzugriff-Traps auf Instruktion-Fetches zu beschr\u00e4nken, wodurch der Prozess erheblich beschleunigt wird.<\/p><\/li>\n<\/ul>\nW\u00e4hrend diese Bausteine immerhin zu einem rudiment\u00e4ren Debugging f\u00fchren, sind Funktionen wie VM Introspection und DWARF-Symbolparsing deutlich schwerer zu integrieren. Nichtsdestotrotz: anspruchsvollere Werkzeuge <b>werden<\/b> gebraucht.\n\n<a href=\"https:\/\/github.com\/HyperDbg\/HyperDbg\">HyperDbg<\/a> ist ein Beispiel f\u00fcr einen Hypervisor-gest\u00fctzten Debugger, der Intels VT-x- und TSX-Erweiterungen nutzt, um eine robustere Debugging-Infrastruktur bereitzustellen, \u00e4hnlich der, die in einem Arm-\u00d6kosystem erforderlich w\u00e4re. Nichtsdestotrotz wird die Forschung zu diesem Thema durch die anhaltenden Herausforderungen beim Reverse Engineering und der Malware-Analyse erschwert. Die Verbesserung der Portabilit\u00e4t und der Benutzerfreundlichkeit treten angesichts der modernen Code-Packer und -Schutzmechanismen in den Hintergrund.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Bei der Portierung von Low-Level-Software auf ein eingebettetes Ger\u00e4t sind die Debugging-M\u00f6glichkeiten oft recht eingeschr\u00e4nkt. Serial Output und Printing funktionieren nicht, was also tun? In diesem Blogbeitrag gehen wir auf typische Probleme und das Hypervisor-gest\u00fctzte Debugging als m\u00f6gliche Alternative ein.<\/p>","protected":false},"author":12,"featured_media":4893,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-4868","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-know-how"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hypervisor-assisted Debugging - SANCTUARY<\/title>\n<meta name=\"description\" content=\"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sanctuary.dev\/de\/blog\/hypervisor-assisted-debugging\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hypervisor-assisted Debugging - SANCTUARY\" \/>\n<meta property=\"og:description\" content=\"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sanctuary.dev\/de\/blog\/hypervisor-assisted-debugging\/\" \/>\n<meta property=\"og:site_name\" content=\"SANCTUARY\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-31T08:05:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-09T08:41:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Patrick Jauernig\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@sanctuary_dev\" \/>\n<meta name=\"twitter:site\" content=\"@sanctuary_dev\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/\"},\"author\":{\"name\":\"Patrick Jauernig\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/8a76acac1b46c49e9fb1948181536f5c\"},\"headline\":\"Hypervisor-assisted Debugging\",\"datePublished\":\"2023-01-31T08:05:43+00:00\",\"dateModified\":\"2023-02-09T08:41:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/\"},\"wordCount\":758,\"publisher\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg\",\"articleSection\":[\"Know-how\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/\",\"url\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/\",\"name\":\"Hypervisor-assisted Debugging - SANCTUARY\",\"isPartOf\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg\",\"datePublished\":\"2023-01-31T08:05:43+00:00\",\"dateModified\":\"2023-02-09T08:41:29+00:00\",\"description\":\"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.\",\"breadcrumb\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage\",\"url\":\"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg\",\"contentUrl\":\"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg\",\"width\":1920,\"height\":1280,\"caption\":\"Hands resting on a laptop, coding.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/sanctuary.dev\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hypervisor-assisted Debugging\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#website\",\"url\":\"https:\/\/sanctuary.dev\/en\/\",\"name\":\"SANCTUARY\",\"description\":\"The Embedded Security Experts\",\"publisher\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/sanctuary.dev\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#organization\",\"name\":\"SANCTUARY\",\"url\":\"https:\/\/sanctuary.dev\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/sanctuary.dev\/app\/uploads\/2022\/07\/sanctuary_linkedin_logo_v4.png\",\"contentUrl\":\"https:\/\/sanctuary.dev\/app\/uploads\/2022\/07\/sanctuary_linkedin_logo_v4.png\",\"width\":1841,\"height\":1841,\"caption\":\"SANCTUARY\"},\"image\":{\"@id\":\"https:\/\/sanctuary.dev\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/sanctuary_dev\",\"https:\/\/www.linkedin.com\/company\/sanctuary-dev\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/8a76acac1b46c49e9fb1948181536f5c\",\"name\":\"Patrick Jauernig\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6f8d1d76523044ced2626b1c8c709acfeb177611c438a7965685bd8423af475b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6f8d1d76523044ced2626b1c8c709acfeb177611c438a7965685bd8423af475b?s=96&d=mm&r=g\",\"caption\":\"Patrick Jauernig\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hypervisor-assisted Debugging - SANCTUARY","description":"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.","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:\/\/sanctuary.dev\/de\/blog\/hypervisor-assisted-debugging\/","og_locale":"de_DE","og_type":"article","og_title":"Hypervisor-assisted Debugging - SANCTUARY","og_description":"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.","og_url":"https:\/\/sanctuary.dev\/de\/blog\/hypervisor-assisted-debugging\/","og_site_name":"SANCTUARY","article_published_time":"2023-01-31T08:05:43+00:00","article_modified_time":"2023-02-09T08:41:29+00:00","og_image":[{"width":1920,"height":1280,"url":"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg","type":"image\/jpeg"}],"author":"Patrick Jauernig","twitter_card":"summary_large_image","twitter_creator":"@sanctuary_dev","twitter_site":"@sanctuary_dev","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#article","isPartOf":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/"},"author":{"name":"Patrick Jauernig","@id":"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/8a76acac1b46c49e9fb1948181536f5c"},"headline":"Hypervisor-assisted Debugging","datePublished":"2023-01-31T08:05:43+00:00","dateModified":"2023-02-09T08:41:29+00:00","mainEntityOfPage":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/"},"wordCount":758,"publisher":{"@id":"https:\/\/sanctuary.dev\/en\/#organization"},"image":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage"},"thumbnailUrl":"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg","articleSection":["Know-how"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/","url":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/","name":"Hypervisor-assisted Debugging - SANCTUARY","isPartOf":{"@id":"https:\/\/sanctuary.dev\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage"},"image":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage"},"thumbnailUrl":"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg","datePublished":"2023-01-31T08:05:43+00:00","dateModified":"2023-02-09T08:41:29+00:00","description":"In this blog post, we go through typical problems and hypervisor-assisted debugging as a potential alternative.","breadcrumb":{"@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#primaryimage","url":"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg","contentUrl":"https:\/\/sanctuary.dev\/app\/uploads\/2023\/02\/laptop_coding.jpg","width":1920,"height":1280,"caption":"Hands resting on a laptop, coding."},{"@type":"BreadcrumbList","@id":"https:\/\/sanctuary.dev\/en\/blog\/hypervisor-assisted-debugging\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sanctuary.dev\/en\/"},{"@type":"ListItem","position":2,"name":"Hypervisor-assisted Debugging"}]},{"@type":"WebSite","@id":"https:\/\/sanctuary.dev\/en\/#website","url":"https:\/\/sanctuary.dev\/en\/","name":"SANCTUARY","description":"The Embedded Security Experts","publisher":{"@id":"https:\/\/sanctuary.dev\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sanctuary.dev\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/sanctuary.dev\/en\/#organization","name":"SANCTUARY","url":"https:\/\/sanctuary.dev\/en\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/sanctuary.dev\/en\/#\/schema\/logo\/image\/","url":"https:\/\/sanctuary.dev\/app\/uploads\/2022\/07\/sanctuary_linkedin_logo_v4.png","contentUrl":"https:\/\/sanctuary.dev\/app\/uploads\/2022\/07\/sanctuary_linkedin_logo_v4.png","width":1841,"height":1841,"caption":"SANCTUARY"},"image":{"@id":"https:\/\/sanctuary.dev\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/sanctuary_dev","https:\/\/www.linkedin.com\/company\/sanctuary-dev\/"]},{"@type":"Person","@id":"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/8a76acac1b46c49e9fb1948181536f5c","name":"Patrick Jauernig","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/sanctuary.dev\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6f8d1d76523044ced2626b1c8c709acfeb177611c438a7965685bd8423af475b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f8d1d76523044ced2626b1c8c709acfeb177611c438a7965685bd8423af475b?s=96&d=mm&r=g","caption":"Patrick Jauernig"}}]}},"_links":{"self":[{"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/posts\/4868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/comments?post=4868"}],"version-history":[{"count":24,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/posts\/4868\/revisions"}],"predecessor-version":[{"id":4912,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/posts\/4868\/revisions\/4912"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/media\/4893"}],"wp:attachment":[{"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/media?parent=4868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/categories?post=4868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sanctuary.dev\/de\/wp-json\/wp\/v2\/tags?post=4868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}