Scroll to navigation

MAGIC(5) File Formats Manual MAGIC(5)

الاسم

magicملف الأنماط السحرية لأمر file

الوصف

توثق صفحة الدليل هذه تنسيق الملفات السحرية كما هي مستخدمة بواسطة الأمر file(1) ، الإصدار 5.47. يحدد الأمر file(1) نوع الملف باستخدام، من بين اختبارات أخرى، اختبارًا لمعرفة ما إذا كان الملف يحتوي على "أنماط سحرية" “magic patterns” معينة. تقع قاعدة بيانات هذه "الأنماط السحرية" عادةً في ملف ثنائي في /usr/share/misc/magic.mgc أو دليل لملفات مجزأة لنص المصدر للأنماط السحرية في /usr/share/misc/magic. تحدد قاعدة البيانات الأنماط التي سيُختبر وجودها، والرسالة أو نوع MIME المراد طباعته إذا عُثر على نمط معين، والمعلومات الإضافية المراد استخراجها من الملف.

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

رقم يحدد الإزاحة (بالبايت) داخل الملف للبيانات المراد اختبارها. يمكن أن تكون هذه الإزاحة رقماً سالباً إذا كانت:
  • الإزاحة المباشرة الأولى للمدخل السحري (عند مستوى المتابعة 0)، وفي هذه الحالة تُفسر على أنها إزاحة من نهاية الملف باتجاه الخلف. يعمل هذا فقط عندما يكون موصّف الملف متاحاً وعندما يكون ملفاً عادياً.
  • إزاحة متابعة نسبية لنهاية الحقل الأخير في المستوى الأعلى (&).
