
V8 बाइटकोड (JSC फाइलें) को उच्च-स्तरीय पठनीय JavaScript-जैसे कोड में डीकंपाइल करता है, जिसमें कई V8 संस्करणों के लिए समर्थन, ट्री आउटपुट, और मैलवेयर विश्लेषण के लिए निर्धारित फ़ंक्शन नामकरण शामिल है।
View8 एक स्थैतिक विश्लेषण उपकरण है जिसे क्रमबद्ध V8 बाइटकोड ऑब्जेक्ट्स (JSC फ़ाइलें) को उच्च-स्तरीय पठनीय कोड में डीकंपाइल करने के लिए डिज़ाइन किया गया है। इन क्रमबद्ध ऑब्जेक्ट्स को पार्स और डिसअसेंबल करने के लिए, View8 एक पैच किए गए संकलित V8 बाइनरी का उपयोग करता है। परिणामस्वरूप, View8 JavaScript के समान एक टेक्स्टुअल आउटपुट उत्पन्न करता है।
9.4.146.24 (Node V16.x में उपयोग किया गया)10.2.154.26 (Node V18.x में उपयोग किया गया)11.3.244.8 (Node V20.x में उपयोग किया गया)संकलित संस्करणों के लिए, रिलीज़ पृष्ठ पर जाएँ।
--inp, : इनपुट फ़ाइल का नाम।-i--out, -o: आउटपुट का पथ। चयनित विकल्पों के आधार पर, आउटपुट एक एकल फ़ाइल या एक निर्देशिका वृक्ष हो सकता है।--input_format, -f: इनपुट प्रारूप निर्दिष्ट करें। विकल्प हैं:
raw: इनपुट एक कच्ची JSC फ़ाइल है।disassembled: इनपुट फ़ाइल पहले से ही डिसअसेंबल की गई है।serialized: इनपुट पहले से ही डीकंपाइल किया गया है और क्रमबद्ध प्रारूप में संग्रहीत है। वर्तमान क्रमबद्ध प्रारूप Python pickle है; केवल विश्वसनीय इनपुट का उपयोग करें।--export_format, -e: निर्यात प्रारूप(ों) निर्दिष्ट करें। विकल्प v8_opcode, translated, decompiled, और serialized हैं। कई विकल्पों को जोड़ा जा सकता है। डिफ़ॉल्ट: decompiled।--path, -p: डिसअसेंबलर बाइनरी का पथ। यदि इनपुट कच्चे प्रारूप में है और View8 स्वचालित रूप से मेल खाने वाले डिसअसेंबलर का पता नहीं लगा सकता है तो आवश्यक है।--scope: स्कोप तर्कों का प्रचार करें। डिफ़ॉल्ट: 1।--normalize: पते से प्राप्त फ़ंक्शन पहचानकर्ताओं को पार्स क्रम के आधार पर नियतात्मक नामों से बदलें।--normalize-map [CSV]: --normalize का उपयोग करते समय, प्रत्येक मूल फ़ंक्शन नाम को उसके सामान्यीकृत नाम से मैप करने वाली एक CSV लिखें। जब पथ छोड़ा जाता है, तो View8 --out से <output>.name_map.csv प्राप्त करता है, या जब कोई आउटपुट पथ सेट नहीं होता है तो --inp से।--tree, -t: सभी फ़ंक्शनों को एक फ़ाइल में संग्रहीत करने के बजाय आउटपुट को एक वृक्ष संरचना में विभाजित करें। उस फ़ंक्शन को निर्दिष्ट करें जिसे वृक्ष मूल के रूप में उपयोग किया जाएगा। डिफ़ॉल्ट मुख्य फ़ंक्शन से शुरू करने के लिए, start का उपयोग करें।--split_mode: वृक्ष विभाजन मोड। विकल्प declarers, calls, और references हैं। डिफ़ॉल्ट: declarers।--inline_depth, -d: calls और references मोड में, चयनित वृक्ष मूल से गहराई N तक पहुंच योग्य फ़ंक्शनों को मुख्य वृक्ष फ़ाइल में शामिल करें। गहराई 0 का अर्थ केवल चयनित मूल है; गहराई 1 में प्रत्यक्ष कैली/संदर्भ शामिल हैं; गहराई 2 में उनके बच्चे शामिल हैं। declarers के साथ उपयोग नहीं किया जाता।--inline_branch_limit, -l: वृक्ष मोड में, जब बाल शाखाएँ --inline_depth द्वारा शामिल की जाती हैं, तो अधिकतम N फ़ंक्शनों वाली पूर्ण बाल शाखाओं को मुख्य वृक्ष फ़ाइल में इनलाइन करें। बड़ी शाखाएँ अलग से सहेजी जाती हैं।--split_depth: calls और references मोड में, निर्यातित उपयोग शाखाओं को कितनी गहराई तक ट्रैवर्स किया जाता है, इसे सीमित करें। डिफ़ॉल्ट: 4।--include, -n: आउटपुट में शामिल करने के लिए फ़ंक्शनों वाली फ़ाइल।--exclude, -x: आउटपुट से बाहर करने के लिए फ़ंक्शनों वाली फ़ाइल।--func: चयनित फ़ंक्शन प्रदर्शित करें।--show_all: फ़ंक्शन प्रदर्शन मोड में, छिपे हुए के रूप में चिह्नित पंक्तियों को भी दिखाएँ।--verbosity, -v: वर्बोसिटी स्तर। स्वीकृत सीमा: 0 से 3।V8 बाइटकोड फ़ाइल को डीकंपाइल करने और डीकंपाइल किए गए कोड को निर्यात करने के लिए:
python view8.py -i input_file -o output_fileडिफ़ॉल्ट रूप से, View8 VersionDetector.exe का उपयोग करके इनपुट फ़ाइल के V8 बाइटकोड संस्करण का पता लगाता है और स्वचालित रूप से Bin फ़ोल्डर में एक संगत डिसअसेंबलर बाइनरी खोजता है। इसे --path या -p विकल्प के साथ एक अलग डिसअसेंबलर बाइनरी निर्दिष्ट करके बदला जा सकता है:
python view8.py -i input_file -o output_file --path /path/to/disassemblerडिसअसेंबलिंग प्रक्रिया को छोड़ने और पहले से डिसअसेंबल की गई फ़ाइल को इनपुट के रूप में प्रदान करने के लिए, --input_format disassembled या -f disassembled विकल्प का उपयोग करें:
python view8.py -i input_file -o output_file -f disassembledपते से प्राप्त फ़ंक्शन नामों को नियतात्मक पहचानकर्ताओं से बदलने के लिए --normalize का उपयोग करें। मूल और सामान्यीकृत नामों के बीच संबंध को संरक्षित करने के लिए, --normalize-map जोड़ें:
python view8.py \
--input_format disassembled \
--inp sample.jsc.disasm.txt \
--normalize \
--normalize-map \
--out decompiled/sample.dec.txt \
--export_format decompiled serializedयह निम्नलिखित कॉलमों के साथ decompiled/sample.dec.name_map.csv लिखता है:
original_name,normalized_name
func_start_0x268514e9dcd9,func_start_0x100000000
func_rne_0x268514eb0779,func_rne_0x100000001एक स्पष्ट CSV पथ भी प्रदान किया जा सकता है:
python view8.py \
--input_format disassembled \
--inp sample.jsc.disasm.txt \
--normalize \
--normalize-map mappings/sample.names.csv \
--out decompiled/sample.dec.txtकभी-कभी फ़ाइल को एक क्रमबद्ध प्रारूप में डीकंपाइल करना उपयोगी होता है जो पार्स किए गए ऑब्जेक्ट्स और संरचनाओं को संरक्षित करता है। इस प्रकार का आउटपुट टेक्स्ट प्रारूप की तुलना में पोस्ट-प्रोसेस करना आसान हो सकता है, उदाहरण के लिए आगे डीऑबफस्केशन के दौरान। क्रमबद्ध आउटपुट बनाने के लिए, serialized निर्यात प्रारूप का उपयोग करें:
python view8.py -i input_file -o output_file -e serializedसुरक्षा चेतावनी: वर्तमान क्रमबद्ध प्रारूप एक Python pickle फ़ाइल (.pkl) है। अविश्वसनीय स्रोतों से डेटा अनपिकल करना मनमाना कोड निष्पादित कर सकता है। केवल उन क्रमबद्ध फ़ाइलों को लोड करें जिन्हें आपने स्वयं उत्पन्न किया है।
क्रमबद्ध आउटपुट को वापस लोड करने और इसे किसी अन्य प्रारूप में निर्यात करने के लिए, --input_format serialized या -f serialized का उपयोग करें:
python view8.py -i input_file -o output_file -f serialized--export_format या -e विकल्प का उपयोग करके निर्यात प्रारूप(ों) को निर्दिष्ट करें। आप कई प्रारूपों को जोड़ सकते हैं:
v8_opcodetranslateddecompiledserializedउदाहरण के लिए, V8 ऑपकोड और डीकंपाइल किए गए कोड दोनों को साथ-साथ निर्यात करने के लिए:
python view8.py -i input_file -o output_file -e v8_opcode decompiledडिफ़ॉल्ट रूप से, उपयोग किया जाने वाला प्रारूप decompiled है।
बड़े बंडल किए गए पेलोड के लिए, सभी डीकंपाइल किए गए फ़ंक्शनों को एक एकल फ़ाइल में लिखना विश्लेषण करना कठिन हो सकता है। वृक्ष आउटपुट चयनित मूल और संबंधित फ़ंक्शनों को एक निर्देशिका संरचना में विभाजित करता है।
वृक्ष मूल का चयन करने के लिए --tree का उपयोग करें:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_out/ \
--tree startविशेष मान start का अर्थ View8 द्वारा पुनर्प्राप्त डिफ़ॉल्ट मुख्य फ़ंक्शन है।
वृक्ष को तीन मोडों में से एक का उपयोग करके विभाजित किया जा सकता है:
declarers: शाब्दिक घोषणा संबंधों का अनुसरण करता है, जिसका अर्थ है कि कौन से फ़ंक्शन किसी अन्य फ़ंक्शन के अंदर या उसके अंतर्गत घोषित किए गए हैं। यह बंडल या मॉड्यूल-जैसी संरचना को समझने के लिए उपयोगी है, लेकिन यह निष्पादन प्रवाह का प्रतिनिधित्व नहीं करता है।calls: प्रत्यक्ष फ़ंक्शन कॉलों का अनुसरण करता है, जैसे func_x(...)। यह चयनित मूल से निष्पादन कंकाल को पुनर्प्राप्त करने के लिए उपयोगी है।references: सभी दृश्यमान फ़ंक्शन संदर्भों का अनुसरण करता है, न केवल प्रत्यक्ष कॉलों का। इसमें कॉलबैक, निर्यातित हैंडलर, रूट हैंडलर, ऑब्जेक्ट गुण और अन्य असाइन किए गए फ़ंक्शन शामिल हैं। यह मोड क्षमता सतहों की खोज के लिए उपयोगी है, लेकिन यह calls की तुलना में बहुत बड़े वृक्ष उत्पन्न कर सकता है।उदाहरण:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode callsमुख्य वृक्ष फ़ाइल में हमेशा चयनित मूल फ़ंक्शन होता है।
calls और references मोड में, --inline_depth नियंत्रित करता है कि मुख्य फ़ाइल में कितने ग्राफ़ स्तर शामिल हैं:
--inline_depth 0 -> केवल मूल
--inline_depth 1 -> मूल + प्रत्यक्ष कैली/संदर्भ
--inline_depth 2 -> मूल + प्रत्यक्ष कैली/संदर्भ + उनके बच्चेउदाहरण के लिए, निम्नलिखित कमांड मूल और उसके प्रत्यक्ष कैली युक्त एक संक्षिप्त निष्पादन अवलोकन बनाता है:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode calls \
--inline_depth 1एक अतिरिक्त कॉल परत शामिल करने के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode calls \
--inline_depth 2--inline_depth केवल calls और references मोड के साथ समर्थित है। यह declarers के साथ उपयोग नहीं किया जाता है।
बड़ी बाल शाखाओं को अलग फ़ाइलों में सहेजा जाता है। calls और references मोड में, --split_depth नियंत्रित करता है कि निर्यातित उपयोग शाखाओं को कितनी गहराई तक ट्रैवर्स किया जाता है:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode calls \
--inline_depth 1 \
--split_depth 5--inline_branch_limit विकल्प नियंत्रित करता है कि छोटी पूर्ण बाल शाखाएँ भी मुख्य फ़ाइल में शामिल की जाती हैं या नहीं:
--inline_branch_limit 3इसका अर्थ है कि अधिकतम 3 फ़ंक्शनों वाली पूर्ण बाल शाखाएँ मुख्य फ़ाइल में इनलाइन की जा सकती हैं। बड़ी शाखाएँ अलग से सहेजी जाती हैं।
calls और references मोड में, बाल शाखाएँ केवल तभी इनलाइन की जाती हैं जब चयनित --inline_depth पहले से ही बाल फ़ंक्शनों को शामिल करता है। उदाहरण के लिए, --inline_depth 0 का अर्थ केवल मूल है, इसलिए बाल शाखाएँ इनलाइन नहीं की जाती हैं भले ही वे छोटी हों।
संक्षिप्त निष्पादन अवलोकन के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode calls \
--inline_depth 1 \
--split_depth 5व्यापक वास्तुशिल्प अवलोकन के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_calls/ \
--tree start \
--split_mode calls \
--inline_depth 2 \
--split_depth 5निर्यातित कॉलबैक, हैंडलर, रूट और क्षमता सतहों के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_refs/ \
--tree start \
--split_mode references \
--inline_depth 1 \
--split_depth 3शाब्दिक या मॉड्यूल-जैसी संरचना के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--out ./tree_declarers/ \
--tree start \
--split_mode declarers \
--split_depth 3चयनित फ़ंक्शन प्रदर्शित करने के लिए, --func का उपयोग करें:
python view8.py \
--inp input.pkl \
--input_format serialized \
--func func_nameछिपे हुए के रूप में चिह्नित पंक्तियों को भी दिखाने के लिए:
python view8.py \
--inp input.pkl \
--input_format serialized \
--func func_name \
--show_allV8 बाइटकोड संस्करण फ़ाइल की शुरुआत में एक हैश के रूप में संग्रहीत होता है। VersionDetector.exe के लिए उपलब्ध विकल्प नीचे दिए गए हैं:
-h: एक संस्करण प्राप्त करता है और उसका हैश लौटाता है।-d: लिटिल-एंडियन रूप में एक हैश प्राप्त करता है और ब्रूट फोर्स का उपयोग करके उसका संबंधित संस्करण लौटाता है।-f: एक फ़ाइल प्राप्त करता है और उसका संस्करण लौटाता है।