हर obfuscator reverse engineering से बचाने का दावा करता है। मायने यह रखता है कि deobfuscator या frontier model के output को process करने के बाद क्या पढ़ने लायक बचता है, और यह सुरक्षा build time और size में कितनी महँगी पड़ती है।
हम अपने harness पर javascript-obfuscator, js-confuser और ByteHide को AfterPack के साथ चलाते हैं और नतीजे यहाँ और landing page पर प्रकाशित करते हैं; हमने कैसे मापा देखें। JSDefender और JScrambler मौजूदा run में नहीं हैं और उनका वर्णन केवल vendor documentation से है। AfterPack के अपने आंकड़े Performance पर हैं।
Deobfuscation pass के बाद क्या बचता है
एक सार्वजनिक test में, एक coding agent ने javascript-obfuscator और एक commercial tool (JScrambler) दोनों के output को लगभग दस मिनट में पढ़ने लायक logic में बदल दिया (पूरा run हमारे blog पर)। तय output बनावट इसे सस्ता बनाती है: एक string array, चाहे encrypted हो, एक custom VM interpreter, या ख़ुद को दोबारा परिभाषित करने वाला decoder bootstrap। webcrack और restringer इन बनावटों के लिए recognizers hardcode करते हैं और microseconds में उन्हें हटा देते हैं; frontier model parser की जगह prompt से यही करता है।
हर AfterPack build की बनावट अलग होती है, इसलिए एक build के patterns के लिए लिखे गए tools अगली build पर टूट जाते हैं। जो आपका code चलाता है, वह अब भी उसकी values पढ़ सकता है: engine 0.2.2 पर, 15 lines के एक runtime hook ने हर preset पर 97 में से 96 planted strings recover कीं। Threat model बताता है कि हर attacker क्या recover करता है।
Features की तुलना
वही छह vendors और वही सात rows जो landing page पर हैं, उसी क्रम में।
पहली तीन rows हमारे अपने harness पर मापी गई हैं — नीचे हमने कैसे मापा देखें। बाकी rows में AfterPack का column हमारे अपने documentation और ship किए गए product से आता है। हर दूसरा column वह है जो वह vendor प्रकाशित करता है, और जहाँ vendor कुछ प्रकाशित नहीं करता, वहाँ cell यही बताता है।
| Feature | AfterPack (0.2.6) | javascript-obfuscator (5.6.0) | js-confuser (2.1.3) | JSDefender | ByteHide (1.0.5) | JScrambler |
|---|---|---|---|---|---|---|
| Build time | extreme पर 2.1 s | medium पर 4.7 s (2.3× ज़्यादा समय) | high पर 8.8 s (4.2× ज़्यादा समय) | नहीं चलाया गया | bundles पर नहीं चलाया गया | नहीं चलाया गया |
| Output size, gzipped | extreme पर minified bundle का 10.5× (8.25× से 11.19×) | 11.0× | 12.1× (बिना seed का एक ही sample) | नहीं चलाया गया | bundles पर नहीं चलाया गया | नहीं चलाया गया |
| सबसे मज़बूत preset जो अब भी चलता है | extreme (सबसे ऊपर का preset, 5/5) | medium (high headless CI में अटक जाता है, 0/5) | high (सबसे ऊपर का preset, 5/5) | नहीं चलाया गया | Default (सभी switches चालू: 0/5) | नहीं चलाया गया |
| क़ीमत और free tier | Free, असीमित local — paid $49/mo से | Free, open source — $19/mo VM add-on | Free, open source | केवल quote | Demo book करें | केवल quote |
| Framework plugins | 13 first-party plugins | Community loaders | केवल Node API | कोई नहीं मिला | Plugins, vendor का दावा | CLI + API |
| Edge पर चलता है | हाँ — WASM + Workers | Documented नहीं | Documented नहीं | Documented नहीं | Documented नहीं | Documented नहीं |
CSP-safe output (न eval, न new Function) | हाँ, डिफ़ॉल्ट रूप से | Documented नहीं | Documented नहीं | Documented नहीं | Documented नहीं | Documented नहीं |
हमने कैसे मापा
Machine: एक Apple M2 Max, Node 24.21.0। नीचे का हर मापा गया आंकड़ा 16 अक्टूबर 2026 को AfterPack engine 0.2.6 पर harness के एक ही run से आता है और उन्हीं inputs से दोहराया जा सकता है। Build time machine के load के साथ बदलता है; size नहीं बदलता।
Build time और output size. पाँच असली, पहले से minified production bundles, शुरू से अंत तक चलाए गए, wall-clock, हर bundle का median; size है gzip किया गया output बटा gzip किया गया minified input। AfterPack और js-confuser अपने सबसे ऊँचे preset (extreme और high) पर चले। javascript-obfuscator का सबसे ऊँचा preset, high-obfuscation, एक anti-debugger चालू करता है जो headless या CI execution में अटक जाता है, इसलिए वह medium-obfuscation पर चला, उसका सबसे मज़बूत preset जिसका output अब भी पूरा चलता है।
अब भी चलने वाला सबसे मज़बूत preset. पाँच executable programs, पहले protect किए गए और फिर headless CI में चलाए गए। AfterPack और js-confuser अपने सबसे ऊँचे preset पर 5/5 pass करते हैं; javascript-obfuscator high पर 0/5 (ऊपर वाला anti-debugger) और medium पर 5/5 देता है, और table यही आंकड़ा दिखाती है।
AfterPack के हल्के presets उन्हीं bundles पर: default light 0.19 s में 1.36×; medium 0.82 s में 7.26×; hard 1.12 s में 8.20×।
ByteHide. ByteHide में preset levels नहीं हैं, सिर्फ़ switches हैं, इसलिए यह पाँच programs पर दो बार चला: अपनी default settings पर और सभी protection switches चालू करके। Default settings पाँचों programs को चालू रखती हैं; सभी switches चालू करने पर पाँचों में से कोई नहीं चला। यह production bundles पर नहीं चला, इसलिए इसका build time या size का कोई आंकड़ा नहीं है।
JSDefender और JScrambler. दोनों में से कोई भी इस run में नहीं है, इसलिए किसी का मापा गया आंकड़ा नहीं है। JScrambler का free plan सिर्फ़ identifiers rename करता है और minify करता है; इसके obfuscation transforms के लिए paid plan चाहिए। इनकी price, plugin, edge और CSP rows सार्वजनिक documentation से आती हैं, और JScrambler के deobfuscation notes एक सार्वजनिक JScrambler deobfuscator से (देखें vs JScrambler)।
बनाम javascript-obfuscator
मुफ़्त, open-source default जिसे ज़्यादातर teams सबसे पहले अपनाती हैं, और वही tool जिसके ख़िलाफ़ webcrack लिखा गया था। इसका output एक निश्चित pipeline है: एक string array, एक rotation-decoder bootstrap, और पहचानने योग्य switch आकार वाला control-flow flattening, जो कभी एक बाधा था और अब एक पहचान है।
- Core Rust में है और native binary या WebAssembly के रूप में ship होता है, JavaScript library के रूप में नहीं। हमारे harness पर (हमने कैसे मापा),
extremeपर AfterPack ने एक असली production bundle को median 2.1 s में protect किया, जबकिmediumपर javascript-obfuscator को 4.7 s लगे, और gzip size लगभग बराबर रहा: 10.5× बनाम 11.0×। - इसका output हर build में एक जैसी बनावट का होता है, और
webcrackइसी पर टिका है। AfterPack की बनावट हर build में बदलती है।
दोनों free हैं; AfterPack असीमित builds देता है और credit card की ज़रूरत नहीं।
बनाम js-confuser
एक नया open-source विकल्प, यह भी free (MIT)। हमारे harness पर (हमने कैसे मापा), वही bundles इसके सबसे ऊँचे preset (high) पर minified size के 12.1× निकले, median build time 8.8 s के साथ, जो extreme पर AfterPack से लगभग चार गुना है। उस preset पर पाँचों executable programs सही ढंग से चलते रहे।
- js-confuser कोई seed option document नहीं करता, इसलिए output build दर build deterministic नहीं है: एक ही input हर run में अलग bytes दे सकता है।
- सार्वजनिक write-ups js-confuser के मूल logic को recover करने का तरीका बताते हैं; हमने इसे ख़ुद नहीं दोहराया है।
बनाम JScrambler
पुराना स्थापित commercial खिलाड़ी, जिस तक sales call और enterprise contract के ज़रिए पहुँचा जाता है। इसका base tier पैटर्न से पहचानने योग्य संरचना ship करता है।
JScrambler का documentation कहता है कि इसकी protections डिफ़ॉल्ट रूप से polymorphic हैं, और एक ही input को दो बार protect करने पर एक जैसा output नहीं मिलता। यह किसी एक protection को ठीक-ठीक reproduce करने के लिए एक randomization seed document करता है।
एक public, open-source JScrambler deobfuscator उन टुकड़ों को उनकी संरचना से पहचानता है जिन्हें JScrambler inject करता है: global-object resolver, string decoder, control-flow state machine और name-alias setup। यह हर फ़ाइल से keys और constants पढ़ लेता है। इसके samples असंबंधित sites से आते हैं और एक ही injected prelude साझा करते हैं, इसलिए names, keys और constants बदलने के बावजूद एक recognizer builds और customers के पार काम करता है।
- Sales-gated contract के बजाय प्रकाशित, self-serve क़ीमत ($49/mo Indie)।
- Free tier raw capability में ज़्यादातर शुरुआती commercial tiers से आगे है, और इसके लिए account की ज़रूरत नहीं।
- Enterprise उन teams के लिए है जो किसी third-party API को source नहीं भेज सकतीं। Zero-egress विकल्प एक free local build है।
बनाम JSDefender
PreEmptive का commercial JavaScript protector। Engine और CLI public npm पर नहीं हैं: उन्हें एक authenticated account portal से download किया जाता है, और हर run पर license network पर जाँचा जाता है, इसलिए build न offline चल सकती है न license ख़त्म होने के बाद। License एक floating license है जिसमें एक साथ चलने वाली builds की सीमा है।
Pipeline तेरह code transforms का एक निश्चित सेट है, जिनमें से हर एक चालू या बंद होता है। डिफ़ॉल्ट रूप से दो चालू हैं: string literals को एक coded table में निकालना, और declared variables और functions का rename। बाकी control-flow flattening, boolean और integer literal encoding, property indirection, expression sequencing, function reordering और variable grouping को कवर करते हैं। अलग options environment locks जोड़ते हैं: एक self-defending integrity check, devtools blocking, console cloaking, एक domain lock और एक date lock। JSDefender runtime को protected artifact में inject किया जाता है, और public deobfuscators इसी का उपयोग करते हैं: तीन open-source tools protected code के बगल में ship होने वाले decoder को चलाकर मूल logic recover कर लेते हैं।
Output polymorphic नहीं है। Pipeline हर build पर एक जैसी है, और एक randomSeed option किसी दिए गए seed के लिए output को byte-stable बना देता है, इसलिए एक release के ख़िलाफ़ लिखा recognizer अगली से भी मेल खाता है।
यह हमारे मौजूदा harness run में नहीं है, इसलिए इस पेज पर इसका कोई मापा गया आंकड़ा नहीं है।
जिस फ़ाइल को AfterPack protect नहीं कर सकता, वह ship होने के बजाय build को fail कर देती है।
बनाम ByteHide
एक cloud protection service। इसका CLI और bundler plugins हर फ़ाइल को ByteHide के servers पर भेजते हैं और जो लौटता है उसे वापस लिख देते हैं, इसलिए इसके build time में network round trip शामिल है।
इसके पीछे का engine javascript-obfuscator लगता है: इसके option names और validation messages javascript-obfuscator के अपने हैं, और उन्हीं options और seed के साथ, ByteHide का अतिरिक्त number-wrapping step हटाने पर, इसका output javascript-obfuscator 4.x से मेल खाता है। इसमें वही निश्चित आकार हैं: सारे protection switches चालू करके हमने जो भी build बनाई, उस हर build से webcrack ने एक रखा हुआ secret recover कर लिया, और default string encoding हर string को एक key byte से XOR करती है।
हमारे harness पर (हमने कैसे मापा) इसकी default settings ने पाँचों programs को चालू रखा; सभी protection switches चालू करने पर पाँचों में से कोई नहीं चला।
- AfterPack का free tier पूरी तरह आपकी machine पर चलता है, बिना metering, बिना account, बिना card और बिना demo call के।
- किसी भी cloud build step को source भेजना — ByteHide समेत — वही tradeoff है जिससे बचने के लिए Enterprise और एक free local build मौजूद हैं।
बनाम Terser
Terser एक अलग श्रेणी का tool है: यह minify करता है, names छोटे करता है और constant expressions को अच्छी तरह fold करता है। Minified code में पूरा मूल logic बना रहता है, इसलिए नतीजा पढ़ने वाले LLM के सामने यह कोई प्रतिरोध नहीं करता। पहले Terser चलाएँ, फिर उसके output पर AfterPack। AfterPack minifier की जगह नहीं लेता: उसका minify preset भी, जो कोई obfuscation लागू नहीं करता, पहले से minified bundle को बड़ा कर देता है।
Static attacker क्या recover करता है
| Tool | Static reader क्या recover करता है |
|---|---|
| केवल minified | सब कुछ। एक frontier LLM minified code को लगभग उतनी ही आसानी से समझा देता है जितना formatted code को, क्योंकि केवल names बदले हैं। |
| javascript-obfuscator | व्यावहारिक रूप से सब कुछ। निश्चित-pipeline output का मतलब है कि webcrack इसे seconds में reverse कर देता है। |
| js-confuser | Public write-ups इसके मूल logic को recover करना document करते हैं; हमने इसे ख़ुद reproduce नहीं किया है। |
| JScrambler (base tier) | असली लेकिन पैटर्न से पहचानने योग्य संरचना। |
| JSDefender | व्यावहारिक रूप से सब कुछ। Decoder artifact में ship होता है, इसलिए एक public tool उसे चलाकर मूल logic वापस छाप देता है। |
| ByteHide | व्यावहारिक रूप से सब कुछ। Output में javascript-obfuscator के निश्चित आकार हैं, इसलिए webcrack उसे recover कर लेता है, और default string encoding एक single-byte XOR है। |
| AfterPack Free | वही behavior वाला एक equivalent program। हर preset पर names rename होते हैं और light से strings encode होती हैं; light पर numbers पढ़े जा सकते हैं। Pattern tools को grep से ज़्यादा कुछ नहीं मिलता, जबकि static evaluation अब भी ज़्यादातर strings recover कर लेता है (मापा गया)। अगली build की बनावट अलग होती है। |
| AfterPack Pro (marked regions) | वही behavior वाला एक equivalent program: Free जैसे ही transforms, आपके mark किए regions पर भारी preset के साथ। |
Classes की पूरी परिभाषाएँ Reversal classes और AfterPack कैसे काम करता है पर हैं। अपनी build की पुष्टि Protection Map से करें।
इस तुलना का दायरा
पर्याप्त समय मिलने पर, हर obfuscator का output reverse किया जा सकता है, AfterPack का भी। तय pipeline वाले tool के ख़िलाफ़, एक बार लिखा गया recognizer हर build पर काम करता है। AfterPack के ख़िलाफ़, एक build की बनावट पर बने tools अगली build के लिए दोबारा बनाने पड़ते हैं, जबकि runtime hook हर build पर काम करता है।
आगे
- AfterPack कैसे काम करता है: reversal classes और secret survival की पूरी व्याख्या।
- Tiers: Free/Pro की सीमा और surgical Pro transforms कहाँ लागू होते हैं।
- Threat model: attackers की वह सीढ़ी जिसके दायरे में ऊपर का हर दावा है।
- Audit: किसी भी live site को, आपकी हो या किसी competitor की, scan करें कि वह अभी क्या leak करती है।