إذا بدأت الإزاحة بالرمز “+” ، تُفسر جميع الإزاحات على أنها من بداية الملف (وهو الخيار المبدئي).
نوع البيانات المراد اختبارها. القيم الممكنة هي:
قيمة من بايت واحد.
قيمة من بايتين بترتيب البايتات الأصلي لهذا الجهاز.
قيمة من 4 بايتات بترتيب البايتات الأصلي لهذا الجهاز.
قيمة من 8 بايتات بترتيب البايتات الأصلي لهذا الجهاز.
عدد ذو فاصلة عائمة أحادي الدقة 32-بت وحسب معيار IEEE بترتيب البايتات الأصلي لهذا الجهاز.
عدد ذو فاصلة عائمة مزدوج الدقة 64-بت وحسب معيار IEEE بترتيب البايتات الأصلي لهذا الجهاز.
سلسلة من البايتات. يمكن أن يُتبع تخصيص نوع السلسلة اختيارياً بخيار /<width> واختيارياً بمجموعة من الأعلام [bCcftTtWw]*. يمكن استخدام الشُرط المائلة للفصل بين الخيارات لتحسين القراءة. يحدّ العرض (width) من عدد المحارف المراد نسخها. الصفر يعني كل المحارف. الأعلام التالية مدعومة:
b
فرض اختبار الملف الثنائي.
C
استخدام مطابقة غير حساسة لحالة الأحرف الكبيرة: تطابق الأحرف الكبيرة في النمط السحري كلاً من الأحرف الصغيرة والكبيرة في الهدف، بينما تطابق الأحرف الصغيرة في النمط السحري الأحرف الكبيرة فقط في الهدف. (غير صالحة للتعبيرات النمطية regex)
c
استخدام مطابقة غير حساسة لحالة الأحرف الصغيرة: تطابق الأحرف الصغيرة في النمط السحري كلاً من الأحرف الصغيرة والكبيرة في الهدف، بينما تطابق الأحرف الكبيرة في النمط السحري الأحرف الكبيرة فقط في الهدف. (غير صالحة للتعبيرات النمطية regex). لإجراء مطابقة غير حساسة لحالة الأحرف بالكامل، حدد كلاً من “c” و “C”.
f
اشتراط أن تكون السلسلة المطابقة كلمة كاملة، وليس مطابقة جزئية للكلمة.
s
عدم تضمين طول المطابقة في حساب الإزاحة. (صالح فقط للبحث والتعبيرات النمطية regex)
T
تهذيب السلسلة النصية، أي تُحذف الفراغات البادئة والختامية قبل طباعة السلسلة.
t
فرض اختبار الملف النصي.
W
ضغط الفراغات في الهدف، والذي يجب أن يحتوي على محرف فراغ واحد على الأقل. (غير صالح للتعبيرات النمطية regex). إذا كان النمط السحري يحتوي على n من الفراغات المتتالية، يحتاج الهدف إلى n من الفراغات المتتالية على الأقل للمطابقة.
w
معاملة كل فراغ في النمط السحري كفراغ اختياري. (غير صالح للتعبيرات النمطية regex)
سلسلة نصية بأسلوب باسكال (Pascal-style) حيث يُفسر البايت/العدد القصير/العدد الصحيح الأول على أنه الطول غير الموقع. يكون الطول بايت مبدئياً ويمكن تحديده كمعدل. المعدلات التالية مدعومة:
B
طول بايت واحد (مبدئي).
H
طول من بايتين بترتيب البايتات الكبير (big endian).
h
طول من بايتين بترتيب البايتات الصغير (little endian).
L
طول من 4 بايتات بترتيب البايتات الكبير (big endian).
l
طول من 4 بايتات بترتيب البايتات الصغير (little endian).
J
يتضمن الطول نفسه في حسابه.
السلسلة النصية لا تنتهي بمحرف NUL. يُستخدم الرمز “J” بدلاً من الرمز الأكثر قيمة “I” لأن هذا النوع من الطول يعد ميزة من ميزات صيغة JPEG.
قيمة من 4 بايتات تُفسر كتاريخ يونكس.
قيمة من 8 بايتات تُفسر كتاريخ يونكس.
قيمة من 4 بايتات تُفسر كتاريخ بأسلوب يونكس، ولكن بالتوقيت المحلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من 8 بايتات تُفسر كتاريخ بأسلوب يونكس، ولكن بالتوقيت المحلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من 8 بايتات تُفسر كتاريخ بأسلوب ويندوز.
قيمة من بايتين تُفسر كتاريخ بأسلوب FAT/DOS.
قيمة من بايتين تُفسر كوقت بأسلوب FAT/DOS.
طول ID3 ‏32-بت بترتيب البايتات الكبير (big-endian).
قيمة من بايتين بترتيب البايتات الكبير (big-endian).
قيمة من 4 بايتات بترتيب البايتات الكبير (big-endian).
قيمة من 8 بايتات بترتيب البايتات الكبير (big-endian).
عدد ذو فاصلة عائمة أحادي الدقة 32-بت وحسب معيار IEEE بترتيب البايتات الكبير (big-endian).
عدد ذو فاصلة عائمة مزدوج الدقة 64-بت وحسب معيار IEEE بترتيب البايتات الكبير (big-endian).
قيمة من 4 بايتات بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ يونكس.
قيمة من 8 بايتات بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ يونكس.
قيمة من 4 بايتات بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ بأسلوب يونكس، ولكن بالتوقيت المحلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من 8 بايتات بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ بأسلوب يونكس، ولكن بالتوقيت المحلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من 8 بايتات بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ بأسلوب ويندوز.
قيمة من بايتين بترتيب البايتات الكبير (big-endian)، تُفسر كتاريخ بأسلوب FAT/DOS.
قيمة من بايتين بترتيب البايتات الكبير (big-endian)، تُفسر كوقت بأسلوب FAT/DOS.
سلسلة نصية يونيكود (UCS16) من بايتين بترتيب البايتات الكبير (big-endian).
طول ID3 ‏32-بت بترتيب البايتات الصغير (little-endian).
قيمة من بايتين بترتيب البايتات الصغير (little-endian).
قيمة من 4 بايتات بترتيب البايتات الصغير (little-endian).
قيمة من 8 بايتات بترتيب البايتات الصغير (little-endian).
عدد ذو فاصلة عائمة أحادي الدقة 32-بت وحسب معيار IEEE بترتيب البايتات الصغير (little-endian).
عدد بفاصلة عائمة بمعيار IEEE مزدوج الدقة وبسعة 64 بت بترتيب بايتات little-endian.
قيمة من أربعة بايتات بترتيب بايتات little-endian، تُفسَّر كتاريخ UNIX.
قيمة من ثمانية بايتات بترتيب بايتات little-endian، تُفسَّر كتاريخ UNIX.
قيمة من أربعة بايتات بترتيب بايتات little-endian، تُفسَّر كتاريخ بأسلوب UNIX، ولكن تُفسَّر كتوقيت محلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من ثمانية بايتات بترتيب بايتات little-endian، تُفسَّر كتاريخ بأسلوب UNIX، ولكن تُفسَّر كتوقيت محلي بدلاً من التوقيت العالمي المنسق (UTC).
قيمة من ثمانية بايتات بترتيب بايتات little-endian، تُفسَّر كتاريخ بأسلوب Windows.
قيمة من بايتين بترتيب بايتات little-endian، تُفسَّر كتاريخ بأسلوب FAT/DOS.
قيمة من بايتين بترتيب بايتات little-endian، تُفسَّر كتوقيت بأسلوب FAT/DOS.
سلسلة نصية يونيكود (UCS16) من بايتين بترتيب بايتات little-endian.
قيمة من أربعة بايتات بترتيب بايتات middle-endian (لـ PDP-11).
قيمة من أربعة بايتات بترتيب بايتات middle-endian (لـ PDP-11)، تُفسَّر كتاريخ UNIX.
قيمة من أربعة بايتات بترتيب بايتات middle-endian (لـ PDP-11)، تُفسَّر كتاريخ بأسلوب UNIX، ولكن تُفسَّر كتوقيت محلي بدلاً من التوقيت العالمي المنسق (UTC).
بدءًا من الإزاحة المعطاة، استشر قاعدة بيانات magic مجددًا. إزاحة magic من نوع indirect تكون مبدئيًا مطلقة في الملف، ولكن يمكن تحديد /r للإشارة إلى أن الإزاحة نسبية من بداية المدخلة.
عرِّف مثيل magic “named” يمكن استدعاؤه من مدخلة magic أخرى من نوع use ، مثل استدعاء روتين فرعي. إزاحات magic المباشرة للمثيل المُسمَّى نسبية لإزاحة المدخلة السابقة المطابقة، لكن الإزاحات غير المباشرة نسبية لبداية الملف كالمعتاد. تُعيد مدخلات magic المُسمَّاة قيمة صحيحة إذا وجد تطابق في تقييم المدخلة، أو إذا وجد تطابق سابق.
استدعِ magic المُسمَّى بشكل تكراري بدءًا من الإزاحة الحالية. إذا بدأ اسم المرجع بـ ^ فإن ترتيب البايتات (endianness) لـ magic يُبدَّل؛ فإذا ذكر magic على سبيل المثال leshort ، فإنه يُعامَل كـ beshort والعكس صحيح. هذا مفيد لتجنب تكرار القواعد لاختلاف ترتيب البايتات.
مطابقة تعبير نمطي ببناء التعبيرات النمطية الموسَّعة لـ POSIX (مثل egrep). التعبيرات النمطية قد تستغرق وقتًا أسيًا للمعالجة، وأداؤها يصعب التنبؤ به، لذا يُنصَح بعدم استخدامها. عند استخدامها في بيئات الإنتاج، يجب فحص أدائها بعناية. يجب أيضًا تحديد حجم السلسلة المطلوب البحث فيها عن طريق تحديد /<length> ، لتجنب مشاكل الأداء عند فحص الملفات الطويلة. يمكن أيضًا أن يتبع تحديد النوع اختياريًا /[c][s][l]. يجعل العلم “c” المطابقة غير حساسة لحالة الأحرف، بينما يُحدِّث العلم “s” الإزاحة إلى إزاحة بداية المطابقة، بدلاً من نهايتها. يغيِّر المعدِّل “l” حد الطول ليعني عدد الأسطر بدلاً من عدد البايتات. تُفصَل الأسطر بواسطة فاصل الأسطر الأصلي للمنصة. عند تحديد عدد الأسطر، يُحسَب عدد بايتات ضمني بافتراض أن كل سطر طوله 80 محرفًا. إذا لم يُحدَّد عدد البايتات أو الأسطر، يُقيَّد البحث آليًا بـ 8 كيلوبايت. يطابق ^ و $ بداية ونهاية الأسطر الفردية، على التوالي، وليس بداية ونهاية الملف.
بحث عن سلسلة نصية حرفية بدءًا من الإزاحة المعطاة. يمكن استخدام أعلام التعديل نفسها كما في أنماط السلاسل. يجب أن يحتوي تعبير البحث على النطاق بصيغة /number, وهو عدد المواضع التي ستُجرَى فيها محاولة المطابقة، بدءًا من إزاحة البداية. هذا مناسب للبحث عن تعبيرات ثنائية أكبر ذات إزاحات متغيرة، باستخدام رموز الهروب \ للمحارف الخاصة. ترتيب المعدِّل والرقم ليس مهمًا.
هذا مخصص للاستخدام مع الاختبار x (الذي هو صحيح دائمًا) وليس له نوع. يطابق عندما لا يكون أي اختبار آخر في مستوى التتابُع ذلك قد طابق من قبل. مسح الاختبارات المطابقة لمستوى تتابُع يمكن إجراؤه باستخدام الاختبار clear.
هذا الاختبار صحيح دائمًا ويمسح علم المطابقة لمستوى التتابُع ذلك. وهو مخصص للاستخدام مع الاختبار default.
حلِّل الملف كملف شهادة DER. يُستخدم حقل الاختبار كنوع der يحتاج إلى مطابقة. أنواع DER هي: eoc ، bool ، int ، bit_str ، octet_str ، null ، obj_id ، obj_desc ، ext ، real ، enum ، embed ، utf8_str ، rel_oid ، time ، res2 ، seq ، set ، num_str ، prt_str ، t61_str ، vid_str ، ia5_str ، utc_time ، gen_time ، gr_str ، vis_str ، gen_str ، univ_str ، char_str ، bmp_str ، date ، tod ، datetime ، duration ، oid-iri ، rel-oid-iri. يمكن أن تتبع هذه الأنواع حجم عددي اختياري، والذي يشير إلى عرض الحقل بالبايتات.
,
 
