
أداة CLI بلغة Go تقوم بفك تشويش مخرجات javascript-obfuscator (obfuscator.io) وإلغاء تصغير JavaScript باستخدام تحويلات AST وفك الترميز الساكن وبيئة goja sandbox كخيار احتياطي.
jd هي أداة بلغة Go تقوم بفك تشويش مخرجات javascript-obfuscator (obfuscator.io) وإلغاء تصغير JavaScript. إنها نسخة بلغة Go من webcrack و synchrony.
يكتشف ويعكس مخرجات 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 تحليلها بالكامل (مثل تعريفات لغة محرر Monaco ذات الاستخدام الكثيف للتعبيرات النمطية)، يتراجع jd إلى التنسيق على مستوى المصدر: يقوم مُرمِّز بتقسيم النص عند الفواصل المنقوطة مع الحفاظ على التعبيرات النمطية والنصوص والتعليقات كما هي.
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 | إخراج JSON بصيغة {code, warnings} |
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؛ يتراجع إلى التنسيق على مستوى المصدر للملفات غير القابلة للتحليليستخدم المُفكِّك نهجًا من مرحلتين: