Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

x86 Microcode Framework and Example Programs

This repository contains the framework used during our work on reverse engineering the microcode of AMD K8 and K10 CPUs. It includes an assembler and disassembler as well as example programs implemented using these tools. We also provide our custom written minimal operating system that can rapidly apply and test microcode updates on AMD CPUs.

Disclaimer

The here provided files originated from research and are meant to be used for research purposes only. They are compiled with only partial knowledge about the microarchitecture's internals and may contain bugs as well as unintended behavior. All files are provided as is without any warranties and support. We assume no responsibility or liability for the use of them.

Background

The x86 instruction set is complex and contains many legacy instructions only kept for backward compatibility. Thus, rarely used or complex instructions are decoded in software, while performance critical instructions are handled by hardware decoders. Regardless of being decoded by hardware or software the instructions ultimately are translated to another instruction set named RISC86, which has a fixed instruction length and is suited for fast, superscalar processing. Besides software decoding microcode may be used to disable defective processor features and handle exceptions at the lowest level.

The content of this repository reflects the practical results of our research effort. Details are given in our papers:

Reverse Engineering x86 Processor Microcode published in the proceedings of the 26th USENIX Security Symposium

An Exploratory Analysis of Microcode as a Building Block for System Defenses published in the proceedings of the 25th ACM Conference on Computer and Communications Security

Structure

The folder Usenix17 contains the results of our Usenix 2017 paper, most importantly the updates and triggers for our proof-of-concepts as well as an update driver allowing arbitrary updates to be loaded on a Linux system. Further details are given in the corresponding readme file.

Our minimal operating system is contained in the folder angry_os. For details on how to build and use this system see the readme file in that folder.

The framework we used during our work is found in the folder ucodeapi. For examples on how this API is used see the example scripts provided in this folder. The API is only tested under Python 2.

The folder "case studies" contains the case studies presented in our CSS 18 paper in RTL form.

About

Microcode Updates for the USENIX 2017 paper: Reverse Engineering x86 Processor Microcode

Topics

Resources

Stars

356 stars

Watchers

30 watching

Forks

Releases

Packages

Contributors

Languages