Free CRX Extractor: View Extension Source and Permissions
Drop an extension file to unpack it, read its code and see what it can do. Free, and it runs in your browser.
Runs entirely in your browser. Nothing you paste or open is uploaded.
What Chrome Asks at Install
Worth a Closer Look
Permissions Explained
| Permission | What it allows | Chrome’s warning | Risk |
|---|
Sites, Scripts and Settings
Files
Choose a file to read it.
How to Use the CRX Extractor
Get the extension file
Use a .crx you packed yourself, a .xpi saved from addons.mozilla.org, or a .zip of an extension folder. This page never downloads extensions for you, so the file always comes from you.
Drop it on the box
Or click the box to choose a file. The tool reads the CRX header, finds where the zip archive starts and unpacks it in memory.
Read the summary and permissions
You get the name, version, manifest version and extension ID, then every permission with what it allows, the exact warning Chrome shows at install, and a low, medium or high risk level.
Browse the source code
Click any file in the tree to read it. Text files open in the viewer, images show as a preview, and other binary files are listed with their size.
Download the unpacked zip
The download is the archive without the CRX header, so any unzip tool opens it. To run it, unzip it, turn on Developer mode in chrome://extensions and choose Load unpacked.
What Happens to the File You Drop, and What the Tool Can’t Do
The file never leaves your computer. Your browser reads it into memory in this tab, and everything else happens there too: the header parsing, the unzip (JSZip, which loads only after you drop a file) and the SHA-256 hash for the extension ID, which uses the browser’s built-in Web Crypto. No request carries the file or anything from it, nothing is stored, and closing the tab discards it.
Exactly what gets read: the first bytes, to tell a CRX from a zip; the CRX3 header, for the public keys and the signed extension ID; manifest.json; the messages.json file for the default language, to turn placeholders like __MSG_appName__ into the real name; and any file you click.
- It doesn’t verify signatures. It reads the keys and the signed ID, but it doesn’t check the RSA or ECDSA signatures, so a tampered file still opens. Chrome checks them when you install.
- It reads code, it doesn’t run it. A permission list tells you what an extension could do, not what it does.
- The install warnings are worked out from Chrome’s published rules. Chrome merges some of them, so the real dialog can be slightly shorter.
- Minified or obfuscated code opens, but it’s hard to read. Look for a .map file next to it, which sometimes holds the original source.
- Safari extensions come inside Mac apps, not in a CRX or zip, so the tool can’t open them.
Error messages: “isn’t a CRX, XPI or ZIP file” means the first bytes are neither “Cr24” nor “PK”, often because a web page was saved instead of the file. “Header says it is longer than the file” means the download stopped early. “No manifest.json” means the zip isn’t an extension.
What Is a CRX File?
A CRX file is a Chrome extension package: a zip archive of the extension’s folder with a signed header in front of it. Chrome, Edge, Brave, Opera, Vivaldi and Arc all use the format. The header does two jobs. It carries the developer’s public key, which fixes the extension’s ID, and it carries signatures that let the browser check that nobody changed the files after they were packed. Packages from the Chrome Web Store carry a second signature from the store.
Because of that header, a CRX is a zip with extra bytes at the start. Some unzip tools skip them and open it anyway, and others report a damaged archive. A CRX extractor cuts the header off at the right byte before it unzips. There have been two versions. Current Chromium accepts only CRX3, so CRX2 files are mostly old downloads.
| Part | CRX2 (old) | CRX3 (current) |
|---|---|---|
| Magic number | “Cr24”, 4 bytes | “Cr24”, 4 bytes |
| Version | 2 (4 bytes, little-endian) | 3 (4 bytes, little-endian) |
| Header length | Public key length and signature length, 4 bytes each | One 4-byte length of the header that follows |
| Header contents | One RSA public key, then one signature | A protocol buffer (CrxFileHeader) with RSA and ECDSA key proofs |
| Extension ID | Worked out from the key | Also stored in the signed data: crx_id, 16 bytes |
| After the header | A normal zip archive | A normal zip archive |
How Do I Get an Extension’s CRX File?
This page deliberately doesn’t fetch extensions. These are the legitimate ways to get the file:
- Pack your own. In chrome://extensions, turn on Developer mode, click Pack extension and choose the extension’s folder. Chrome writes a .crx and a .pem file. The .pem is the private key: keep it secret, because you need it to publish updates under the same ID.
- Know the Chrome Web Store link format. A store page looks like chromewebstore.google.com/detail/name/ followed by the 32-letter extension ID. Chrome downloads packages from the update service at clients2.google.com/service/update2/crx, asking for that ID and your Chrome version. Downloader sites and viewer extensions call the same service. Whether you may do that depends on the store’s terms and the extension’s license.
- Use a source viewer extension. Several extensions, found by searching the store for “CRX viewer”, add a button to store pages that opens or saves the package. Check what they ask for with this tool first.
- Save a Firefox add-on. On addons.mozilla.org, right-click Add to Firefox and choose Save Link As. You get the signed .xpi without installing it.
- Zip an installed copy. Every Chromium browser keeps unpacked copies in the Extensions folder of your profile, one folder per ID. Zip the version folder and drop the zip here.
Every Chrome Extension Permission Explained
Chrome extension permissions are the capabilities an extension declares in manifest.json. Chrome shows a warning at install for the risky ones and grants the rest silently. The table lists every permission that triggers a warning, with Chrome’s exact wording, plus the powerful ones that don’t. The risk level is our judgement of what a dishonest extension could do with it.
Some warnings merge. With access to all sites, Chrome drops the “Read your browsing history” line from “tabs”, because the all-sites warning already covers it. With both “sessions” and “tabs”, the line becomes “Read your browsing history on all your signed-in devices”. Permissions not listed here show no warning and are low risk.
| Permission | What it allows | Warning Chrome shows | Risk |
|---|---|---|---|
| accessibilityFeatures.modify | Turn accessibility features such as high contrast or the screen magnifier on and off. | Change your accessibility settings | Medium |
| accessibilityFeatures.read | See which accessibility features you have switched on. | Read your accessibility settings | Low |
| activeTab | Temporary access to the current tab, only after you click the extension or use its shortcut. | No warning | Low |
| background | Start Chrome early at login and keep it running after the last window closes. | No warning | Medium |
| bookmarks | Read, create, edit and delete your bookmarks. | Read and change your bookmarks | Medium |
| browsingData | Delete browsing data such as history, cookies and cache. | No warning | Medium |
| clipboardRead | Read whatever you copy, including passwords and one-time codes. | Read data you copy and paste | High |
| clipboardWrite | Put text on your clipboard. | Modify data you copy and paste | Low |
| contentSettings | Change per-site settings for cookies, JavaScript, camera, microphone and location. | Change your settings that control websites’ access to features such as cookies, JavaScript, plugins, geolocation, microphone, camera etc. | High |
| cookies | Read and change cookies, including sign-in cookies, on sites it also has host access to. | No warning | Medium |
| debugger | Attach Chrome’s debugger to pages: read and change anything, including network traffic. | Access the page debugger backend. Read and change all your data on all websites | High |
| declarativeNetRequest | Block or redirect network requests using rules (how MV3 ad blockers work). | Block content on any page | Medium |
| declarativeNetRequestFeedback | See which of its blocking rules matched, for debugging. | Read your browsing history | Medium |
| desktopCapture | Record your screen, a window or a tab (you pick what to share). | Capture content of your screen | High |
| documentScan | Use document scanners. | Access document scanners attached via USB or on the local network | Low |
| downloads | Start, pause, search and delete downloads. | Manage your downloads | Medium |
| downloads.open | Open files it has downloaded. | Manage your downloads | Medium |
| downloads.ui | Change how the download bar or bubble looks. | Manage your downloads | Low |
| favicon | Show site icons from Chrome’s own cache, without contacting the sites. | Read the icons of the websites you visit | Low |
| geolocation | Get your physical location without asking each time. | Detect your physical location | High |
| history | Read, add and delete your full browsing history. | Read and change your browsing history on all your signed-in devices | High |
| identity.email | Read the email address of your browser profile. | Know your email address | Medium |
| management | List, disable and uninstall your other extensions and apps. | Manage your apps, extensions, and themes | High |
| nativeMessaging | Talk to a program installed on your computer, outside the browser’s sandbox. | Communicate with cooperating native applications | High |
| notifications | Show system notifications. | Display notifications | Low |
| pageCapture | Save a whole page as MHTML, including what you typed and see. | Read and change all your data on all websites | High |
| privacy | Change privacy settings such as safe browsing and third-party cookies. | Change your privacy-related settings | High |
| proxy | Send all your browser traffic through a server it chooses. | Read and change all your data on all websites | High |
| readingList | Read and edit your reading list. | Read and change entries in the reading list | Low |
| scripting | Inject code into pages, but only on sites it has host access to. | No warning | Medium |
| storage | Save its own settings and data. | No warning | Low |
| system.storage | List and eject USB drives and other removable storage. | Identify and eject storage devices | Low |
| tabCapture | Record the audio and video of a tab. | Read and change all your data on all websites | High |
| tabGroups | Read, create and change tab groups. | View and manage your tab groups | Low |
| tabs | See the URL and title of every open tab. | Read your browsing history | Medium |
| topSites | Read your most visited sites. | Read a list of your most frequently visited websites | Medium |
| ttsEngine | Act as a voice, which means it receives all text read aloud. | Read all text spoken using synthesized speech | Medium |
| userScripts | Run user scripts on pages; you must also switch this on yourself. | No warning | High |
| webAuthenticationProxy | Handle passkey and security key requests for websites. | Read and change all your data on all websites | High |
| webNavigation | See every page you navigate to, as you navigate. | Read your browsing history | Medium |
| webRequest | Watch network requests on sites it has host access to. | No warning | Medium |
| webRequestBlocking | Block or change requests as they happen. MV2, or policy-installed MV3 extensions only. | No warning | High |
Host Permissions vs API Permissions
API permissions, like “tabs” or “bookmarks”, unlock a browser feature. Host permissions decide which websites an extension can read and change. They are match patterns such as https://github.com/*, and in Manifest V3 they live in host_permissions. Chrome also counts the sites listed under content_scripts, because code injected into a page can read everything on it.
Host permissions matter most. An extension that can read and change a page can see what you type into it and change what you see, on your email and bank too if the pattern covers them. You can narrow access after installing: right-click the extension’s icon, open “This can read and change site data”, and pick when you click the extension, on specific sites, or on all sites.
| What the manifest asks for | Warning Chrome shows |
|---|---|
| <all_urls>, *://*/* or https://*/* | Read and change all your data on all websites |
| https://github.com/* | Read and change your data on github.com |
| https://*.google.com/* | Read and change your data on all google.com sites |
| Two or three sites | Read and change your data on a.com and b.com (up to three are named) |
| Four or more sites | Read and change your data on a number of websites |
| activeTab only | No warning. Access to one tab, only after you click the extension |
How Is a Chrome Extension ID Generated?
A Chrome extension ID is 32 letters from a to p, and it comes from the developer’s public key. Chrome hashes the key (in DER SubjectPublicKeyInfo form) with SHA-256, keeps the first 16 bytes, writes them as 32 hex digits and maps each digit 0–f to a letter a–p. So “0” becomes “a” and “f” becomes “p”. The same key always gives the same ID, which is why the ID survives updates and why losing the .pem key means publishing under a new ID.
Chromium’s own test file valid_no_publisher.crx3 is a good check: its key gives the ID ojjgnpkioondelmggbekfhllhdaimnho. This tool finds the same ID when you drop that file. In a CRX3 the ID is also written into the signed header, and the tool shows which key matches it.
Unpacked extensions with no key get an ID from a hash of their folder path, so moving the folder changes the ID. Developers pin it by copying the public key into the “key” field of manifest.json, and the tool reads that too. Firefox works differently: the ID is an email-style name or a GUID set in browser_specific_settings.gecko.id.
Chrome Extension Source Viewer: How to Read the Code
Extensions are JavaScript, HTML and CSS, so the source is right there once the package is unzipped. Start with manifest.json. It names the background service worker, the content scripts and the pages the extension opens. Then read the files it lists: the service worker runs all the time the extension is active, and content scripts run inside the sites in their matches list.
When reading code, look for network calls (fetch, XMLHttpRequest, WebSocket, sendBeacon) and where they send data, for eval or new Function, and for code that builds URLs from the pages you visit. Manifest V3 forbids running code downloaded from a server, but an extension can still send data out.
| Browser | Package format | Installed copy | Find the profile folder |
|---|---|---|---|
| Chrome | CRX3 | Profile folder, Extensions, then ID and version | chrome://version, Profile Path |
| Edge | CRX3 | Profile folder, Extensions | edge://version, Profile path |
| Brave | CRX3 | Profile folder, Extensions | brave://version, Profile Path |
| Opera | CRX3 | Profile folder, Extensions (roaming AppData on Windows) | opera://about, Profile |
| Vivaldi | CRX3 | Profile folder, Extensions | vivaldi://about, Profile Path |
| Arc | CRX3 (installs from the Chrome Web Store) | Profile folder, Extensions | chrome://version, Profile Path |
| Firefox | XPI (a signed zip) | Profile folder, extensions, one .xpi per add-on | about:support, Profile Folder |
| Safari | Inside a Mac app (.appex) | The app in /Applications | Not a separate file |
Red Flags Before You Install an Extension
These are the signs worth stopping for before you click Add:
- It wants all your sites when its job involves one. A coupon tool for one shop doesn’t need your email.
- It asks for history, cookies, clipboardRead, management, nativeMessaging, proxy or debugger without an obvious reason.
- Its content scripts match <all_urls>, so its code runs inside every page you open.
- An update adds a permission. Chrome disables the extension until you accept, and that pause is your chance to ask why.
- Its update_url points somewhere other than a browser store.
- Its security policy allows unsafe-eval, or its code is heavily obfuscated with no source map.
- It changed owner recently, or its store page and its permissions describe different things.
- It is still Manifest V2. Chrome has stopped running those, so the file is old or not meant for Chrome.
Manifest V2 vs Manifest V3: What Changed?
The manifest_version field tells you which rules an extension follows. Chrome disabled every MV2 extension in Chrome 138 in July 2025, removed MV2 support in Chrome 139, and removed the last MV2 extensions from the Chrome Web Store on 31 August 2026. Firefox supports both versions and has said it has no plans to drop MV2.
| Area | Manifest V2 | Manifest V3 |
|---|---|---|
| Background code | A persistent page or an event page | A service worker in Chrome (Firefox uses an event page) |
| Site access | Listed in permissions | Listed in host_permissions |
| Blocking requests | webRequestBlocking | declarativeNetRequest rules |
| Remote code | Allowed with a relaxed security policy | Not allowed: all code must be in the package |
| content_security_policy | A single string | An object with an extension_pages key |
| web_accessible_resources | A list of files any site can load | Files plus the sites allowed to load them |
Frequently Asked Questions
What is a CRX extractor?
A CRX extractor removes the signed header from a Chrome extension package and unzips what’s left, so you can read the extension’s files. This one runs in your browser, so the file isn’t uploaded anywhere.
Is it safe to install a CRX from outside the Chrome Web Store?
Only if you trust where it came from and have read what it asks for. On Windows and macOS, Chrome usually refuses packages that lack the store’s signature, often with the error CRX_REQUIRED_PROOF_MISSING. The supported route for your own code is to unzip it and use Load unpacked in Developer mode.
What does “Read and change all your data on all websites” mean?
It means the extension can read and change every page you visit, including what you type into forms. Chrome shows it for <all_urls> or any pattern that matches every site, and for a few APIs such as proxy and debugger. Some tools need it, but it should match what the extension is for.
How is a Chrome extension ID generated?
It is the first 128 bits of the SHA-256 hash of the developer’s public key, written as 32 letters from a to p. The tool computes it from the key inside the CRX, or from the “key” field in manifest.json when you drop a zip.
Where do I find an extension’s ID without the CRX?
Open chrome://extensions and turn on Developer mode, and each extension shows its ID. The 32-letter ID is also the last part of its Chrome Web Store address.
Why won’t my unzip tool open a CRX file?
Because a CRX starts with a signed header, not with the zip itself. Some tools skip the header and others call the file damaged. Drop it here and use Download unpacked zip to get a clean archive.
Can this CRX viewer download extensions from the Chrome Web Store?
No. The page never contacts the store or any other server with your file. You supply the file, which keeps the tool private and avoids breaking the store’s terms.
Does it work with Firefox XPI and Edge extensions?
Yes. Edge uses the same CRX3 format as Chrome, and a Firefox .xpi is a signed zip, so both open. The permission warnings shown are Chrome’s; Firefox words its warnings differently.
What permissions does BelayTab ask for?
BelayTab asks for tabs, tabGroups, sessions, storage, unlimitedStorage, alarms, favicon and contextMenus, with no host permissions and no content scripts. In Chrome that means three install warnings: view and manage your tab groups, read your browsing history on all your signed-in devices, and read the icons of the websites you visit.
Related
- LegalSecurityPermissions, data handling and how to report a vulnerability.
- LegalPrivacy PolicyWhat BelayTab stores, where, and for how long.
- ToolsBrowser File LocationsFind your Chrome profile location and the exact path to bookmarks, history, sessions and cache in any browser.
- ToolsWhat Is My BrowserSee your browser, exact version, engine and OS, and whether it’s up to date. Copy your user agent.
Keep Your Tabs Safe, Too
BelayTab saves and snapshots your tabs automatically, in every browser. Free.