
نحن نعيش في وقت مذهل. من حولنا هناك وفرة من التكنولوجيا: الهواتف وأجهزة الكمبيوتر والساعات الذكية والأدوات الأخرى. كل يوم ، تقوم الشركات المصنعة بإطلاق المزيد والمزيد من الأجهزة إلى السوق. يتم توجيه معظمها إلى حياة قصيرة ومشرقة (أو غير ذلك): شركة تسويق قوية في وقت الإصدار ، 1-2 سنوات من الدعم الكامل من قبل الشركة المصنعة ، ثم بطء النسيان. يمكن أن تعمل الأجهزة البسيطة لسنوات بعد انتهاء فترة الدعم الرسمية. مع الأجهزة الذكية ، يصبح الأمر أكثر صعوبة. من الجيد أن تستمر الأداة على الأقل في العمل بعد فصل خوادم / خدمات الشركة المصنعة. ومن حسن الحظ أن التحديث التالي لنظام التشغيل أو برامج التشغيل أو البرامج الأخرى لا يتطابق مع التوافق.
لسوء الحظ ، تتطور الأحداث بشكل متزايد وفق سيناريو متشائم. وبعد 5-10 سنوات من الشراء ، لدينا أجهزة تقنية من الناحية الفنية في أيدينا ، والتي لا يمكن استخدامها بسبب نقص دعم البرامج. بالطبع ، الأداة المكسورة غير سارة. ولكن أكثر من ذلك بكثير غير سارة إذا كان هناك بيانات المستخدم في تنسيق غير متوافق مع أي شيء. يمكن اعتبار هذه البيانات مفقودة إذا توقف الجهاز عن العمل. في حالتي ، لم يحدث الأسوأ بعد ، لكن أجراس الإنذار تدق بالفعل.
لذلك ، هناك شركة Korg سيئة السمعة ، التي تنتج معدات موسيقية عالية الجودة للغاية. في عام 2010 ، اشتريت آلة موسيقية من هذه الشركة لممارسة الموسيقى كهواية. كورج microstation هو نموذج متقدم إلى حد ما. من بين أشياء أخرى ، يحتوي على جهاز تسلسل لتسجيل مساراته ويمكنه كتابة البيانات على بطاقة ذاكرة بتنسيق SNG الخاص. من الممكن التصدير إلى تنسيق midi شائع ، ولكن يتم فقدان بيانات التعريف تقريبًا: معلومات حول التأثيرات والمرشحات المتراكبة ، والإعدادات المختلفة للأدوات الافتراضية ، إلخ. المشكلة الرئيسية بالنسبة لي شخصيا هي سرعة الانتقال إلى تسجيل الأفكار الموسيقية. يُعد هذا الخليط إبداعًا غريب الأطوار ، وفي معظم الأحيان واجهت فكرة مثيرة للاهتمام ببساطة عن طريق الارتجال أو لعب شيء غير معقد. كلما زادت سرعة الضغط على زر التسجيل دون التجول في القائمة ، زاد احتمال تكرار وتسجيل جزء مثير للاهتمام ، والذي قد يصبح في المستقبل جزءًا من عمل كامل. بالطبع ، هذا النهج غير كامل ، لكننا نتحدث عن هواية. بشكل أو بآخر ، منذ ما يقرب من عشر سنوات ، جمعت حوالي ألف رسم موسيقي ورسومات بتنسيق SNG.
رن الجرس في شكل سلسلة من مواطن الخلل في المزج ، والتي تتطلب وميض الجهاز. وفكرت في تحويل جميع بياناتي المتراكمة إلى تنسيق Midi ، خاصة وأن ذلك سيجعل تخزينها وتنظيمها وتعديلها أسهل بكثير. البحث عن المحول في Google لم يعط أي شيء. هناك العديد من الطلبات على جميع أنواع المنتديات ، فقد استمر السجل لمدة 20 عامًا ، إن لم يكن أكثر. كل ما وجدته هو الأداة المساعدة القديمة التي يوفرها Windows لشخص آخر ، والتي لا تتوافق بشكل طبيعي مع ملفاتي.
ثم قررت أن أحاول أن أرى ما هو تنسيق SNG هذا؟ ربما في مكان ما هناك بيانات MIDI العادية التي يمكنك سحبها بسهولة وحفظها؟
محاولة لحل مشكلة "الجبين"
لذلك ، من خلال تعليمات المزج ، يمكنك معرفة أن تنسيق SNG هو حاوية يتم تخزين ما يسمى "الأغاني". تحتوي كل أغنية على 16 مسار التسلسل مع بيانات الموسيقى ، وكذلك إعدادات الأصوات والمؤثرات. عند التصدير إلى تنسيق Midi عبر قائمة المزج ، يتم تصدير كل "أغنية" إلى ملف .MID منفصل ، وتضيع جميع إعدادات الأصوات والمؤثرات. بسبب ألعب أفكاري بأبسط أشكالها وبدون تأثيرات ، فالمشكلة هي بالتحديد عدد كبير من ملفات SNG وإزعاج عملية التحويل اليدوي. دعونا نرى ما إذا كان يمكن تسريع هذه العملية أو الآلي.
أولاً ، دعنا نتذكر بيانات MIDI. ببساطة ، هذا دفق من الأحداث الموسيقية: الضغط على المفتاح وإطلاقه ، والضغط وإطلاق دواسة مستديمة ، وتغيير الإيقاع ، التصحيح (أداة افتراضية) وغيرها من المعالم. يحتوي كل حدث على دلتا زمنية من لحظة الحدث والبيانات السابقة ، على سبيل المثال ، شدة الملاحظة والملعب. تنسيق ملف midi بسيط للغاية: بالإضافة إلى الرؤوس والبيانات نفسها ، لا يوجد شيء عمليًا تقريبًا.
الوردي هو ملاحظة في الحدث. أصفر باهت هو دلتا للوقت. الأزرق - ملاحظة إيقاف الحدث.دعونا نحاول البحث عن بيانات midi الخاصة بنا في ملف SNG. للقيام بذلك ، اكتب سلسلة من الملاحظات المتعددة على المزج وتصديرها إلى كلا التنسيقين. بسبب نظرًا لأننا لا نعرف بالضبط أين توجد البيانات الموسيقية في الملفات الثنائية ، فسنحاول تكرار العملية بتسلسلات مختلفة من الملاحظات.
فيما يلي ، استخدم محرر Hex Synalyze It! قدراتها في المستقبل ستكون مفيدة للغاية بالنسبة لنا. في غضون ذلك ، استخدم فقط وظيفة المقارنة الثنائية.

في الواقع ، تزامن اسم "الأغنية" فقط. بمقارنة ملفي SNG بتسلسلات مختلفة من الملاحظات ، يمكننا تقريبًا تخمين مكان تخزين البيانات الموسيقية بالضبط ، لكن في الوقت الحالي لن يساعدنا ذلك بأي طريقة - تنسيق البيانات مختلف. الملف نفسه أكبر بعشر مرات من ملف Midi ويبدو أنه يحتوي على الكثير من المعلومات الإضافية. يمكنك رؤية توقيع KORG في البايتات الأربعة الأولى وبعض الخطوط الأخرى ، بما في ذلك اسم "الأغنية" وأسماء التصحيحات (النغمات) المخصصة للمسارات.
تحليل بنية كتل البيانات
يمكن إكمال هذا إذا ، لحسن الحظ ، لم تكن هناك أدوات تجعل من السهل نسبياً تحليل وفهم بنية البيانات الثنائية. البرنامج نفسه Synalaze It! سوف يساعدنا في هذا ، والذي يسمح لك بإنشاء وتطبيق "قواعد النحو" لتحليل الملفات الثنائية.
النحوي عبارة عن بنية وصفية هرمية تسمح لك بتمثيل البيانات الثنائية في شكل مقروء من قبل الإنسان. يسمح لك البرنامج بتنزيل القواعد لبعض التنسيقات. على سبيل المثال ، لنفس ميدي:

بالنسبة لتنسيق SNG ، لم يكن من المتوقع وجود قواعد نحوية جاهزة. حسنًا ، دعنا نرى ما يمكننا استخراجه من الملف بمفردنا.
لنبدأ بالعنوان. عادةً ما يحتوي هذا الجزء على توقيع الملف ومعلومات الإصدار والأحجام والإزاحة من كتل البيانات. بعد مقارنة العديد من ملفات SNG المختلفة ، نجد الأجزاء الثابتة ونولي اهتمامًا أكبر لتلك التي تتغير

إنشاء بنية عنوان في محرر القواعد. من الواضح أن البايتات الأربع الأولى هي توقيع الملف. افترض أن وحدات البايت الأربع التالية قد تم إصدارها. لا تتغير عشرات البايت القليلة التالية ولا تحتوي على أي شيء مثير للاهتمام - سننشئ لهم بيانات ثنائية بالحجم المناسب. ولكن بعد ذلك تبدأ المتعة. يمكنك ملاحظة بعض الأنماط في سلوك وحدات البايت عند الإزاحة 0x13 و 0x1b. يبدو أن الثانية تتوافق مع عدد "الأغاني" في ملفنا. الأول ينمو أيضًا مع حجم البيانات في الرأس - يبدو أن هذا هو الحجم ، فقط العد التنازلي لا يأتي من بداية الملف ، ولكن من البايت التالي 0x14. في هذه المرحلة ، يمكننا فقط تخمين نوع البيانات العددية. افترض أن الحجم من النوع UInt32 ، أي يأخذ 4 بايت. إضافتها إلى هيكلنا. الآن يمكننا ضبط حجم بنية الرأس (حجم + 20).

القواعد النحوية مع هيكل رأس ملف مضاف دعونا نرى ما يأتي بعد ذلك. إذا نظرت عن كثب ، ستلاحظ أن الاختصارات المكونة من ثلاثة أحرف منتشرة في جميع أنحاء الملف: SNG1 ، SDK1 ، SGS1 ، وما إلى ذلك. تم العثور على هذه الأحرف في جميع ملفات SNG ، لذلك يمكننا أن نفترض أن هذه هي توقيعات لبنات معينة. بالإضافة إلى ذلك ، انتهى لقبنا بنجاح كبير قبل أحد هذه التوقيعات. قارن سلوك وحدات البايت الأربع التالية في ملفات بأحجام مختلفة. يمكن ملاحظة أن القيم تزيد مع زيادة كمية البيانات.

بعض التجارب والتحليلات والحسابات الأخرى ، وتبدأ الصورة التالية في الظهور:

وبالتالي ، يتكون ملفنا من تسلسل هرمي بسيط من الكتل. هناك كتل الأصل التي يمكن أن تحتوي على كتل تابعة متعددة. هناك كتل ورقة (في مصطلحات الأشجار الثنائية) لا تحتوي على كتل أخرى.
ثم يبدأ السحر.
مع عدد قليل من هياكل القواعد ، يمكننا تحليل بنية ملف الكتل تمامًالذلك ، قم بإنشاء بنية قالب DataChunk مع الحقول التالية (يشار إلى الحجم بين قوسين مربعين):
المعرف: سلسلة [4]
الحجم: كثافة العمليات [4]
التسلسل الهرمي: Int [4]
البيانات: هيكل
الآن إنشاء بنية parentChunk يرث DataChunk. في خاصية التسلسل الهرمي ، حدد القيمة الثابتة 0x400 - هذه علامة على الكتلة الأصلية. تأكد من تحديد خانة الاختيار "يجب أن تطابق".
وبالمثل ، إنشاء childChunk. سيكون التسلسل الهرمي في هذه الحالة قيمتين: 0x240100 و 0x100
أضف مراجعًا إلى أصل parentChunk و childChunk إلى بنية parentChunk للبيانات - وبهذه الطريقة ننشئ العودية.
أخيرًا ، أضف مرجعًا إلى أصل parentChunk في العقدة الرئيسية.

يجب أن يكون ترتيب العناصر في بنية البيانات الخاصة بـ parentChunk متغيرًا ، كما يجب أيضًا تعيين الحد الأدنى والحد الأقصى لعدد العناصر التابعة لهذا الهيكل: 0 و Unlimited ، على التوالي.
دعونا نطبق التغييرات ، وفويلا - يتم تحليل ملفنا بشكل جيد في الكتل الرئيسية

ما زلنا لا نعرف شيئًا عن البيانات نفسها ، ولكن الآن يمكننا التنقل بسهولة أكبر في الملف والتركيز على العثور على المعلومات التي نحتاجها.
تحليل كتلة تحتوي على جدول محتويات ملف
للتدريب ، دعونا نحاول تحليل كتلة بسيطة ، على سبيل المثال ، SDK1. يبدو أنه يحتوي على شيء يشبه جدول المحتويات - قائمة الأغاني وربما بعض الإزاحات / الأحجام.

إنشاء بنية sdk1Chunk يرث childChunk. سنقوم بتحرير حقل المعرف ، مع الإشارة إلى توقيع الكتلة الخاصة بنا في حقل القيم الثابتة. لا تنس أن مربع الاختيار يجب أن يتطابق. في بيانات الكتلة ، يمكن للمرء أن يلاحظ نمط تكرار واضح إلى حد ما: اسم "الأغنية" والبيانات غير المعروفة حتى الآن. لاحظ أن حجم الأجزاء المكررة هو 64 بايت. أيضًا ، وبمقارنة إصدارات الملفات بعدد مختلف من "الأغاني" ، يمكنك تحديد أن الرقم مخزّن بالبايتات الأربعة الأولى. باستخدام حسابات بسيطة وإجراء العديد من الافتراضات ، نحصل على الإصدار التالي من البنية في القواعد:

لقد قمت هنا بإنشاء بنية تابعة لـ 64 بايت songInfo وأشرت إلى القدرة على تكرار مرات numSongs. هذه هي نتيجة تطبيق القواعد:

يظل تحليل الملف الإضافي مسألة تقنية. لقد غيرت الإعدادات العامة لـ "الأغنية" ومعلمات المقاطع الفردية على المزج. بمقارنة إصدارات الملفات مع التغييرات المختلفة ، يمكنك تحسين القواعد وصقلها. بعد عدد كبير بما فيه الكفاية من مثل هذه التكرارات ، لا توجد تقريبًا أي بيانات غير معترف بها في الملف. لقد تخلصت قليلاً من العملية وصنفت جميع أقسام الملف تقريبًا ، على الرغم من أن هذا لم يكن مطلوبًا للمهمة الأصلية.
جزء صغير من القواعد النحوية لملف SNG بعد 8 ساعات من التحليل سأفتقد تفاصيل هذه العملية - في المستقبل سنركز على تحليل البيانات الموسيقية مباشرةً.
ولكن المزيد عن ذلك في الجزء التالي. سنواجه مهمة شيقة لتحويل البيانات (إنها مناسبة تمامًا للمقابلات) ، وسنحاول حلها باستخدام برنامج نصي صغير وسنسمع نتيجة تحويل اختبار غير عادية إلى حد ما.
النتائج الأولية
قد تحدث الحاجة إلى هندسة الملفات الثنائية العكسية بشكل غير متوقع. على سبيل المثال ، لتحليل البرامج الثابتة للجهاز ، قم بالتحويل من تنسيقات بيانات نادرة ، أو تحليل التهديدات الرقمية ، أو حتى تعديل حفظ اللعبة بطريقة تافهة. تتيح لك الأدوات الحديثة حل هذه المشكلات بسرعة وكفاءة. منذ حوالي 10 سنوات ، كنت أبحث عن البرامج الثابتة لأجهزة الكمبيوتر المحمول ، وقد تستغرق هذه العملية عدة أسابيع. ثم كان مطلوبًا كتابة البرامج النصية يدويًا لتحليل كتل البيانات ووضع الهياكل. من خلال نهج جديد مؤتمت جزئيًا ، قمتُ بإنشاء ملف نحوي كامل تقريبًا في غضون يومين فقط.
يمكنك البدء في تحليل الملف الثنائي من خلال البحث عن السلاسل - حيث يمكنهم إعطاء القرائن الأولى وتسريع عملية التحليل. غالبًا ما تتكون الملفات الثنائية من كتل بيانات منظمة في بنية هرمية أو خطية. إذا كنت تتعامل مع هذا الهيكل ، فسيكون إجراء مزيد من التحليل أسهل بكثير. يمكن أن يوفر رأس الملف تلميحات على الإزاحات / أحجام كتل البيانات. في المراحل الأولى ، من المنطقي التركيز على وصف الهياكل والكتل الواضحة. تم تبسيط مهمة التحليل إلى حد كبير من خلال القدرة على إنشاء إصدارات جديدة من الملفات بإعدادات ومعلمات وبيانات مختلفة. هناك عدد من الصعوبات المرتبطة بأنواع البيانات غير المعروفة وترتيب البايت في تمثيلها الثنائي (Endianness). سنتطرق إلى هذه الأسئلة في الجزء التالي.
القراءة الموصى بها
أندرياس بهناك. كيفية التعامل مع تحليل تنسيق الملف الثنائي