
يفكّك تجميع كود V8 الثنائي المتسلسل (ملفات JSC) إلى كود JavaScript عالي المستوى قابل للقراءة ويشبه الكود الأصلي، مع دعم لإصدارات متعددة من V8، وإخراج شجري، وتسمية حتمية للدوال لتحليل البرمجيات الخبيثة.
View8 هي أداة تحليل ثابتة مصممة لفك تجميع كائنات V8 bytecode المتسلسلة (ملفات JSC) إلى كود قابل للقراءة عالي المستوى. لتحليل وتفكيك هذه الكائنات المتسلسلة، تستخدم View8 ثنائي V8 مُجمّعًا ومُعدّلًا. ونتيجة لذلك، تُنتج View8 مخرجات نصية مشابهة لجافاسكريبت.
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: مسار ثنائي المفكك. مطلوب إذا كان الإدخال بصيغة raw ولم تتمكن View8 من تحديد موقع المفكك المطابق تلقائيًا.--scope: نشر وسائط النطاق. الافتراضي: 1.--normalize: استبدال معرفات الدوال المشتقة من العناوين بأسماء حتمية بناءً على ترتيب التحليل.--normalize-map [CSV]: أثناء استخدام --normalize، كتابة ملف CSV يربط كل اسم دالة أصلي باسمه المُطبّع. عند حذف المسار، تستنتج View8 <output>.name_map.csv من --out، أو من --inp عندما لا يتم تعيين مسار مخرج.--tree, -t: تقسيم المخرج إلى بنية شجرية بدلاً من تخزين جميع الدوال في ملف واحد. حدد الدالة التي ستُستخدم كجذر الشجرة. للبدء من الدالة الرئيسية الافتراضية، استخدم start.--split_mode: وضع تقسيم الشجرة. الخيارات هي declarers وcalls وreferences. الافتراضي: declarers.--inline_depth, -d: في وضعي calls وreferences، تضمين الدوال التي يمكن الوصول إليها من جذر الشجرة المحدد حتى العمق N في ملف الشجرة الرئيسي. العمق 0 يعني الجذر المحدد فقط؛ العمق 1 يشمل المستدعين/المراجع المباشرة؛ العمق 2 يشمل توابعهم. لا يُستخدم مع declarers.--inline_branch_limit, -l: في وضع الشجرة، تضمين فروع فرعية كاملة تحتوي على N دوال على الأكثر في ملف الشجرة الرئيسي عندما يتم تضمين الفروع الفرعية بواسطة --inline_depth. يتم حفظ الفروع الأكبر بشكل منفصل.--split_depth: في وضعي calls وreferences، تحديد مدى عمق اجتياز فروع الاستخدام المُصدَّرة. الافتراضي: 4.--include, -n: ملف يحتوي على الدوال المراد تضمينها في المخرج.--exclude, -x: ملف يحتوي على الدوال المراد استبعادها من المخرج.--func: عرض دالة محددة.--show_all: في وضع عرض الدالة، إظهار الأسطر المميزة كمخفية أيضًا.--verbosity, -v: مستوى التفصيل. النطاق المقبول: 0 إلى 3.لفك تجميع ملف V8 bytecode وتصدير الكود المفكك:
python view8.py -i input_file -o output_file
افتراضيًا، تكتشف View8 إصدار V8 bytecode لملف الإدخال باستخدام VersionDetector.exe وتبحث تلقائيًا عن ثنائي مفكك متوافق في مجلد 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 opcodes والكود المفكك جنبًا إلى جنب:
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(...). هذا مفيد لاستعادة الهيكل التنفيذي من جذر محدد.