,
 
مُعرِّف فريد عالميًا (GUID)، يُحلّل ويُطبع كـ XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. تنسيقه عبارة عن سلسلة نصية.
هذه قيمة رباعية تشير إلى الإزاحة الحالية للملف. يمكن استخدامها لتحديد حجم الملف أو ذاكرة السحر الوسيطة. على سبيل المثال، المُدخلات السحرية:
-0	offset	x	this file is %lld bytes
-0	offset	<=100	must be more than 100 \
    bytes and is only %lld
سلسلة نصية تُمثّل رقمًا ثمانيًا.

للتوافق مع معيار UNIX الموحد، فإن محددي النوع dC و d1 يكافئان byte ، ومحددي النوع uC و u1 يكافئان ubyte ، ومحددي النوع dS و d2 يكافئان short ، ومحددي النوع uS و u2 يكافئان ushort ، ومحددات النوع dI ، و dL ، و d4 تكافئ long ، ومحددات النوع uI ، و uL ، و u4 تكافئ ulong ، ومحدد النوع d8 يكافئ quad ، ومحدد النوع u8 يكافئ uquad ، ومحدد النوع s يكافئ string. بالإضافة إلى ذلك، فإن محدد النوع dQ يكافئ quad ومحدد النوع uQ يكافئ uquad.

يُصنّف كل نمط سحري في المستوى الرئيس (انظر أدناه للحصول على تفسير للمستويات) كنص أو ثنائي وفقًا للأنواع المستخدمة. تُصنّف الأنواع “regex” و “search” كاختبارات نصية، ما لم تُستخدم محارف غير قابلة للطباعة في النمط. تُصنّف جميع الاختبارات الأخرى كثنائية. يُعتبر النمط في المستوى الرئيس نصًا اختباريًا عندما تكون جميع أنماطه الفرعية أنماطًا نصية؛ وخلاف ذلك، يُعتبر نمطًا ثنائيًا. عند مطابقة ملف، تُجرّب الأنماط الثنائية أولاً؛ وإذا لم يُعثر على تطابق، وبدا الملف كأنه نص، فيُحدّد ترميزه وتُجرّب الأنماط النصية.

يمكن اختياريًا إتباع الأنواع الرقمية بمعامل وقيمة رقمية، لتحديد أن القيمة ستُعدّل وفقًا للمعامل والقيمة الرقمية قبل إجراء أي مقارنات. المعاملات التالية مدعومة: &, |, ↑, +, -, *, /, %. إلحاق الحرف u كبادئة للنوع يشير إلى أن المقارنات المرتبة يجب أن تكون غير موقعة.

القيمة المراد مقارنتها بالقيمة المأخوذة من الملف. إذا كان النوع رقميًا، فتُحدّد هذه القيمة بصيغة لغة C؛ وإذا كانت سلسلة نصية، فتُحدّد كسلسلة نصية بلغة C مع السماح بمحارف الهروب المعتادة (مثل \n للسطر الجديد).

قد تُسبق القيم الرقمية بمحرف يشير إلى العملية المراد تنفيذها. يمكن أن يكون = ، لتحديد أن القيمة من الملف يجب أن تساوي القيمة المحددة، أو < ، لتحديد أن القيمة من الملف يجب أن تكون أقل من القيمة المحددة، أو > ، لتحديد أن القيمة من الملف يجب أن تكون أكبر من القيمة المحددة، أو & ، لتحديد أن القيمة من الملف يجب أن تحتوي على جميع البتات المعينة في القيمة المحددة، أو ^ ، لتحديد أن القيمة من الملف يجب أن تمسح أيًا من البتات المعينة في القيمة المحددة، أو ~ ، حيث تُنفي القيمة المحددة بعده قبل اختبارها. ويعني x أن أي قيمة ستتطابق. إذا حُذف المحرف، فيُفترض أنه =. العوامل & و ^ و ~ لا تعمل مع الأعداد العشرية والمضاعفة. يحدد العامل ! أن السطر يتطابق إذا لَم ينجح الاختبار.

تُحدّد القيم الرقمية بصيغة لغة C؛ على سبيل المثال: 13 عشري، و 013 ثماني، و 0x13 ست عشري.

لا تُجرى العمليات الرقمية على أنواع التاريخ، وبدلاً من ذلك تُفسّر القيمة الرقمية كإزاحة.

بالنسبة لقيم السلاسل النصية، يجب أن تتطابق السلسلة النصية من الملف مع السلسلة المحددة. يمكن تطبيق العوامل = و < و > (وليس &) على السلاسل النصية. الطول المستخدم للمطابقة هو طول معامل السلسلة النصية في الملف السحري. هذا يعني أن السطر يمكنه مطابقة أي سلسلة نصية غير فارغة (تُستخدم عادةً لطباعة السلسلة النصية لاحقًا)، باستخدام >\0 (لأن جميع السلاسل النصية غير الفارغة أكبر من السلسلة النصية الفارغة).

تُعامل التواريخ كقيم رقمية في التمثيل الداخلي المقابل لها.

ينتج عن الاختبار الخاص x دائمًا قيمة صحيحة (true).

الرسالة المراد طباعتها في حال نجاح المقارنة. إذا كانت السلسلة النصية تحتوي على محدد تنسيق printf(3) ، فتُطبع القيمة من الملف (بعد تطبيق أي قناع محدد) باستخدام الرسالة كسلسلة تنسيق. إذا بدأت السلسلة بـ “\b” ، فإن الرسالة المطبوعة هي بقية السلسلة النصية دون إضافة مسافة بيضاء قبلها: عادةً ما تُفصل التطابقات المتعددة بمسافة واحدة.

يمكن تحديد منشئ ونوع APPLE المكون من 4+4 محارف كـ:

!:apple	CREATYPE

يمكن تحديد قائمة بامتدادات الملفات الشائعة مفصولة بشرطة مائلة كـ:

!:ext	ext[/ext...]

أي السلسلة النصية الحرفية “!:ext” متبوعة بقائمة مفصولة بشرطة مائلة من الامتدادات الشائعة؛ على سبيل المثال لصور JPEG:

!:ext jpeg/jpg/jpe/jfif

يُعطى نوع MIME في سطر منفصل، ويجب أن يكون السطر التالي غير الفارغ وغير التعليقي بعد السطر السحري الذي يحدد نوع الملف، وله التنسيق التالي:

!:mime	MIMETYPE

أي السلسلة النصية الحرفية “!:mime” متبوعة بنوع MIME.

يمكن تقديم قوة اختيارية في سطر منفصل يشير إلى الوصف السحري الحالي باستخدام التنسيق التالي:

!:strength OP VALUE

يمكن أن يكون المعامل OP: + أو - أو * أو / وتكون VALUE ثابتاً بين 0 و 255. يُطبّق هذا الثابت باستخدام المعامل المحدد على القوة السحرية المبدئية المحسوبة حاليًا.

تحتوي بعض تنسيقات الملفات على معلومات إضافية تُطبع مع نوع الملف أو تحتاج إلى اختبارات إضافية لتحديد نوع الملف الحقيقي. تبدأ هذه الاختبارات الإضافية بمحرف واحد أو أكثر من محارف > التي تسبق الإزاحة. يشير عدد محارف > في السطر إلى مستوى الاختبار؛ ويُعتبر السطر الذي لا يحتوي على > في بدايته في المستوى 0. تُرتّب الاختبارات في تسلسل هرمي يشبه الشجرة: إذا نجح الاختبار في سطر عند المستوى n ، فتُنفّذ جميع الاختبارات التالية في المستوى ، وتُطبع الرسائل إذا نجحت الاختبارات، حتى يظهر سطر بمستوى n (أو أقل). بالنسبة للملفات الأكثر تعقيدًا، يمكن استخدام رسائل فارغة للحصول على تأثير "إذا/إذن" فقط، بالطريقة التالية:

0      string    MZ
>0x18  uleshort  <0x40   MS-DOS executable
>0x18  uleshort  >0x3f   extended PC executable (e.g., MS Windows)

لا يلزم أن تكون الإزاحات ثابتة، بل يمكن أيضًا قراءتها من الملف الجاري فحصه. إذا كان المحرف الأول الذي يلي آخر > هو ، فتُفسّر السلسلة النصية التي تلي القوس كإزاحة غير مباشرة. هذا يعني أن الرقم الذي يلي القوس يُستخدم كإزاحة في الملف. تُقرأ القيمة عند تلك الإزاحة، وتُستخدم مرة أخرى كإزاحة في الملف. الإزاحات غير المباشرة تكون على الشكل: (x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]). تُستخدم قيمة x كإزاحة في الملف. ويُقرأ بايت، أو طول id3، أو short أو long عند تلك الإزاحة اعتمادًا على محدد النوع . تُعامل القيمة كموقعة إذا حُدّد “,” أو غير موقعة إذا حُدّد “.”. تُفسّر الأنواع المكتوبة بحروف كبيرة الرقم كقيمة طرفية كبيرة (big endian)، بينما تُفسّر إصدارات الحروف الصغيرة الرقم كقيمة طرفية صغيرة (little endian)؛ ويُفسّر النوع الرقم كقيمة طرفية وسيطة (PDP-11). تُضاف قيمة إلى هذا الرقم وتُستخدم النتيجة كإزاحة في الملف. النوع المبدئي إذا لم يُحدّد هو long. الأنواع التالية مستكشفة:

Sy Mnemonic Sy Endian Sy Size
bcBC Byte/Char N/A 1
efg Double Little 8
EFG Double Big 8
hs Half/Short Little 2
HS Half/Short Big 2
i ID3 Little 4
I ID3 Big 4
l Long Little 4
L Long Big 4
m Middle Middle 4
o Octal Textual Variable
q Quad Little 8
Q Quad Big 8

وبهذه الطريقة يمكن فحص البنى ذات الطول المتغير:

# MS Windows executables are also valid MS-DOS executables
0           string   MZ
>0x18       uleshort <0x40  MZ executable (MS-DOS)
# skip the whole block below if it is not an extended executable
>0x18       uleshort >0x3f
>>(0x3c.l)  string   PE\0\0 PE executable (MS-Windows)
>>(0x3c.l)  string   LX\0\0 LX executable (OS/2)

هذه الإستراتيجية في الفحص لها عيب: يجب عليك التأكد من طباعة شيء ما في النهاية، وإلا فقد يحصل المستخدمون على مخرجات فارغة (مثل عدم وجود PE\0\0 ولا LE\0\0 في المثال أعلاه).

إذا تعذر استخدام هذه الإزاحة غير المباشرة مباشرة، فمن الممكن إجراء حسابات بسيطة: يتيح إلحاق داخل الأقواس تعديل القيمة المقروءة من الملف قبل استخدامها كإزاحة:

# MS Windows executables are also valid MS-DOS executables
0           string   MZ
# sometimes, the value at 0x18 is less that 0x40 but there's still an
# extended executable, simply appended to the file
>0x18       uleshort <0x40
>>(4.s*512) leshort  0x014c  COFF executable (MS-DOS, DJGPP)
>>(4.s*512) leshort  !0x014c MZ executable (MS-DOS)

في بعض الأحيان لا تعرف الإزاحة الدقيقة لأن هذا يعتمد على طول أو موضع (عند استخدام الإزاحة غير المباشرة سابقًا) الحقول السابقة. يمكنك تحديد إزاحة نسبية لنهاية الحقل الأخير في المستوى الأعلى باستخدام ‘&’ كبادئة للإزاحة:

0           string   MZ
>0x18       uleshort >0x3f
>>(0x3c.l)  string   PE\0\0    PE executable (MS-Windows)
# immediately following the PE signature is the CPU type
>>>&0       leshort  0x14c     for Intel 80386
>>>&0       leshort  0x8664    for x86-64
>>>&0       leshort  0x184     for DEC Alpha

يمكن الجمع بين الإزاحات غير المباشرة والنسبية:

0             string   MZ
>0x18         uleshort <0x40
>>(4.s*512)   leshort  !0x014c MZ executable (MS-DOS)
# if it's not COFF, go back 512 bytes and add the offset taken
# from byte 2/3, which is yet another way of finding the start
# of the extended executable
>>>&(2.s-514) string   LE      LE executable (MS Windows VxD driver)

أو العكس بالعكس:

0                 string   MZ
>0x18             uleshort >0x3f
>>(0x3c.l)        string   LE\0\0  LE executable (MS-Windows)
# at offset 0x80 (-4, since relative offsets start at the end
# of the up-level match) inside the LE header, we find the absolute
# offset to the code area, where we look for a specific signature
>>>(&0x7c.l+0x26) string   UPX     \b, UPX compressed

أو حتى كلاهما معًا!

0                string   MZ
>0x18            uleshort >0x3f
>>(0x3c.l)       string   LE\0\0 LE executable (MS-Windows)
# at offset 0x58 inside the LE header, we find the relative offset
# to a data area where we look for a specific signature
>>>&(&0x54.l-3)  string   UNACE  \b, ACE self-extracting archive

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

0                 string       MZ
>0x18             uleshort     >0x3f
>>(0x3c.l)        string       PE\0\0 PE executable (MS-Windows)
# search for the PE section called ".idata"...
>>>&0xf4          search/0x140 .idata
# ...and go to the end of it, calculated from start+length;
# these are located 14 and 10 bytes after the section name
>>>>(&0xe.l+(-4)) string       PK\3\4 \b, ZIP self-extracting archive

إذا كانت لديك قائمة بالقيم المعروفة عند مستوى متابعة معين، وتريد تقديم حالة مبدئية تشبه التبديل (switch-like default case):

# clear that continuation level match
>18	clear	x
>18	lelong	1	one
>18	lelong	2	two
>18	default	x
# print default match
>>18	lelong	x	unmatched 0x%x

انظر أيضًا

file(1) - الأمر الذي يقرأ هذا الملف.

العلل

التنسيقات long و belong و lelong و melong و short و beshort و leshort لا تعتمد على طول أنواع بيانات C لـ short و long على المنصة، على الرغم من أن مواصفات UNIX الموحدة تلمح إلى أنها تعتمد عليها. ومع ذلك، نظراً لأن نظام OS X Mountain Lion قد اجتاز مجموعة اختبارات التحقق من مواصفات UNIX الموحدة، ويقدم إصداراً من file(1) لا تعتمد فيه هذه التنسيقات على أحجام أنواع بيانات C وهو مبني لبيئة 64 بت حيث يكون النوع long بحجم 8 بايت بدلاً من 4 بايت، فمن المحتمل أن مجموعة اختبارات التحقق لا تختبر ما إذا كان long ، على سبيل المثال، يشير إلى عنصر بنفس حجم نوع بيانات C لـ long. ربما ينبغي أن تكون هناك أسماء type مثل int8 و uint8 و int16 و uint16 و int32 و uint32 و int64 و uint64 ، ومتغيرات ترتيب البايت المحددة لها، لجعله أكثر وضوحاً أن تلك الأنواع لها أعراض محددة.

ترجمة

تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org

24 نوفمبر 2025 Nixpkgs