لمعظم تاريخ الحوسبة، كان "الثنائي" على الويب هو JavaScript — نص قابل للقراءة من البشر يمكنك فتحه في devtools وفهمه. غيّر WebAssembly ذلك. Wasm هو تنسيق تعليمات ثنائي مضغوط يعمل بسرعة قريبة من السرعة الأصلية في المتصفحات وبشكل متزايد في الحافة والمكونات الإضافية وأوقات التشغيل بدون خادم وداخل تطبيقات تضم صندوق وasm. جعلته الأداء والقابلية للنقل نجاحاً لكنهما أنشأا واقعاً جديداً لأي شخص يقوم بعمل أمان: حصة متنامية من المنطق المُرسل إلى المستخدمين تصل الآن كـ blob ثنائي معتم بدلاً من مصدر قابل للقراءة. عندما يكون هذا الكائن هو جهاز تعدين العملات المشفرة هرب إلى صفحة ويب أو فحص ترخيص معتم أو برامج ضارة باستخدام wasm لتجنب الكشف المركّز على JavaScript يحتاج شخص ما إلى هندسة عكسية. في 2026 هذا "شخص ما" هو بشكل متزايد محلل أمان وقد نضج الأدوات لتلبية الحاجة.
هذا الدليل عبارة عن مقدمة عملية لهندسة عكسية WebAssembly. يشرح ما يجعل wasm مختلفاً عن الثنائيات الأصلية ويمشي عبر سلسلة الأدوات مفتوحة المصدر التي أصبحت معيار — WebAssembly Binary Toolkit (WABT) و diswasm و Binaryen و wasm-tools — ويضع سير عمل للذهاب من ملف .wasm غير معروف إلى فهم ما يفعله. الهدف هو إزالة الغموض عن صيغة تبدو مرعبة لكنها مهمة بطرق مهمة أكثر قابلية للتحليل من الكود الأصلي.
ما الذي يجعل wasm مختلفاً
لفك wasm بشكل فعال يجب أن تفهم كيف يختلف عن الثنائيات x86 أو ARM التي بنيت معظم أدوات RE لها. الاختلافات تقطع كلا الطريقين — البعض يجعل wasm أسهل في التحليل والآخرون أصعب.
الصفة المحددة الأولى هي أن wasm هي آلة مكدس وليست آلة تسجيل. يتعامل الكود الأصلي مع مجموعة ثابتة من سجلات وحدة المعالجة المركزية؛ تعليمات wasm تدفع وتفرقع القيم على مكدس معاملات. هذا غير مألوف في البداية لكنه منظم أيضاً وسهل التنبؤ به وهذا يعني عدم وجود تخصيص السجل للعقل. الصفة الثانية والأكثر مساعدة هي أن wasm لديها تدفق تحكم منظم. حيث يستخدم الكود الأصلي قفزات تعسفية يجب على معادلات البرامج إعادة بناء بدقة في حلقات وشروط wasm لها بنى block و loop و if صريحة مدمجة في الصيغة. رسم بياني تدفق التحكم هو بالمعنى الأول بالفعل تم استعادته — أحد أصعب أجزاء إلغاء الأصلي إلى حد كبير يُعطى لك. الصفة الثالثة هي هيكل وحدة نظيف: يتم تنظيم وحدة wasm في أقسام محددة بوضوح (الأنواع والواردات والوظائف والكود والبيانات والتصدير) لذلك تعرف دائماً أين الوظائف موجودة وما تستورده الوحدة من مضيفها وما تعرضه.
هيكل الواردات/الصادرات هذا هو أقيم شيء واحد لمحلل. وحدة wasm لا تستطيع فعل أي شيء للعالم الخارجي بمفردها — فليس لها syscalls. كل ما تفعله ذلك المسائل (وصول الشبكة ومعالجة DOM وI/O الملفات) يحدث بناءً على استيراد وظائف المضيف وهذه الواردات مدرجة بوضوح في الوحدة. قراءة قسم الواردات تخبرك قدرات الوحدة قبل تحليل تعليمة واحدة: إذا لم تستورد أي شيء يمكنه الوصول إلى الشبكة فإنها لا تستطيع تسرب البيانات؛ إذا استوردت وظائف للجلب أو التشفير فهذا هو المكان الذي ننظر فيه. هذا مستوى من الفهم القدرة في الوقت المناسب الذي تعطيه الثنائيات الأصلية بندرة. ان عدم التماثل هذا يفضل المدافعين الراغبين في تعلم سلسلة الأدوات.
الجانب الأصعب: wasm يجرد أسماء الرموز بشكل افتراضي (الوظائف تصبح func[42]) والأنواع محدودة بعدد قليل من البدائيات الرقمية بحيث يتم فقدان الهيكل عالي المستوى وسلاسل الأدوات والمخفيات يمكن أن تنتج كود منقح آلياً كثيف. لكن تدفق التحكم المنظم والتخطيط الصريح للوحدة أكثر من التعويض وهذا هو السبب في أن فك تجميع wasm يعتبر بشكل عام أكثر قابلية للمعالجة من فك التجميع الأصلي.
سلسلة الأدوات
سلسلة أدوات RE مفتوحة المصدر wasm صغيرة ومركزة وتكميلية — لا تفعل أداة واحدة كل شيء وسير العمل القياسي يستخدم عدة معاً. من المفيد معرفة ما يخص كل واحد.
WABT WebAssembly Binary Toolkit هو الأساس. يحول بين صيغة .wasm الثنائية و .wat (نص WebAssembly) القابل للقراءة من البشر مع wasm2wat ويفرغ الأقسام ويفكك الكود مع wasm-objdump يتحقق من الوحدات وإنتاج فك تجميع شبيه بـ C مع wasm-decompile. WABT هو أول شيء تصل إليه: يحول الثنائي إلى شيء قابل للقراءة ويظهر لك هيكل الوحدة. خيار --generate-names الخاص به يصنع أسماء للوظائف غير المسماة وهذا يجعل الإخراج أسهل كثيراً في المتابعة.
diswasm يذهب خطوة أبعد نحو القراءة فك تجميع bytecode wasm إلى رمز زائف عالي المستوى بدلاً من WAT الوفي لكن منخفض المستوى الذي تنتجه wasm2wat. حيث يظهر WABT لك بالضبط ما تقوله الوحدة يحاول diswasm إظهار لك ما يعنيه إعادة بناء الكود المنظم الذي يقرأ أكثر مثل برنامج عادي. لفهم المنطق بسرعة أثناء الفرز هذا الرأي عالي المستوى قيّم.
Binaryen هو مجموعة أدوات مترجم درجة التي صلتها إلى RE غير مباشرة قليلاً لكنها حقيقية. أداتها wasm-opt تحمل وحدة wasm إلى تمثيل وسيط وتشغل تمريرات التحسين والتحويل — نفس الآلية التي تستخدمها سلاسل الأدوات مثل Emscripten لتقليل وتسريع wasm. بالنسبة لمهندسي الهندسة العكسية فإن مفكك شيفرة Binaryen (wasm-dis) وتمريرات التحليل/التحويل الخاصة به (بما في ذلك التبسيطات المساعدة في إلغاء الإخفاء) تجعلها ملحق مفيد لـ WABT. الخدعة العملية هي تشغيل وحدة مربكة من خلال تمريرات التبسيط ثم فك تجميع النتيجة الأنظف.
wasm-tools أداة Rust منخفضة المستوى تكمل الأشياء مع التحقق والتحليل والطفرة ودعم مقترحات wasm الأحدث (المكونات GC الخيوط). عندما تحتاج إلى فحص أو معالجة وحدة برمجياً — أو عندما يستخدم ثنائي ميزات ترفضها الأدوات القديمة — wasm-tools هي الخيار الحديث الذي يتم الحفاظ عليه بنشاط. معاً تغطي هذه الأربعة دورة حياة RE: WABT و diswasm للقراءة و Binaryen للتبسيط و wasm-tools للتحقق والطفرة.
سير عمل التحليل العملي
يواجه ملف .wasm غير معروف — تقول تم سحبه من صفحة ويب مريبة — سير عمل قابل للتكرار يسرع فهمك. يتقارب المحللون الممارسون عليه تسلسل أدناه.
ابدأ بـ الإمكانيات وليس الكود. قبل قراءة تعليمة واحدة افرغ الواردات والصادرات: wasm-objdump -x module.wasm (أو الواردات/الأقسام الصادرة بشكل خاص). تخبرك الواردات ما يمكن للوحدة أن تفعله — ما وظائف المضيف يمكنها استدعاء — والصادرات تخبرك نقاط الدخول الوظائف المحيطة بـ JavaScript فعلياً تستدعي. هذا يحدد كل شيء: وحدة تستورد فقط وظائف الرياضيات مختلفة جداً عن تلك التي تستورد fetch و crypto بدائل. العديد من التحليلات تنتهي بفعالية هنا لأن قائمة الإمكانية بالفعل تجيب على السؤال ("لا تستطيع الوصول إلى الشبكة لذلك لا تسرب البيانات").
التالي افكك مع الأسماء: wasm2wat --generate-names module.wasm. هذا يعطيك الهيكل الوفي مع الأسماء المركبة ويسمح لك برؤية تخطيط القسم والقسم البيانات (غالباً ما تحتوي على سلاسل عناوين URL أو ثوابت مضمنة جديرة بـ grep) والشكل العام. ابحث عن قسم البيانات و WAT عن السلاسل الكاشفة — المجالات وطرق API وثوابت التشفير والرسائل — والتي كثيراً ما تكشف عن النية دون قراءة رمز عميقة.
ثم إذا كنت بحاجة إلى فهم منطق محدد فك التجميع للقراءة: تشغيل wasm-decompile (WABT) أو diswasm للحصول على رمز زائف وإذا كان الإخراج كثيف أو معمّى تبسيط أولاً مع Binaryen (wasm-opt --precompute --simplify-locals --vacuum) قبل فك تجميع الوحدة النظيفة. ركز قراءتك على الوظائف المُصدَّرة وأياً منها يستدعي الواردات المثيرة للاهتمام — نادراً ما تحتاج إلى قراءة الوحدة بأكملها. أخيراً بالنسبة لعينة عنيدة حقاً wasm-reduce يمكنه عزل الحد الأدنى من wasm الذي ينسخ السلوك مما يقلل من السطح الذي يجب أن تفهمه.
هذا التقدم الأول للقدرة ثم الهيكل ثم آينة المنطق يعكس ممارسة هندسة عكسية جيدة لكنه يستغل مزايا wasm: قسم الواردات الصريح يجعل خطوة القدرة معلوماتية بشكل غير عادي وتدفق التحكم المنظم يجعل خطوة فك التجميع نظيفة بشكل غير عادي.
البرامج الضارة wasm والمراوغة
يستحق فهم السبب الذي يحتاج المحللون بشكل متزايد إلى هذه المهارات لأنه يشكل ما ينبغي البحث عنه. اعتمد المهاجمون على wasm لأسباب ملموسة. الأكثر تأسيساً هو التعدين: سرعة wasm القريبة من السرعة الأصلية تجعلها مثالية لتعدين العملات المشفرة في جهاز الضحية وسيارات التعدين مجاني قد شحنت حلقات الهاش كـ wasm لسنوات. بشكل أوسع wasm يقدم درجة من المراوغة: نظام أمان وضع عقداً ما يقرب من عقد في تحليل ورصد JavaScript الخبيثة أقل نضجاً في فحص wasm بحيث يمكن نقل المنطق إلى وحدة wasm تجاوز الأدوات والمراجعين البشريين الذين يقرأون فقط JavaScript. يصعب أيضاً رفع المنطق المعتم — فحوصات الترخيص والروتينات المناهضة للتحليل والاشتقاق الرئيسي — من ثنائي wasm من wasm القابل للقراءة بـ JS لذا تستخدم بعض البائعين وبعض البرامج الضارة wasm بشكل خاص لمقاومة الهندسة العكسية.
الآثار الدفاعية أن "راجعنا JavaScript" لم تعد توكيد كافي لرمز الويب المُسلَّم. إذا كانت الصفحة تشحن وحدة wasm فهذه الوحدة جزء من سطح الهجوم وتستحق التحليل الأول للقدرة أعلاه. الخبر السار إعادة تكرار الموضوع هو أن بنية استيراد wasm الصريحة تجعل على الأقل سؤال القدرة سريع للإجابة — يمكنك تحديد ما إذا كانت الوحدة يمكنها فعل شيء خطير بسرعة أكبر من ثنائي أصلي معتم. هذا عدم التماثل يفضل المدافعين على استعداد لتعلم سلسلة الأدوات.
جسر wasm إلى أدوات RE التقليدية
السؤال الذي يأتي بسرعة للعاكسين الممارسين هو ما إذا كانوا يستطيعون استخدام أدواتهم الموجودة — Ghidra و IDA و Binary Ninja — على wasm بدلاً من تعلم سلسلة أدوات منفصلة تماماً. الإجابة في 2026 هي نعم مؤهل وتستحق فهم المقايضة. المكونات الإضافية المجتمعية تجلب دعم wasm إلى منصات RE الرئيسية: هناك وحدات معالج/محمل WebAssembly لـ Ghidra وآخرين مما يسمح لك تحميل .wasm واستخدام عرض الرسم البياني والمراجع والسير الكامل للمعادل الذي تعرفه بالفعل. بالنسبة لمحلل متطور بعمق في إحدى هذه البيئات يمكن أن تفوق الألفة المزايا المخصصة لأدوات wasm.
المقايضة هي النضج والملاءمة. سلسلة أدوات wasm المخصصة — WABT و diswasm و Binaryen — مبنية حول بنية wasm الفعلية وتميل إلى إنتاج نتائج أنظف وأكثر إيديوماتيكية لـ wasm بشكل خاص بينما منصات RE العامة تتكيف نموذج مصمم لكود أصلي لآلة مكدس والذي يمكن أن يكون فقداناً أو محرجاً في الحواف. النهج العملي الذي يستقر عليه العديد من المحللين هو استخدام كليهما: أدوات وصفة الأوامر الخفيفة wasm لفرز القدرة الأول السريع الموضح أعلاه (افرغ الواردات وفكك وابحث عن السلاسل والحصول على رمز زائف سريع) وثم إذا كانت عينة تضمن تحليل يدوي عميق قم بتحميله في منصة الاختيار الخاصة بك للعمل الثقيل مع جميع ميزات التنقل والشرح الخاصة بها.
هذا هو أيضاً حيث تنطبق أساسيات RE. فك wasm ليس انضباطاً منفصلاً تماماً — المهارات الأساسية لقراءة التفكيك واتباع التحكم وتدفق البيانات وتحديد الوظائف المثيرة للاهتمام من المتصلين والمتصلين والعقل حول ما يفعله ثنائي نقل مباشرة. ما التغيير هو تفاصيل السطح: آلة مكدس بدلاً من السجلات وتدفق تحكم منظم بدلاً من القفزات الخام واستيراد المضيف بدلاً من syscalls. يمكن لـ reverser الممارس التقاط wasm بسرعة على وجه التحديد لأن الحدس الصعب المكتسب لا يزال ينطبق؛ أدوات wasm المحددة ببساطة تزيل الاحتكاك. هذه القابلية للنقل مطمئنة لأي شخص متردد في الاستثمار — أنت توسع المهارات الموجودة وليس البدء من جديد.
الخط السفلي
أصبحت WebAssembly تنسيق ثنائي من الدرجة الأولى للويب الحديث وهذا يعني أن قراءتها تعتبر الآن مهارة أمان بدلاً من الفضول. Wasm مختلف حقاً عن الكود الأصلي — آلة مكدس مع تدفق تحكم منظم وأقسام وحدة نظيفة والأهم استيراد مضيف صريح يكشف عن قدرات الوحدة قبل أن تقرأ أي رمز. تطابق سلسلة أدوات مفتوحة المصدر المحتاجة: WABT لفك الدستور والبرامج و diswasm للرمز الزائف عالي المستوى و Binaryen لتبسيط إلغاء الإخفاء و wasm-tools للتحقق والطفرة. سير العمل الأول للقدرات — الواردات والتصدير قبل التعليمات — ثم فك الدستور مع الأسماء ثم فك التجميع للأجزاء المهمة وتبسيط عند الحاجة. افعل ذلك والويب الثنائي الجديد يتوقف عن كونه كائن معتم ويصبح شيئاً آخر فقط يمكنك قراءته.
المراجع والموارد
أدوات
الخلفية والتحليل
- الهندسة العكسية WebAssembly — PNF Software
- تحليل ثنائيات WebAssembly — Forcepoint X-Labs
- دراسة شاملة لتقنيات فك التجميع لثنائيات WebAssembly
ورقات cheatsheet 1337skills ذات الصلة
- WABT و diswasm و Binaryen و wasm-tools
- Ghidra و radare2 و Cutter و Binary Ninja