
Go CLI जो javascript-obfuscator (obfuscator.io) आउटपुट को डीऑब्फस्केट करता है और AST ट्रांसफॉर्म, स्टैटिक डिकोडिंग, और goja सैंडबॉक्स फ़ॉलबैक का उपयोग करके JavaScript को अनमिनिफाई करता है।
jd एक Go टूल है जो javascript-obfuscator (obfuscator.io) के आउटपुट को डीऑब्फस्केट करता है और JavaScript को अनमिनिफाई करता है। यह webcrack और synchrony का Go पोर्ट है।
javascript-obfuscator के आउटपुट का पता लगाता है और उसे उलटता है:
var/const/let)20+ पठनीयता ट्रांसफ़ॉर्म:
| ट्रांसफ़ॉर्म | उदाहरण |
|---|---|
| computed-properties | console["log"] → console.log |
| merge-strings | "a" + "b" → "ab" |
| unminify-booleans | !0 → true, !1 → false |
| number-expressions | 1 + 2 → 3 |
| void-to-undefined | void 0 → undefined |
| raw-literals | 0x1 → 1 |
| sequence | a(), b(), c() → अलग स्टेटमेंट |
| split-variable-declarations | var a=1, b=2 → var a=1; var b=2 |
| block-statements | सिंगल-स्टेटमेंट बॉडी को { } में लपेटें |
| logical-to-if | a && b() → if (a) b() |
| ternary-to-if | a ? b() : c() → if (a) b() else c() |
| merge-else-if | else { if (...) } → else if (...) |
| for-to-while | for(;;) → while(true) |
| yoda | 5 === x → x === 5 |
| infinity | 1/0 → Infinity |
| invert-boolean-logic | !(a == b) → a != b |
| unary-expressions | स्टेटमेंट स्तर पर नो-ऑप void/!/typeof हटाएँ |
| remove-double-not | !!true → true |
goja का पार्सर ES मॉड्यूल सिंटैक्स (import/export) का समर्थन नहीं करता। jd पहले import/export स्टेटमेंट निकालता है, शेष स्क्रिप्ट को पार्स करता है, ट्रांसफ़ॉर्म चलाता है, फिर आउटपुट में स्टेटमेंट जोड़ता है। डायनामिक import() एक्सप्रेशन को import डिक्लेरेशन से सही ढंग से अलग किया जाता है।
उन फ़ाइलों के लिए जिन्हें goja पूरी तरह पार्स नहीं कर सकता (जैसे भारी regex उपयोग वाली Monaco editor भाषा परिभाषाएँ), jd सोर्स-स्तरीय फ़ॉर्मेटिंग पर फ़ॉलबैक करता है: एक टोकनाइज़र regex लिटरल, स्ट्रिंग, और कमेंट को यथावत रखते हुए सेमीकोलन पर विभाजित करता है।
brew install ejfkdev/tap/jd
GitHub Releases से डाउनलोड करें (Linux/macOS/Windows, x86_64/ARM64)।
go build -o jd .
# Deobfuscate a file (output to stdout)
jd obfuscated.js
# Write to a file
jd obfuscated.js -o cleaned.js
# Read from stdin
cat obfuscated.js | jd -
# Process a directory — recursively processes all .js/.mjs/.cjs files,
# mirrors the directory tree to the output directory.
jd src/ -o dist/
# Directory mode with default output: creates <input>-deobfuscated
jd src/
# Specify file extensions
jd src/ -o dist/ --ext .js,.mjs
# Parallel processing (N workers, default: number of CPUs)
jd src/ -o dist/ -j 8
# Skip non-code files (only output processed JS)
jd src/ -o dist/ --copy-noncode=false
# Only deobfuscate, skip unminify
jd --unminify=false obfuscated.js
# JSON output with warnings
jd --json obfuscated.js
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
-o, --output | stdout | आउटपुट फ़ाइल या डायरेक्टरी (डायरेक्टरी के लिए डिफ़ॉल्ट: <input>-deobfuscated) |
--deobfuscate | true | obfuscator.io डीऑब्फस्केशन चलाएँ |
--unminify | true | पठनीयता ट्रांसफ़ॉर्म चलाएँ |
--sandbox | auto | डिकोडर निष्पादन: auto (पहले स्टैटिक फिर सैंडबॉक्स), only (हमेशा सैंडबॉक्स), off (केवल स्टैटिक) |
--timeout | 10s | प्रति-फ़ाइल सैंडबॉक्स टाइमआउट |
--ext | .js,.mjs,.cjs | डायरेक्टरी मोड में प्रोसेस करने के लिए फ़ाइल एक्सटेंशन |
-j, --workers | 0 (=CPU) | डायरेक्टरी मोड के लिए समानांतर वर्कर |
--copy-noncode | true | गैर-कोड फ़ाइलों को आउटपुट डायरेक्टरी में कॉपी करें |
-v, --verbose | false | stderr पर डायग्नोस्टिक्स प्रिंट करें |
--json | false | {code, warnings} JSON उत्पन्न करें |
jd/
├── main.go # CLI entry
├── internal/
│ ├── cli/ # cobra CLI (i18n: English/Chinese)
│ ├── deobfuscator/ # top-level pipeline + ES module preprocessing
│ ├── jsast/ # AST walker (Cursor, Replace, Remove, Clone)
│ ├── codegen/ # AST → JavaScript printer (pretty/compact)
│ ├── scope/ # lexical scope & binding analysis
│ ├── sandbox/ # goja VM wrapper for decoder execution
│ ├── decoder/ # static decoding: Base64/RC4/rotation
│ ├── deobfuscate/ # string-array/rotator/decoder detection + transforms
│ ├── unminify/ # 20 readability transforms + fixpoint runner
│ └── transform/ # Transform abstraction + ApplyFixpoint
└── testdata/samples/ # test fixtures
parse → splitModuleStatements → deobfuscate → unminify → generate
IgnoreRegExpErrors के साथ goja पार्सर; अपार्सेबल फ़ाइलों के लिए सोर्स-स्तरीय फ़ॉर्मेटिंग पर फ़ॉलबैकडिकोडर दो-चरणीय दृष्टिकोण का उपयोग करता है: