Jede kostenpflichtige Chrome-Erweiterung lässt sich in 30 KB nachbauen
Kostenpflichtige Chrome-Erweiterungen bestehen größtenteils aus Paywall und Analytics. Mit einem KI-Agent baust du jede davon an einem Abend nach: 30 KB, kein Abo.
Die meisten kostenpflichtigen Chrome-Erweiterungen sind dem Gewicht nach 1 bis 3 Prozent Code. Alles andere ist Paywall, Login, Abrechnung, Analytics und die Tatsache, dass sie aus einem kuratierten Store installierbar sind.
Das heißt: Jede davon lässt sich an einem Abend mit einem KI-Agent für den persönlichen Gebrauch nachbauen. 30 KB statt 2 bis 3 Megabyte. Kein Abo, kein Login. Die eigentliche Funktionalität sind 5 bis 10 KB DOM-Walking und Format-Konvertierung; alles drumherum bricht weg, sobald du die Abrechnung entfernst.
Ich habe das an einer Erweiterung getestet, die mich 99 USD pro Jahr kostete. Die interessanten Teile (Formatierung, Templates, komfortable Einstellungen) saßen hinter einem Google-Login und einer serverseitigen Lizenzprüfung. Der eigentliche Code, den ich wollte, waren ein paar hundert Zeilen JavaScript, verpackt in eine polierte React-Hülle. Ein Abend mit Claude lieferte mir einen 30-KB-Klon mit denselben Features und ohne Backend.
Die Muster lassen sich verallgemeinern. Die Fallen auch.
Der schwierigste Teil war das Kopieren des Ordners
Eine Chrome-Erweiterung liegt unter %LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\Extensions\<id>\<version>\. Finde die richtige <id> über chrome://extensions/, navigiere in den Ordner, kopiere ihn raus. So der Plan, und genau hier wäre der Abend fast zu Ende, bevor er angefangen hat.
cp aus git-bash gibt Access denied zurück. Copy-Item in PowerShell ebenfalls. robocopy /B ebenfalls. Auch wenn mein Benutzer Administrator ist, auch wenn die ACL FullControl gewährt, hält Chrome die Dateien mit einer exklusiven Sperre und das OS verweigert parallele Lesezugriffe.
Das Privilegien-Paradoxon ist die zweite Falle. whoami /priv zeigt:
SeBackupPrivilege Disabled
SeRestorePrivilege Disabled
Die Privilegien stehen in deinem Token, sind aber deaktiviert. Um sie tatsächlich zu nutzen, rufst du AdjustTokenPrivileges auf. Zehn Zeilen P/Invoke, kein Problem. Außer dass AdjustTokenPrivileges true zurückgibt und unmittelbar danach GetLastError() 1300 / ERROR_NOT_ALL_ASSIGNED liefert. Das Privileg ist nicht wirklich da. Es wird nur kosmetisch aufgeführt. Moderne Sandbox-Prozesse filtern ihre Tokens auf diese Weise.
Die richtige Antwort ist Volume Shadow Copy. VSS ist ein Windows-Dienst, der einen schreibgeschützten Snapshot eines Volumes zu einem bestimmten Zeitpunkt erstellt: eine parallele Sicht aufs Dateisystem, die offene Handles und Sperren ignoriert. WMI macht das direkt zugänglich:
$cls = [wmiclass]"root\cimv2:Win32_ShadowCopy"
$r = $cls.Create("C:\", "ClientAccessible")
$shadow = Get-CimInstance Win32_ShadowCopy | Where-Object { $_.ID -eq $r.ShadowID }
$shadow.DeviceObject
# \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy9Über diesen Pfad siehst du dieselben Dateien, die Chrome geöffnet hält, aber als Snapshot-Bytes, ohne Konflikt. Eine letzte Falle: Copy-Item versteht die \\?\GLOBALROOT\...-Syntax nicht. Es legt stillschweigend leere Ordner an und meldet Erfolg. Du musst auf [System.IO.Directory]::EnumerateFileSystemEntries und [System.IO.File]::Copy runtergehen, die direkt Win32 aufrufen. Zehn Zeilen Code, vollständig an einen KI-Agent delegierbar, wenn du ihm den vollen Fehlerkontext gibst.
Nachdem der Snapshot gezogen wurde, lösch ihn. Sonst stapeln sich VSS-Shadow-Copies auf der Platte.
Das ist der Teil, der eigentlich cp -r hätte sein sollen. Er hat die erste Hälfte des Abends gefressen. Erwähnenswert, weil die meisten Tutorials zum Thema „Chrome-Erweiterung nachbauen" direkt zum JavaScript springen und davon ausgehen, dass du die Bytes schon hast.
Was drin ist und wo der Wert nicht liegt
Eine moderne Chrome-Erweiterung auf der Platte ist überwiegend UI-Gewicht. Manifest: 2 KB. Content-Script: 10 KB. Popup: ein Megabyte. Background-Service-Worker: ein halbes Megabyte und zieht das Firebase SDK rein, damit ein Google-Login-Token gehalten werden kann.
Der eigentliche Algorithmus (DOM-Walk, Format-Konvertierung) liegt bei 5 bis 10 KB. Alles drumherum ist Paywall, sechzehn Sprachpakete, Analytics und ein „buy me a coffee"-Button.
Du musst dafür kein einziges Byte des obfuskierten JavaScripts lesen, um das zu verstehen. Das Größenverhältnis ist die Diagnose. Und die informativste Datei im gesamten Bundle ist _locales/en/messages.json, weil dort jedes Pro-Feature in menschlicher Sprache benannt ist, schließlich brauchen Übersetzer das:
"upgradeButton": { "message": "Upgrade now" },
"upgradeTip": { "message": "After upgrading you can use all professional features such as customizing the file name, dialog formatting with H1, and exported file header settings." }In dreißig Sekunden weißt du, was kostenlos ist, was kostenpflichtig ist, was die Marketing-Landingpage übertreibt und welche UI-Fragmente gesperrt sind. Auf UI-Strings gibt es keine Obfuskierung. Kann es nicht geben, sie werden ja für Menschen gerendert.
Das Gate ist ein Boolean
Die Paywall in einer typischen Freemium-Chrome-Erweiterung ist eine React-State-Variable, die aus einer Server-Antwort gesetzt wird, ohne signiertes Token und ohne Kryptographie:
const [isPremium, setIsPremium] = useState(false)
useEffect(() => {
if (signedInUser) {
fetch(`${API_BASE}/api/check_user`, {
method: "POST",
body: JSON.stringify({ user_email: signedInUser.email })
})
.then(r => r.json())
.then(({ data }) => setIsPremium(!!data?.status))
}
}, [signedInUser])
{isPremium && <ProSettings />}Der Server sagt true oder false. Der Client glaubt es. Der Link „bezahlt → freigeschaltet" hängt an Reputation, nicht an irgendetwas Kryptographischem. Ein entschlossener Nutzer könnte die Antwort in den DevTools in unter einer Minute patchen, und das spielt keine Rolle, weil das relevante Publikum DevTools nie öffnet.
Zur Klarstellung: Das ist kein Exploit, und der Artikel handelt nicht vom Umgehen von Paywalls. Der Punkt ist: Das Gate muss überhaupt nicht umgangen werden. Wenn du dieselbe Funktionalität neu schreibst, baust du das Gate einfach nicht mit ein.
Die Architektur ist von der Abrechnung geformt
Schau dir die Original-Architektur an und du siehst drei Schichten, die per IPC miteinander verdrahtet sind. Das Popup führt ein Megabyte React aus. Der Background-Service-Worker hält den Firebase-Auth-State, redet mit dem Lizenz-Backend und ruft chrome.scripting.executeScript gegen den aktiven Tab auf. Drei Bundles, drei Runtimes, zwei Message-Port-Sprünge.
Es gibt keinen funktionalen Grund für diese Form. Es gibt einen Abrechnungsgrund. Du brauchst einen Ort für das Auth-Token (Background, persistent über Popup-Schließungen hinweg). Du musst den Subscription-Status in einem Kontext prüfen, der den UI-Abbau überlebt (wieder Background). Du willst die schwere Ausführung aus dem Popup raushalten, damit das Popup flott bleibt, während es die Paywall rendert.
Reiß Auth, Lizenzprüfung und Paywall raus, und die Architektur kollabiert auf zwei Dateien:
popup.html (vanilla JS, ~5 KB)
↕ chrome.tabs.sendMessage
content.js (matched on the target domain, ~10 KB)
↕ DOM API
target page
Kein Service-Worker. Kein langlebiger Port. Keine Tokens. Das Popup schickt eine Nachricht, das Content-Script erledigt die Arbeit, das Ergebnis kommt zurück. 30 KB insgesamt. Dieselbe Funktionalität.
Das ist der Teil des Experiments, den ich am interessantesten finde. Das Original war nicht schlecht engineered. Es war korrekt engineered für seine tatsächlichen Anforderungen, zu denen „wir müssen Leute dafür abrechnen" gehört. Vieles von dem, was wir bei ausgelieferter Software „Komplexität" nennen, sind die Kosten dafür, ein Produkt statt ein Werkzeug zu sein.
Was die KI gemacht hat, was ich gemacht habe
Claude hat das Manifest geschrieben, die richtigen permissions und host_permissions ausgewählt, das Popup-UI-Gerüst gebaut, den DOM-Walking-Code als Node-Visitor geschrieben, der Markdown emittiert, die Test-Fixtures mit jsdom generiert und seinen eigenen ersten Wurf reviewt, um Over-Engineering rauszuwerfen. Etwa 80 Prozent der Tipparbeit.
Wo ich einspringen musste:
Die KI ist gut darin, Dinge in obfuskierten Bundles zu finden, aber nur wenn du auf Wortgrenzen ankerst und genug Kontext mitliest. Ein naives grep "isPro" liefert dutzende False Positives wie isPropagationStopped und isProtoOf aus React-Internals. Die KI meldet fröhlich „Ich habe sechs Erwähnungen des Pro-Flags gefunden", obwohl sie tatsächlich null gefunden hat. Du musst jedes Mal \bisPro\b mit mindestens 60 Zeichen Kontext anfordern.
Selektoren gegen Live-Websites kannst du nicht aus den Trainingsdaten vertrauen. Die KI erinnert sich daran, wie manche Seiten vor einem Jahr aussahen. Heute ist das falsch. Du öffnest die DevTools, schaust, was das aktuelle DOM emittiert, und gibst das an den Agent weiter. Zwanzig Minuten Handarbeit.
Und die KI macht gerne zu viel. Ohne explizite „v1 scope, YAGNI"-Anweisung schiebt sie still und leise Batching, Multi-Select, Undo, Templates und eine Settings-Seite rein. Du landest beim selben Megabyte-Bundle wie das Original, nur aus anderen Gründen. Die Disziplin „nein, nur das eine Feature" muss von dir kommen.
Die rechtliche Einordnung musst du auch selbst handhaben. Reverse-Engineering für persönliche Nutzung und Interoperabilität ist fast überall erlaubt: DMCA §1201(f) in den USA, Software-Richtlinie Artikel 6 in der EU. Was du nicht darfst: das Original-Binary weiterverteilen, einen Klon mit gleichem Namen und Icons ausliefern oder obfuskierten Code wörtlich in deine Version kopieren. „Inspiriert von, ähnlich zu, persönliches Pet-Project, nicht im Web Store" ist der Standard-Frame, und er stimmt auch.
Komfort ist das Produkt
Niemand zahlt 99 USD pro Jahr für „eine React-Komponente, die einen String in ----Markern einrahmt und einen Boolean speichert". Die Leute zahlen, damit sie keine entpackten Erweiterungen installieren müssen, nicht wissen müssen, was data-message-author-role bedeutet, und Volume Shadow Copy nicht debuggen müssen. Komfort ist das Produkt. Der Code ist der kleinste Teil der Wertschöpfungskette.
Das schneidet in zwei Richtungen. Wenn du einen freien Abend, einen KI-Agent und ein grobes Verständnis vom Stack hast, kannst du jedes dieser Tools für den persönlichen Gebrauch ersetzen, legal, in weniger Zeit, als das Abo dir in einem Monat spart. Und wenn du eines dieser Tools verkaufst, sind technische Paywalls Theater. Sie halten die Ehrlichen draußen. Der verteidigbare Asset ist Marke, UX, Distribution und der Support-Vertrag, nicht das JavaScript. Bau das Geschäft um diese Dinge, und du bist fein raus. Bau es um „Feature X hinter Abo", und du verkaufst etwas, das ein Abend mit Claude auflösen kann.
Keine der beiden Seiten ist schlechte Nachricht. So sehen Browser-Erweiterungen 2026 aus.