
स्टैटिक डीऑबफस्केशन टूलकिट, संकलित V8 जावास्क्रिप्ट बाइटकोड के लिए, जो JSCeal पेलोड पर केंद्रित है। पैटर्न-आधारित फ़िल्टर, कंट्रोल-फ्लो अनफ्लैटनिंग, स्ट्रिंग पुनर्निर्माण, और विश्लेषण के लिए वैकल्पिक LLM-सहायता प्राप्त फ़ंक्शन नामकरण प्रदान करता है।
यह टूल javascript-obfuscator से सुरक्षित संकलित V8 JavaScript बाइटकोड को स्थैतिक रूप से डीऑबफस्केट करने के लिए समर्पित है।
यह मूल JavaScript स्रोत के बजाय View8 द्वारा उत्पादित स्यूडोकोड पर कार्य करता है। यह प्रोजेक्ट JSCeal पेलोड पर विकसित और परीक्षण किया गया था।
फ़िल्टर पैटर्न-संचालित हैं और मुख्य रूप से एक शोध टूलकिट और संदर्भ कार्यान्वयन के रूप में अभिप्रेत हैं। यह टूल नहीं है एक सामान्य-उद्देश्य JavaScript डीऑबफस्केटर, यह मूल स्रोत कोड का पुनर्निर्माण नहीं करता है, और चलने योग्य JavaScript उत्पन्न नहीं करता है। इसका आउटपुट View8 स्यूडोकोड ही रहता है जो स्थैतिक निरीक्षण, खोज, तुलना और फ़ंक्शन-ट्री निर्यात के लिए अभिप्रेत है।
pickle का उपयोग करती हैं। दुर्भावनापूर्ण या अविश्वसनीय .pkl फ़ाइल लोड करने से कोड निष्पादित हो सकता है। केवल उन क्रमबद्ध फ़ाइलों को लोड करें जिन्हें आपने स्थानीय रूप से View8 के साथ उत्पन्न किया है।requirements.txt से Python निर्भरताएँ;brotli कमांड-लाइन उपयोगिता;एक पृथक Python वातावरण बनाएँ:
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -r requirements.txt
deobf_ai.py में OpenAI बैकएंड को अतिरिक्त रूप से OpenAI Python पैकेज की आवश्यकता होती है:
python3 -m pip install openai
Anthropic बैकएंड requests के माध्यम से HTTP API का उपयोग करता है। Ollama बैकएंड एक सुलभ Ollama सर्वर की अपेक्षा करता है।
मूल JSCeal app.jsc पेलोड Brotli-संपीड़ित है। Linux पर, इसे brotli उपयोगिता के साथ डीकंप्रेस किया जा सकता है:
brotli -d app.jsc -o app.decompressed.jsc
scripts/ के अंतर्गत बैच वर्कफ़्लो इस चरण को scripts/unpack_all.sh के साथ करता है।
Windows पर, या जब brotli कमांड-लाइन उपयोगिता अनुपलब्ध हो, तो शामिल Node.js सहायक का उपयोग फ़ॉलबैक के रूप में किया जा सकता है। यह केवल इनपुट को डीकंप्रेस करता है और इसे निष्पादित नहीं करता है:
node Utils/decompress-jsc.js app.jsc
यह लिखता है:
app.jsc.decompressed.jsc
V8 कोड कैश संस्करण-विशिष्ट है। पेलोड के समान V8 संस्करण के लिए निर्मित डिसअसेंबलर का उपयोग करें।
विकास के दौरान उपयोग किए गए JSCeal नमूने V8 10.2.154.26 पर आधारित थे। असंबंधित V8 बिल्ड के डिफ़ॉल्ट डिसअसेंबलर सही ढंग से काम नहीं करेंगे।
स्रोत ट्री में डिसअसेंबलर स्रोत और आवश्यक V8 पैच शामिल हैं:
Utils/disasm/v8dasm.cpp
Utils/disasm/patches/
एक पूर्व-निर्मित Linux बाइनरी प्रोजेक्ट रिलीज़ के साथ वितरित की जाती है, जबकि स्रोत ट्री में इसे पुनर्निर्माण करने के लिए आवश्यक स्रोत और पैच शामिल हैं। विस्तृत विवरण प्रोजेक्ट विकी पर उपलब्ध है। मिलान वाले v8dasm को प्राप्त करने या बनाने के बाद, चलाएँ:
/path/to/v8dasm app.decompressed.jsc > app.jsc.disasm.txt
डिसअसेंबल की गई फ़ाइल को view8.py में फ़ीड करें और आगे की प्रक्रिया के लिए क्रमबद्ध आउटपुट और मानव-पठनीय स्यूडोकोड दोनों उत्पन्न करें:
mkdir -p decompiled
python3 View8/view8.py \
--input_format disassembled \
--inp app.jsc.disasm.txt \
--normalize \
--out decompiled/app.dec.txt \
--export_format decompiled serialized
यह उत्पन्न करता है:
decompiled/app.dec.txt
decompiled/app.dec.pkl
--normalize विकल्प उत्पन्न फ़ंक्शन पहचानकर्ताओं को बार-बार डिसअसेंबली और डीकंपाइलेशन रनों में पुनरुत्पादनीय बनाता है।
व्यक्तिगत ऑबफस्केशन परतों के लिए अलग-अलग फ़िल्टर हैं। उन्हें deobf_all.py के साथ क्रमबद्ध View8 आउटपुट पर एक साथ लागू किया जा सकता है:
mkdir -p deobfuscated
python3 deobf_all.py \
--inp decompiled/app.dec.pkl \
--out deobfuscated/app.deobf.txt \
--export_format decompiled serialized
डिफ़ॉल्ट स्ट्रिंग फ़िल्टर वैरिएंट 2 है, जिसका उपयोग विश्लेषण किए गए अधिकांश JSCeal पेलोड द्वारा किया जाता है। सरल स्ट्रिंग योजना को स्पष्ट रूप से चुनने के लिए, जोड़ें:
--str_deobf 1
विशिष्ट आउटपुट हैं:
deobfuscated/app.deobf.txt
deobfuscated/app.deobf.pkl
deobfuscated/app.deobf.txt.strings.txt
decompiled/app.dec.resolved_funcs.csv
रिज़ॉल्व्ड-फ़ंक्शन CSV एक नमूना-विशिष्ट कैश है। जब यह अनुपस्थित होता है, तो स्ट्रिंग पास आवश्यक डिकोडर कॉन्फ़िगरेशन को पुनर्प्राप्त करता है, CSV लिखता है, और उसी रन में स्ट्रिंग्स को डीऑबफस्केट करना जारी रखता है। बाद के रन कैश का पुन: उपयोग करते हैं और आमतौर पर तेज़ होते हैं।
किसी भिन्न डीकंपाइल किए गए पेलोड के साथ रिज़ॉल्व्ड-फ़ंक्शन CSV का पुन: उपयोग न करें।
सभी संरचनात्मक डीऑबफस्केशन फ़िल्टर लागू होने के बाद, deobf_ai.py फ़ंक्शन व्यवहार का वर्णन करने वाले नाम प्रस्तावित कर सकता है। यह Anthropic, OpenAI और Ollama बैकएंड का समर्थन करता है।
मॉडल को स्पष्ट रूप से पास करें ताकि रन पुनरुत्पादनीय रहें।
export ANTHROPIC_API_KEY='...'
python3 deobf_ai.py \
--inp deobfuscated/app.deobf.pkl \
--out deobfuscated/app.renamed.txt \
--llm_backend anthropic \
--model '<model-id>' \
--export_format decompiled serialized
export OPENAI_API_KEY='...'
python3 deobf_ai.py \
--inp deobfuscated/app.deobf.pkl \
--out deobfuscated/app.renamed.txt \
--llm_backend openai \
--model '<model-id>' \
--export_format decompiled serialized
python3 deobf_ai.py \
--inp deobfuscated/app.deobf.pkl \
--out deobfuscated/app.renamed.txt \
--llm_backend ollama \
--model '<local-model>' \
--ollama_url http://localhost:11434 \
--export_format decompiled serialized
डिफ़ॉल्ट मोड में, रीनामर प्रवेश फ़ंक्शन से शुरू होकर एक प्रत्यक्ष-कॉल ट्री बनाता है और केवल कॉल के माध्यम से पहुंचे गए फ़ंक्शनों का नाम बदलता है। कॉलबैक और असाइन किए गए हैंडलर सहित सभी दृश्यमान फ़ंक्शन संदर्भों को शामिल करने के लिए --greedy जोड़ें।
उत्पन्न दो-स्तंभ CSV एक कैश के रूप में कार्य करता है और एक बाधित रन को जारी रखने की अनुमति देता है। --csv के साथ एक मौजूदा कैश स्पष्ट रूप से चुनें:
python3 deobf_ai.py \
--inp deobfuscated/app.deobf.pkl \
--out deobfuscated/app.renamed.txt \
--csv deobfuscated/app.deobf.renamed_funcs.greedy.example-model.csv \
--llm_backend anthropic \
--model '<model-id>' \
--greedy \
--export_format decompiled serialized
सामान्य मोड में, CSV को संभावित आंशिक कैश के रूप में माना जाता है। कैश किए गए नाम पहले लागू किए जाते हैं, कैश द्वारा पहले से कवर किए गए फ़ंक्शन चयनित कॉल या संदर्भ ट्री से हटा दिए जाते हैं, और LLM को केवल उन फ़ंक्शनों के लिए बुलाया जाता है जो अनसुलझे रहते हैं। यदि CSV उस ट्री को पूरी तरह से कवर करता है, तो कोई API कुंजी या LLM कनेक्शन आवश्यक नहीं है। यदि यह केवल ट्री के एक हिस्से को कवर करता है, तो चयनित बैकएंड प्रारंभ किया जाता है और नए उत्पन्न मैपिंग उसी CSV में जोड़ दिए जाते हैं।
उसी ट्री मोड का उपयोग करें जो CSV बनाते समय उपयोग किया गया था। एक --greedy रन से उत्पन्न CSV को सामान्य रूप से फिर से --greedy की आवश्यकता होती है यदि लक्ष्य उस रन को जारी रखना है न कि केवल प्रत्यक्ष-कॉल सबसेट का पुन: उपयोग करना।
--apply-csv-only का उपयोग करें जब CSV में पहले से वे लेबल हों जिन्हें आप लागू करना चाहते हैं, जिसमें समीक्षित, संपादित, आयातित या रीबेस्ड मैपिंग शामिल हैं: