
क्रिप्टोग्राफ़िक इंडिस्टिंगुइशेबिलिटी ऑबफस्केशन तकनीकों पर आधारित एक JavaScript ऑबफस्केटर
यह परियोजना अविभेद्यता अस्पष्टीकरण (indistinguishability obfuscation) प्राप्त नहीं करती है। आपको इस उत्पाद का उपयोग रहस्यों की सुरक्षा के लिए नहीं करना चाहिए। यह रिवर्स इंजीनियरिंग को रोकने के लिए नहीं, बल्कि हतोत्साहित करने के लिए मौजूद है।
एक JavaScript अस्पष्टीकरणकर्ता (obfuscator) जो मनुष्यों और LLM दोनों के लिए कोड को पढ़ने और विश्लेषण करने में अत्यंत कठिन बनाने के लिए डिज़ाइन किया गया है। TypeScript में लिखा गया। सहकर्मी-समीक्षित क्रिप्टोग्राफ़िक अस्पष्टीकरण अनुसंधान से तकनीकों को लागू करता है।
npm install
npm run build
# Basic usage
node dist/index.js input.js > output.js
# With target token budget (default: 2,000,000)
node dist/index.js --target-tokens 500000 input.js > output.js
# Minimal obfuscation (small output)
node dist/index.js --target-tokens 10000 input.js > output.js
# Maximum bloat (10M tokens)
node dist/index.js --target-tokens 10000000 input.js > output.js
# Using environment variable
INPUT_FILE=input.js node dist/index.js > output.js
# Help
node dist/index.js --help
| Option | Default | Description |
|---|---|---|
--target-tokens <n> | 2000000 | टोकनों में लक्ष्य आउटपुट आकार। छोटे इनपुट इस सीमा तक फुलाए जाते हैं। बड़े इनपुट बजट के भीतर रहने के लिए कम फुलाव उत्पन्न करते हैं। |
--help, -h | सहायता संदेश दिखाएँ |
npm run build # Compile TypeScript to dist/
npm run start # Run the obfuscator (reads input.js)
npm run test # Run the test suite
npm run obfuscate-package # Run compatibility tests against npm packages
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// With options
const obfuscated = obfuscate(code, { targetTokens: 500000 });
अस्पष्टीकरणकर्ता 4 चरणों में 20 ट्रांसफ़ॉर्म लागू करता है। प्रत्येक चरण पिछले चरण पर आधारित होता है।
डेड कोड को दो जनरेशन रणनीतियों के साथ कई बिंदुओं पर इंजेक्ट किया जाता है:
| Strategy | Source | Description |
|---|
डेड कोड इंजेक्शन बिंदु:
कई ट्रांसफ़ॉर्म सहकर्मी-समीक्षित क्रिप्टोग्राफ़िक अस्पष्टीकरण अनुसंधान से प्रेरित हैं:
दो सत्यापन उपकरण अस्पष्टीकरण गुणवत्ता मापते हैं, जो src/verification/ में स्थित हैं:
verification/nullCircuitTest.ts)एक वास्तविक फ़ंक्शन और एक "नल" फ़ंक्शन (समान आकार, कुछ नहीं करता) को अस्पष्टीकृत करता है, फिर यह स्कोर करने के लिए 14 संरचनात्मक मेट्रिक्स की तुलना करता है कि वे कितने विभेदनीय हैं। उच्च समानता = बेहतर अस्पष्टीकरण।
import { runNullCircuitTest } from './verification/nullCircuitTest';
const result = runNullCircuitTest(realCode, paramCount, stmtCount, threshold, targetTokens);
console.log('Similarity:', result.similarity); // 0.0-1.0
verification/unobfuscatableTests.ts)पेपर 1 के असंभाव्यता प्रमाणों से 7 परीक्षण मामले जो अस्पष्टीकृत कोड से रहस्य निकालने का प्रयास करते हैं:
import { runAllTests, printSummary } from './verification/unobfuscatableTests';
console.log(printSummary(runAllTests(10000)));
परीक्षण: पॉइंट फ़ंक्शन (पासवर्ड), मैजिक नंबर, कैनरी स्ट्रिंग्स, एम्बेडेड कुंजियाँ, URLs, regex पैटर्न, नियंत्रण प्रवाह हस्ताक्षर।
--target-tokens विकल्प आउटपुट आकार को एक ब्लोट बजट के माध्यम से नियंत्रित करता है जो डेड कोड इंजेक्शन (प्राथमिक वॉल्यूम लीवर) को स्केल करता है। बजट-गेटेड ट्रांसफ़ॉर्म:
| बजट अनुपात | सक्षम ट्रांसफ़ॉर्म |
|---|---|
| > 3 | Anti-debug, tripwires, CFF, opaque predicates, comma merging |
| > 5 | Proxy functions, property key encoding, noise injection, self-integrity |
| > 8 | Context window exhaustion |
| > 10 | Global variable encoding |
डेड कोड गुणक 1x (अनुपात 30) से 150x (अनुपात 1500+) तक स्केल होता है, जो डेड स्विच केस और अपारदर्शी प्रेडिकेट शाखाओं की संख्या और आकार को नियंत्रित करता है।
src/
index.ts CLI entry point
obfuscator.ts Main pipeline orchestrator (20 transforms)
options.ts Budget system and options
types.ts AST type definitions
random.ts Random Unicode name generation (6-16 chars, 16 script ranges)
ast.ts AST node factory functions
keywords.ts Dynamic keyword discovery (globalThis + window package)
globals.ts Global state management (null-prototype maps)
substitute.ts Identifier substitution utilities
declarations.d.ts Module type declarations
passes/
firstPass.ts Identifier cataloging
secondPass.ts Identifier substitution + string encoding
thirdPass.ts Dummy parameter injection
transforms/
antiDebug.ts eval("debugger") traps + setInterval loops
tripwires.ts Punctured program secret-input checks [Paper 4]
noiseInjection.ts LPN-inspired arithmetic noise [Paper 7]
controlFlowFlattening.ts while/switch + modular arithmetic dispatch [Paper 3]
opaquePredicates.ts 15 always-true/false math predicates
proxyFunctions.ts Call graph flattening dispatchers
contextExhaustion.ts Ternary/void noise for LLM context filling
commaExpressions.ts Statement merging via comma operator
globalVariableEncoding.ts eval+replace for globals
propertyKeyEncoding.ts Computed property access with per-scope registries
numberEncoding.ts 11 bitwise/arithmetic encoding strategies
selfIntegrity.ts Anti-tamper runtime checks [Paper 10]
stringArrayExtraction.ts Chained XOR + sparse position errors [Papers 2, 9]
deadCodeInjection.ts Template + mutation-based dead code [Paper 3]
verification/
nullCircuitTest.ts Dead code quality scoring [Paper 10]
unobfuscatableTests.ts Secret extraction test cases [Paper 1]
__tests__/ 300+ unit tests across 21 suites
tools/
obfuscate-package.ts Webpack-based npm package compatibility testing
tests/
input*.js Original test input files
# Run all tests
npm test
# Run a specific test suite
npx jest controlFlowFlattening
npx jest tripwires
npx jest noiseInjection
# Test against npm packages (clones repos, webpack-bundles, obfuscates, runs tests)
npm run obfuscate-package # All 10 packages
npm run obfuscate-package -- minimist semver # Specific packages
tools/obfuscate-package.ts उपकरण वास्तविक npm पैकेजों के विरुद्ध अस्पष्टीकरणकर्ता का परीक्षण करता है:
| Path | Contents |
|---|---|
dist/obfuscated/<package>/bundle.js | प्रत्येक पैकेज के लिए अस्पष्टीकृत webpack बंडल |
dist/obfuscated/report.json | बंडल आकार, अस्पष्टीकरण स्थिति, परीक्षण आउटपुट के साथ पूर्ण JSON रिपोर्ट |
MIT - कॉपीराइट 2026 Nicholas Starke
| Order | Transform | File | Description |
|---|
| 1 | Anti-Debug Traps | transforms/antiDebug.ts | eval("debugger") कथनों और अभाज्य-संख्या अंतराल (5s-600s) वाले 10-20 setInterval लूप इंजेक्ट करता है जो बार-बार डिबगर ब्रेकपॉइंट ट्रिगर करते हैं। प्रत्येक उदाहरण अद्वितीय एन्कोडेड स्ट्रिंग्स का उपयोग करता है। |
| 2 | Punctured Program Tripwires | transforms/tripwires.ts | पैरामीटर हैश की तुलना गुप्त मानों से करने वाले छिपे हुए चेक एम्बेड करता है। 5 हैश पैटर्न (बिटवाइज़ फ़िंगरप्रिंट, मॉड्यूलर अंकगणित, charCodeAt, संख्यात्मक हैश, typeof+length)। गुप्त इनपुट पर मौन स्थिति भ्रष्टाचार, व्यस्त लूप, या थ्रो ट्रिगर करता है। [पेपर 4] |
| 3 | LPN Noise Injection | transforms/noiseInjection.ts | अंकगणितीय गणनाओं में विभाजित पथों के माध्यम से यादृच्छिक शोर जोड़ता और रद्द करता है। 6 पैटर्न: जोड़/घटाव, XOR, गुणा/भाग, विभाजित द्वि-चर, गणना हैश-श्रृंखला, बिट-रोटेट। पूर्ण रद्दीकरण का पता लगाए बिना मध्यवर्ती मान अर्थहीन होते हैं। [पेपर 7] |
| Order | Transform | File | Description |
|---|
| 4 | Control Flow Flattening | transforms/controlFlowFlattening.ts | फ़ंक्शन बॉडी को while(true) { switch((_s * P) % M) { ... } } स्टेट मशीनों में परिवर्तित करता है, मॉड्यूलर अंकगणित डिस्पैच के साथ — केस मान यादृच्छिक अभाज्य पैरामीटरों का उपयोग करके (stateId * multiplier) % modulus के माध्यम से एन्कोड किए जाते हैं। [पेपर 3] |
| 5 | Opaque Predicates | transforms/opaquePredicates.ts | ऐसी if शर्तें इंजेक्ट करता है जो हमेशा सही या गलत निकलती हैं लेकिन गणितीय रूप से सिद्ध करना कठिन होता है (जैसे (x*x+x)%2===0)। मॉड्यूलर अंकगणित, बिटवाइज़ और टाइप-चेक श्रेणियों में 15 प्रेडिकेट सूत्र। |
| 6 | Proxy Functions | transforms/proxyFunctions.ts | सभी फ़ंक्शन कॉल्स को दो डिस्पैचरों के माध्यम से रूट करता है: सरल कॉल्स के लिए _fc(fn, ...args), मेथड कॉल्स के लिए _mc(obj, prop, ...args)। लचीलेपन के लिए स्थानीय चर में कैप्चर किए गए Function.prototype.apply का उपयोग करता है। |
| 7 | Context Window Exhaustion | transforms/contextExhaustion.ts | एक्सप्रेशन को गहरे नेस्टेड टर्नरी, अपारदर्शी शर्तों, void-एक्सप्रेशन श्रृंखलाओं और सशर्त void पैडिंग के साथ लपेटता है। LLM को शोर पर कॉन्टेक्स्ट विंडो टोकन बर्बाद करने के लिए मजबूर करता है। |
| 8 | Comma Expression Merging | transforms/commaExpressions.ts | क्रमिक एक्सप्रेशन स्टेटमेंट्स को एकल कॉमा एक्सप्रेशन में संक्षिप्त करता है: a(); b(); return c() बन जाता है return a(), b(), c()। |
| Order | Pass | File | Description |
|---|
| 9 | Pass 1: Catalog | passes/firstPass.ts | AST को ट्रैवर्स करता है और हर पहचानकर्ता को सूचीबद्ध करता है, एक ग्लोबल्स मैप बनाता है जो प्रत्येक को 16 स्क्रिप्ट रेंज (CJK, हंगुल, ग्रीक, सिरिलिक, देवनागरी, थाई, अरबी, काताकाना, आदि) से लिया गया यादृच्छिक 6-16 वर्णों वाला यूनिकोड नाम प्रदान करता है। |
| 10 | Pass 2: Substitute | passes/secondPass.ts | सभी पहचानकर्ता नामों को उनके अस्पष्टीकृत यूनिकोड समकक्षों से बदलता है। require() तर्कों को String.fromCharCode(...) के रूप में एन्कोड करता है। स्थिर import/export स्रोतों को यूनिकोड-एस्केप्ड स्ट्रिंग लिटरल के रूप में एन्कोड करता है। क्लास superClass संदर्भों, टेम्पलेट लिटरल एक्सप्रेशन, डिस्ट्रक्चरिंग पैटर्न को प्रतिस्थापित करता है। |
| 11 | Pass 3: Dummy Parameters | passes/thirdPass.ts | हर फ़ंक्शन घोषणा और एक्सप्रेशन में 0-15 यादृच्छिक अप्रयुक्त पैरामीटर इंजेक्ट करता है। रेस्ट पैरामीटर वाले फ़ंक्शन छोड़ देता है। सभी टिप्पणियाँ हटा देता है। |
| Order | Transform | File | Description |
|---|
| 12 | Global Variable Encoding | transforms/globalVariableEncoding.ts | ग्लोबल्स के संदर्भों (डायनामिक रूप से globalThis + window पैकेज से खोजे गए) को eval("Name<suffix>".replace(new RegExp("<suffix>$"), "")) से बदलता है। दोनों स्ट्रिंग्स स्ट्रिंग ऐरे से होकर गुजरती हैं। |
| 13 | Property Key Encoding | transforms/propertyKeyEncoding.ts | डॉट एक्सेस को प्रति-स्कोप रजिस्ट्रियों के साथ कंप्यूटेड एक्सेस में परिवर्तित करता है। क्रॉस-स्कोप एक्सेस काम करता है क्योंकि सभी सफिक्स रनटाइम पर .replace() के माध्यम से एक ही प्रॉपर्टी नाम पर हल होते हैं। |
| 14 | Number Encoding | transforms/numberEncoding.ts | 11 एन्कोडिंग रणनीतियाँ: shift+add, XOR आइडेंटिटी, कॉम्प्लिमेंट, डिवीज़न, नेस्टेड शिफ्ट, डबल-NOT, मॉड्यूलर, आदि। प्रत्येक उदाहरण विशिष्ट रूप से उत्पन्न होता है। प्रॉपर्टी कुंजियाँ और स्विच केस मान छोड़ देता है। |
| 15 | Self-Integrity Verification | transforms/selfIntegrity.ts | 2-4 रनटाइम चेक इंजेक्ट करता है: eval नेटिव-कोड सत्यापन, Function.prototype.toString अखंडता, समय विसंगति का पता लगाना, कोड संरचना सत्यापन। एंटी-टैम्पर प्रतिक्रियाएँ: व्यस्त प्रतीक्षा, थ्रो, मौन भ्रष्टाचार। [पेपर 10] |
| 16 | String Array Extraction | transforms/stringArrayExtraction.ts | सभी स्ट्रिंग्स को एक ही ऐरे में एकत्र करता है जिसमें श्रृंखलाबद्ध XOR डिक्रिप्शन (प्रविष्टि N की कुंजी प्रविष्टि N-1 की डिकोड की गई सामग्री पर निर्भर करती है) और स्पार्स स्थिति-निर्भर त्रुटि पैटर्न (प्रत्येक वर्ण को एक अलग XOR कुंजी मिलती है, चुनिंदा स्थितियों पर LPN-प्रेरित स्पार्स त्रुटियों के साथ)। [पेपर 2, 9] |
| 17 | Console Stubs | obfuscator.ts | डायनामिक रूप से सभी console मेथड खोजता है और प्रत्येक को no-op फ़ंक्शन पर सेट करता है। |
| 18 | Terser Minification | obfuscator.ts | terser के माध्यम से व्हाइटस्पेस/फ़ॉर्मेटिंग हटाता है (mangle: false, compress: false)। यदि terser आउटपुट पार्स नहीं कर सकता तो regex-आधारित स्ट्रिपिंग पर वापस चला जाता है। |
| Template-based | transforms/deadCodeInjection.ts | 9 टेम्पलेट प्रकार: लूप संचय, ऐरे निर्माण, ऑब्जेक्ट हेरफेर, स्ट्रिंग संयोजन, नेस्टेड कंडिशनल, try/catch, while काउंटडाउन, switch कंप्यूटेड, बिटवाइज़ श्रृंखलाएँ। टेम्पलेट वास्तविक स्कोप चर का संदर्भ देते हैं। |
| Mutation-based | transforms/deadCodeInjection.ts | वास्तविक कथनों को क्लोन करता है और उन्हें उत्परिवर्तित करता है: समतुल्यता समूहों के भीतर ऑपरेटरों की अदला-बदली करता है, स्थिरांकों को विक्षुब्ध करता है, पहचानकर्ताओं का नाम बदलता है। AST-संरचनात्मक रूप से समान डेड कोड उत्पन्न करता है जो अकेले संरचना द्वारा वास्तविक कोड से अप्रभेद्य होता है। [पेपर 3] |
| Paper | Authors | Technique Implemented |
|---|
| [पेपर 1] प्रोग्रामों को अस्पष्टीकृत करने की (अ)संभाव्यता पर | Barak, Goldreich, Impagliazzo, Rudich, Sahai, Vadhan, Yang | Unobfuscatable फ़ंक्शन परीक्षण मामले — सत्यापन उपकरण जो जाँचता है कि क्या रहस्य अस्पष्टीकरण में बचे रहते हैं |
| [पेपर 2] सभी सर्किटों के लिए उम्मीदवार iO और कार्यात्मक एन्क्रिप्शन | Garg, Gentry, Halevi, Raykova, Sahai, Waters | श्रृंखलाबद्ध स्ट्रिंग डिक्रिप्शन — किलियन-शैली यादृच्छीकरण जहाँ प्रत्येक प्रविष्टि की कुंजी पिछली डिकोड की गई स्ट्रिंग पर निर्भर करती है |
| [पेपर 3] मल्टीलीनियर सबग्रुप एलिमिनेशन धारणा से iO | Gentry, Lewko, Sahai, Waters | उत्परिवर्तन-आधारित डेड कोड (वास्तविक कोड के संरचनात्मक रूप से समान); CFF में मॉड्यूलर अंकगणित राज्य संक्रमण |
| [पेपर 4] iO का उपयोग कैसे करें: अस्वीकार्य एन्क्रिप्शन, और अधिक | Sahai, Waters | पंक्चर्ड प्रोग्राम ट्रिपवायर — छिपे हुए चेक जो गुप्त इनपुट पर ट्रिगर होते हैं |
| [पेपर 7] सुस्थापित धारणाओं से iO | Jain, Lin, Sahai | संख्यात्मक गणनाओं में LPN-प्रेरित शोर इंजेक्शन |
| [पेपर 9] बाइलीनियर मैप्स और LPN वेरिएंट से iO | Ragavan, Vafa, Vaikuntanathan | स्थिति-निर्भर त्रुटि पैटर्न के साथ स्पार्स XOR एन्कोडिंग |
| [पेपर 10] नल क्वांटम सर्किट और अनुप्रयोगों का iO | Bartusek, Malavolta | डेड कोड गुणवत्ता सत्यापन के लिए नल सर्किट परीक्षण; स्व-अखंडता सत्यापन (दोहरी-मोड) |