| MAGIC(5) | فایلهای پیکربندی | MAGIC(5) |
نام (NAME)
magic - فایل الگوی جادویی دستور file
توضیحات (DESCRIPTION)
این صفحه راهنما قالب فایلهای الگوهای جادویی (magic files) مورد استفاده توسط دستور file را شرح میدهد. دستور file(1) نوع یک فایل را با استفاده از آزمونهای گوناگون، از جمله بررسی اینکه آیا فایل حاوی «الگوهای جادویی» (magic patterns) خاصی است، شناسایی میکند. پایگاهداده این «الگوهای جادویی» معمولاً در یک فایل باینری در مسیر /usr/share/misc/magic.mgc یا دایرکتوری حاوی قطعهفایلهای متنی منبع الگو در مسیر /usr/share/misc/magic قرار دارد. این پایگاهداده مشخص میکند چه الگوهایی باید بررسی شوند، در صورت یافتن یک الگوی خاص چه پیام یا نوع MIME چاپ شود، و چه اطلاعات تکمیلی دیگری از فایل استخراج گردد.
قالب قطعهفایلهای منبع که برای ساخت این پایگاهداده به کار میروند به شرح زیر است: هر خط از یک قطعهفایل، آزمونی را که باید انجام شود مشخص میکند. یک آزمون، دادههای شروعشده از یک آفست مشخص در فایل را با یک مقدار بایت، یک رشته یا یک مقدار عددی مقایسه میکند. در صورت موفقیتآمیز بودن آزمون، یک پیام چاپ میشود. هر خط از فیلدهای زیر تشکیل شده است:
- offset
- عددی که آفست (بر حسب بایت) دادههای مورد بررسی در فایل را مشخص میکند. این آفست در شرایط زیر میتواند یک عدد منفی باشد:
- نخستین آفست مستقیم ورودی جادویی (در سطح تداوم ۰)؛ که در این حالت به عنوان آفست از انتهای فایل به سمت عقب تفسیر میشود. این ویژگی تنها زمانی کار میکند که توصیفگر فایل (file descriptor) در دسترس بوده و فایل از نوع معمولی (regular file) باشد.
- یک آفست تداوم نسبی نسبت به انتهای آخرین فیلد سطح بالاتر (&).
- type
- نوع دادهای که باید آزموده شود. مقادیر مجاز عبارتند از:
- byte
- یک مقدار تکبایتی.
- short
- یک مقدار دو بایتی با ترتیب بایت بومی دستگاه (native byte order).
- long
- یک مقدار چهار بایتی با ترتیب بایت بومی دستگاه.
- quad
- یک مقدار هشت بایتی با ترتیب بایت بومی دستگاه.
- float
- یک عدد ممیز شناور ۳۲ بیتی با دقت یگانه بر اساس استاندارد IEEE با ترتیب بایت بومی دستگاه.
- double
- یک عدد ممیز شناور ۶۴ بیتی با دقت مضاعف بر اساس استاندارد IEEE با ترتیب بایت بومی دستگاه.
- string
- رشتهای از بایتها. مشخصه نوع string میتواند به صورت اختیاری با یک گزینه /width و به دنبال آن مجموعهای از پرچمها به صورت /[bCcftTtWw]* همراه شود. گزینه عرض (width) تعداد نویسههایی را که باید کپی شوند محدود میکند. مقدار صفر به معنی تمام نویسهها است. پرچمهای زیر پشتیبانی میشوند:
- b
- اجبار به بررسی فایل به عنوان فایل باینری (دودویی).
- C
- استفاده از تطبیق غیرحساس به حروف بزرگ: نویسههای بزرگ در الگوی جادویی با هر دو حالت کوچک و بزرگ در هدف تطبیق داده میشوند، در حالی که نویسههای کوچک الگو تنها با نویسههای بزرگ در هدف مطابقت مییابند.
- c
- استفاده از تطبیق غیرحساس به حروف کوچک: نویسههای کوچک در الگوی جادویی با هر دو حالت کوچک و بزرگ در هدف تطبیق داده میشوند، در حالی که نویسههای بزرگ الگو تنها با نویسههای بزرگ در هدف مطابقت مییابند. برای انجام یک تطبیق کاملاً غیرحساس به بزرگی و کوچکی، هر دو پرچم c و C را مشخص کنید.
- f
- الزام به اینکه رشته تطبیقیافته یک کلمه کامل باشد، نه یک بخش جزئی از کلمه.
- T
- حذف فاصلههای سفید اضافی (Trim)؛ یعنی فاصلههای سفید ابتدا و انتهای رشته پیش از چاپ حذف میشوند.
- t
- اجبار به بررسی فایل به عنوان فایل متنی.
- W
- فشردهسازی فاصلههای سفید در هدف، که باید حداقل شامل یک نویسه فاصله سفید باشد. اگر در الگوی جادویی n فاصله متوالی وجود داشته باشد، هدف برای تطبیق نیازمند حداقل n فاصله متوالی خواهد بود.
- w
- در نظر گرفتن هر فاصله خالی در الگوی جادویی به عنوان یک فاصله اختیاری.
- pstring
- رشته به سبک پاسکال (Pascal-style string) که در آن نخستین بایت/short/int به عنوان طول بدون علامت تفسیر میشود. طول به طور پیشفرض یک بایت است و میتواند به عنوان یک اصلاحکننده مشخص شود. اصلاحکنندههای زیر پشتیبانی میشوند:
- این رشته به NUL ختم نمیشود. از J به جای نویسه ارزشمندتر I استفاده شده است، زیرا این سبک از طول از ویژگیهای قالب JPEG میباشد.
- date
- یک مقدار چهار بایتی که به عنوان تاریخ یونیکس (UNIX date) تفسیر میشود.
- qdate
- یک مقدار هشت بایتی که به عنوان تاریخ یونیکس تفسیر میشود.
- ldate
- یک مقدار چهار بایتی که به عنوان تاریخ به سبک یونیکس اما بر اساس زمان محلی به جای UTC تفسیر میشود.
- qldate
- یک مقدار هشت بایتی که به عنوان تاریخ به سبک یونیکس اما بر اساس زمان محلی به جای UTC تفسیر میشود.
- qwdate
- یک مقدار هشت بایتی که به عنوان تاریخ به سبک ویندوز (Windows-style date) تفسیر میشود.
- beid3
- طول ۳۲ بیتی شناسه ID3 با ترتیب بایت بزرگ (big-endian).
- beshort
- یک مقدار دو بایتی با ترتیب بایت بزرگ (big-endian).
- belong
- یک مقدار چهار بایتی با ترتیب بایت بزرگ (big-endian).
- bequad
- یک مقدار هشت بایتی با ترتیب بایت بزرگ (big-endian).
- befloat
- یک عدد ممیز شناور ۳۲ بیتی با دقت یگانه بر اساس IEEE با ترتیب بایت بزرگ.
- bedouble
- یک عدد ممیز شناور ۶۴ بیتی با دقت مضاعف بر اساس IEEE با ترتیب بایت بزرگ.
- bedate
- یک مقدار چهار بایتی با ترتیب بایت بزرگ، تفسیرشده به عنوان تاریخ یونیکس.
- beqdate
- یک مقدار هشت بایتی با ترتیب بایت بزرگ، تفسیرشده به عنوان تاریخ یونیکس.
- beldate
- یک مقدار چهار بایتی با ترتیب بایت بزرگ، تفسیرشده به عنوان تاریخ یونیکس به زمان محلی به جای UTC.
- beqldate
- یک مقدار هشت بایتی با ترتیب بایت بزرگ، تفسیرشده به عنوان تاریخ یونیکس به زمان محلی به جای UTC.
- beqwdate
- یک مقدار هشت بایتی با ترتیب بایت بزرگ، تفسیرشده به عنوان تاریخ به سبک ویندوز.
- bestring16
- یک رشته یونیکد دو بایتی (UCS16) با ترتیب بایت بزرگ.
- leid3
- طول ۳۲ بیتی شناسه ID3 با ترتیب بایت کوچک (little-endian).
- leshort
- یک مقدار دو بایتی با ترتیب بایت کوچک (little-endian).
- lelong
- یک مقدار چهار بایتی با ترتیب بایت کوچک (little-endian).
- lequad
- یک مقدار هشت بایتی با ترتیب بایت کوچک (little-endian).
- lefloat
- یک عدد ممیز شناور ۳۲ بیتی با دقت یگانه بر اساس IEEE با ترتیب بایت کوچک.
- ledouble
- یک عدد ممیز شناور ۶۴ بیتی با دقت مضاعف بر اساس IEEE با ترتیب بایت کوچک.
- ledate
- یک مقدار چهار بایتی با ترتیب بایت کوچک، تفسیرشده به عنوان تاریخ یونیکس.
- leqdate
- یک مقدار هشت بایتی با ترتیب بایت کوچک، تفسیرشده به عنوان تاریخ یونیکس.
- leldate
- یک مقدار چهار بایتی با ترتیب بایت کوچک، تفسیرشده به عنوان تاریخ یونیکس به زمان محلی به جای UTC.
- leqldate
- یک مقدار هشت بایتی با ترتیب بایت کوچک، تفسیرشده به عنوان تاریخ یونیکس به زمان محلی به جای UTC.
- leqwdate
- یک مقدار هشت بایتی با ترتیب بایت کوچک، تفسیرشده به عنوان تاریخ به سبک ویندوز.
- lestring16
- یک رشته یونیکد دو بایتی (UCS16) با ترتیب بایت کوچک.
- melong
- یک مقدار چهار بایتی با ترتیب بایت میانی (middle-endian یا PDP-11).
- medate
- یک مقدار چهار بایتی با ترتیب بایت میانی (PDP-11)، تفسیرشده به عنوان تاریخ یونیکس.
- meldate
- یک مقدار چهار بایتی با ترتیب بایت میانی (PDP-11)، تفسیرشده به عنوان تاریخ یونیکس به زمان محلی به جای UTC.
- indirect
- از آفست دادهشده، مجدداً پایگاهداده جادویی را بررسی میکند. آفست الگوی indirect به طور پیشفرض در فایل مطلق است، اما میتوان با تعیین /r مشخص کرد که آفست نسبت به شروع ورودی باشد.
- name
- تعریف یک نمونه جادویی «نامگذاریشده» (named magic) که مانند یک زیرروال (subroutine) میتواند از یک ورودی جادویی use دیگر فراخوانی شود. آفستهای مستقیم نمونه نامگذاریشده نسبت به آفست ورودی تطبیقیافته قبلی سنجیده میشوند، اما آفستهای غیرمستقیم طبق معمول نسبت به ابتدای فایل هستند. ورودیهای جادویی نامگذاریشده همواره تطبیق مییابند.
- use
- فراخوانی بازگشتی الگوی نامگذاریشده از آفست فعلی. اگر نام ورودی ارجاعشده با ^ آغاز شود، ترتیب بایت (endianness) الگو معکوس میشود؛ برای مثال اگر در الگو leshort آمده باشد، مانند beshort تفسیر میگردد و برعکس. این ویژگی برای جلوگیری از تکرار قواعد برای ترتیب بایتهای گوناگون مفید است.
- regex
- تطبیق عبارت باقاعده در نحو عبارات باقاعده گسترشیافته POSIX (مشابه egrep). پردازش عبارات باقاعده میتواند زمان نمایی مصرف کند و پیشبینی کارایی آنها دشوار است، بنابراین استفاده از آنها توصیه نمیشود. در محیطهای عملیاتی باید کارایی آنها به دقت سنجیده شود. اندازه رشته مورد جستجو نیز باید با مشخص کردن /length محدود گردد تا از مشکلات کارایی هنگام پویش فایلهای طولانی جلوگیری شود. مشخصه نوع میتواند به طور اختیاری با پرچمهای /[c][s][l] دنبال شود. پرچم c تطبیق را نسبت به بزرگی و کوچکی حروف غیرحساس میکند، در حالی که پرچم s آفست را به جای انتهای تطبیق، به آفست شروع تطبیق بهروزرسانی میکند. اصلاحکننده l محدودیت طول را به جای تعداد بایت به تعداد خطوط تغییر میدهد. خطوط با جداکننده خط بومی سیستم معین میشوند. هنگامی که تعداد خط تعیین شود، یک حد بایتی ضمنی نیز با فرض ۸۰ نویسه در هر خط محاسبه میگردد. اگر هیچ تعداد بایت یا خطی تعیین نشود، جستجو به صورت خودکار به 8KiB محدود میشود. نویسههای ^ و $ به ترتیب با ابتدا و انتهای هر خط مجزا مطابقت مییابند، نه ابتدا و انتهای فایل.
- search
- جستجوی رشته متنی دقیق که از آفست دادهشده شروع میشود. همان پرچمهای اصلاحکننده الگوهای رشتهای را میتوان به کار برد. عبارت جستجو باید شامل محدوده به شکل /number باشد که بیانگر تعداد موقعیتهایی است که تطبیق از آفست اولیه در آنها آزموده خواهد شد. این گزینه برای جستجوی عبارات باینری بزرگتر با آفستهای متغیر مناسب است و از گریزهای \ برای نویسههای خاص استفاده میکند. ترتیب اصلاحکننده و عدد اهمیتی ندارد.
- default
- این مورد برای استفاده با آزمون x (که همیشه درست است) طراحی شده و نوعی ندارد. زمانی تطبیق مییابد که هیچ آزمون دیگری در آن سطح تداوم قبلاً تطبیق نیافته باشد. پاک کردن آزمونهای تطبیقیافته برای یک سطح تداوم، با آزمون clear امکانپذیر است.
- clear
- این آزمون همیشه درست است و پرچم تطبیق را برای آن سطح تداوم پاک میکند. این مورد برای استفاده به همراه آزمون default طراحی شده است.
- der
- تجزیه فایل به عنوان فایل گواهینامه 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
- یک شناسه یکتای سراسری (Globally Unique Identifier) که به صورت XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX تجزیه و چاپ میشود. قالب آن یک رشته است.
- offset
- این یک مقدار quad (هشت بایتی) است که آفست فعلی فایل را نشان میدهد. میتوان از آن برای تعیین اندازه فایل یا بافر جادویی استفاده کرد. برای مثال ورودیهای جادویی زیر:
-0 offset x this file is %lld bytes
-0 offset <=100 must be more than 100 \
bytes and is only %lld
- octal
- رشتهای که یک عدد در مبنای هشت (octal) را نشان میدهد.
برای سازگاری با استاندارد Single UNIX Standard، مشخصهکنندههای نوع 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 به عنوان آزمونهای متنی طبقهبندی میشوند، مگر اینکه از نویسههای غیرقابلچاپ در الگو استفاده شده باشد. تمام آزمونهای دیگر به عنوان باینری طبقهبندی میگردند. یک الگوی سطح بالا زمانی متنی در نظر گرفته میشود که تمامی الگوهای آن متنی باشند؛ در غیر این صورت، یک الگوی باینری محسوب خواهد شد. هنگام بررسی و تطبیق یک فایل، ابتدا الگوهای باینری آزموده میشوند؛ اگر تطبیقی یافت نشد و فایل شبیه متن بود، کدگذاری آن تعیین شده و الگوهای متنی آزموده میشوند.
نوعهای عددی میتوانند به صورت اختیاری با & و یک مقدار عددی همراه شوند تا مشخص گردد که پیش از انجام هرگونه مقایسه، مقدار مورد نظر با آن مقدار عددی AND بیتی شود. قرار دادن پیشوند u پیش از نوع داده نشان میدهد که مقایسههای ترتیبی باید به صورت بدون علامت (unsigned) انجام گیرند.
- test
- مقداری که باید با مقدار خواندهشده از فایل مقایسه شود. اگر نوع داده عددی باشد، این مقدار در فرم C مشخص میشود؛ اگر رشته باشد، به عنوان یک رشته C با مجاز بودن گریزهای متداول (مانند \n برای خط جدید) تعیین میگردد.
مقادیر عددی میتوانند با نویسهای آغاز شوند که عملگر مورد نظر را مشخص میکند:
- =
- مشخص میکند که مقدار خواندهشده از فایل باید برابر با مقدار تعیینشده باشد.
- <
- مشخص میکند که مقدار خواندهشده از فایل باید کمتر از مقدار تعیینشده باشد.
- >
- مشخص میکند که مقدار خواندهشده از فایل باید بیشتر از مقدار تعیینشده باشد.
- &
- مشخص میکند که در مقدار خواندهشده از فایل، تمام بیتهایی که در مقدار تعیینشده ۱ هستند باید ۱ (تنظیم) باشند.
- ^
- مشخص میکند که در مقدار خواندهشده از فایل، هر بیتی که در مقدار تعیینشده ۱ است باید ۰ (پاک) باشد.
- ~
- مقداری که پس از آن میآید پیش از انجام آزمون نقیض (معکوس بیتی) میشود.
- x
- هر مقداری تطبیق مییابد.
- اگر نویسه عملگر حذف شود، به صورت پیشفرض = فرض میشود. عملگرهای &، ^ و ~ روی اعداد ممیز شناور (float و double) کار نمیکنند. عملگر ! مشخص میکند که خط در صورتی تطبیق مییابد که آزمون موفقیتآمیز نباشد
مقادیر عددی در فرم C مشخص میشوند؛ برای مثال 13 دهدهی (decimal)، 013 هشتهشتی (octal)، و 0x13 شانزدهشانزدهی (hexadecimal) است.
عملیات عددی روی نوعهای تاریخ انجام نمیشود؛ در عوض مقدار عددی به عنوان یک آفست تفسیر میگردد.
برای مقادیر رشتهای، رشته درون فایل باید دقیقاً با رشته تعیینشده مطابقت داشته باشد. عملگرهای =، < و > (اما نه &) میتوانند روی رشتهها اعمال شوند. طولی که برای تطبیق استفاده میشود برابر با طول آرگومان رشته در فایل الگوی جادویی است. این بدان معناست که یک خط میتواند با هر رشته غیرخالی تطبیق یابد (که معمولاً برای چاپ آن رشته به کار میرود)، با استفاده از >\0 (زیرا تمام رشتههای غیرخالی بزرگتر از رشته خالی هستند).
تاریخها به عنوان مقادیر عددی در قالب نمایش داخلی متناظرشان پردازش میشوند.
آزمون ویژه x همیشه به عنوان درست (true) ارزیابی میشود.
- message
- پیامی که در صورت موفقیتآمیز بودن مقایسه چاپ میشود. اگر رشته حاوی مشخصه فرمت printf(3) باشد، مقدار خواندهشده از فایل (پس از اعمال هرگونه ماسک بیتی مشخصشده) با استفاده از این پیام به عنوان رشته فرمت چاپ میشود. اگر رشته با \b آغاز شود، پیام چاپشده باقیمانده رشته بدون افزودن هیچگونه فاصله سفید قبل از آن خواهد بود: به طور معمول تطبیقهای چندگانه با یک فاصله تکی از یکدیگر جدا میشوند.
مشخصه ۴+۴ نویسهای سازنده و نوع اپل (APPLE creator and type) را میتوان به صورت زیر مشخص کرد:
!:apple CREATYPE
نوع MIME در یک خط جداگانه ارائه میشود که باید نخستین خط غیرخالی یا غیرتوضیحی پس از خط magic مشخصکننده نوع فایل باشد، و دارای قالب زیر است:
!:mime MIMETYPE
یعنی رشته دقیق !:mime که به دنبال آن نوع MIME میآید.
میتوان یک قدرت (strength) اختیاری را در خطی جداگانه تعیین کرد که به توصیف جادویی فعلی اشاره دارد و از قالب زیر پیروی میکند:
!:strength OP VALUE
عملوند OP میتواند یکی از موارد +، -، * یا / باشد و VALUE یک ثابت عددی بین 0 تا 255 است. این مقدار ثابت با استفاده از عملوند مشخصشده روی قدرت پیشفرض محاسبهشده فعلی اعمال میگردد.
برخی از قالبهای فایل شامل اطلاعات بیشتری هستند که باید همراه با نوع فایل چاپ شوند، یا برای تعیین نوع واقعی فایل نیازمند آزمونهای تکمیلی هستند. این آزمونهای تکمیلی با قرار دادن یک یا چند نویسه > پیش از آفست معرفی میشوند. تعداد نویسههای > در خط، سطح آزمون را نشان میدهد؛ خطی که در ابتدا هیچ > ندارد در سطح ۰ قرار دارد. آزمونها در یک سلسلهمراتب درختی مرتب شدهاند: اگر آزمون یک خط در سطح n موفقیتآمیز باشد، تمامی آزمونهای بعدی در سطح n+1 اجرا میشوند و در صورت موفقیت آزمونها پیامهایشان چاپ میگردد، تا زمانی که خطی با سطح n (یا کمتر) پدیدار شود. برای فایلهای پیچیدهتر، میتوان از پیامهای خالی برای ایجاد اثر شرطی «اگر/آنگاه» به صورت زیر استفاده کرد:
0 string MZ >0x18 leshort <0x40 MS-DOS executable >0x18 leshort >0x3f extended PC executable (e.g., MS Windows)
آفستها نیازی نیست همواره ثابت باشند، بلکه میتوان آنها را از خود فایلی که بررسی میشود خواند. اگر نخستین نویسه پس از آخرین علامت > یک پرانتز باز ( باشد، رشته پس از پرانتز به عنوان یک آفست غیرمستقیم تفسیر میشود. این بدان معناست که عدد پس از پرانتز به عنوان یک آفست در فایل به کار میرود. مقدار موجود در آن آفست خوانده شده و دوباره به عنوان یک آفست در فایل استفاده میشود. آفستهای غیرمستقیم به شکل زیر هستند:
(( x [[.,][bBcCeEfFgGhHiIlmsSqQ]][+-][ y ])
مقدار x به عنوان یک آفست در فایل استفاده میشود. با توجه به مشخصهکننده نوع [bBcCeEfFgGhHiIlmsSqQ]، یک بایت، طول id3، مقدار short یا long در آن آفست خوانده میشود. اگر , مشخص شود مقدار به عنوان علامتدار (signed) و اگر . مشخص شود به عنوان بدون علامت (unsigned) در نظر گرفته میشود. انواع دارای حروف بزرگ، عدد را به عنوان مقداری با ترتیب بایت بزرگ (big-endian) تفسیر میکنند، در حالی که نسخههای با حروف کوچک، عدد را با ترتیب بایت کوچک (little-endian) میخوانند؛ نوع m عدد را با ترتیب بایت میانی (middle-endian یا PDP-11) تفسیر میکند. مقدار y به آن عدد افزوده شده و نتیجه به عنوان آفست نهایی در فایل به کار میرود. نوع پیشفرض در صورتی که مشخص نشود، long است. انواع زیر شناخته میشوند:
نوع (Type) عنوان (Mnemonic) ترتیب بایت (Endian) اندازه (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 m Middle Middle 4 o Octal Textual متغیر q Quad Little 8 Q Quad Big 8
به این ترتیب میتوان ساختارهایی با طول متغیر را بررسی کرد:
# فایلهای اجرایی ویندوز همچنین فایلهای اجرایی معتبر داس هستند 0 string MZ >0x18 leshort <0x40 MZ executable (MS-DOS) # اگر فایل یک اجرایی توسعهیافته نیست، کل بلوک زیر را نادیده بگیر >0x18 leshort >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 وجود داشته باشد).
اگر این آفست غیرمستقیم را نتوان مستقیماً استفاده کرد، محاسبات ساده امکانپذیر است: افزودن [+-*/%&|^]number درون پرانتز اجازه میدهد مقداری که از فایل خوانده شده است پیش از استفاده به عنوان آفست، اصلاح شود:
# فایلهای اجرایی ویندوز همچنین فایلهای اجرایی معتبر داس هستند 0 string MZ # گاهی مقدار در 0x18 کمتر از 0x40 است اما همچنان یک فایل # اجرایی توسعهیافته وجود دارد که به انتهای فایل پیوست شده است >0x18 leshort <0x40 >>(4.s*512) leshort 0x014c COFF executable (MS-DOS, DJGPP) >>(4.s*512) leshort !0x014c MZ executable (MS-DOS)
گاهی اوقات آفست دقیق را نمیدانید زیرا به طول یا موقعیت فیلدهای قبلی (هنگامی که قبلاً از حالت غیرمستقیم استفاده شده) بستگی دارد. میتوانید با استفاده از & به عنوان پیشوند آفست، یک آفست نسبی نسبت به انتهای آخرین فیلد سطح بالاتر تعیین کنید:
0 string MZ >0x18 leshort >0x3f >>(0x3c.l) string PE\0\0 PE executable (MS-Windows) # بلافاصه پس از امضای PE، نوع پردازنده قرار دارد >>>&0 leshort 0x14c for Intel 80386 >>>&0 leshort 0x184 for DEC Alpha
میتوان آفستهای غیرمستقیم و نسبی را با یکدیگر ترکیب کرد:
0 string MZ >0x18 leshort <0x40 >>(4.s*512) leshort !0x014c MZ executable (MS-DOS) # اگر COFF نبود، ۵۱۲ بایت به عقب برگرد و آفست خواندهشده # از بایت ۲ و ۳ را اضافه کن، که روش دیگری برای یافتن شروع # فایل اجرایی توسعهیافته است >>>&(2.s-514) string LE LE executable (MS Windows VxD driver)
یا برعکس:
0 string MZ >0x18 leshort >0x3f >>(0x3c.l) string LE\0\0 LE executable (MS-Windows) # در آفست 0x80 (منهای ۴، زیرا آفستهای نسبی از انتهای تطبیق # سطح بالاتر شروع میشوند) درون هدر LE، آفست مطلق به ناحیه کد # را مییابیم، جایی که به دنبال یک امضای خاص میگردیم >>>(&0x7c.l+0x26) string UPX \b, UPX compressed
یا حتی هر دو!
0 string MZ >0x18 leshort >0x3f >>(0x3c.l) string LE\0\0 LE executable (MS-Windows) # در آفست 0x58 درون هدر LE، آفست نسبی به ناحیه داده را # مییابیم که در آنجا به دنبال یک امضای مشخص میگردیم >>>&(&0x54.l-3) string UNACE \b, ACE self-extracting archive
اگر با جفتهای آفست/طول در فایل سروکار دارید، حتی مقدار دوم در یک عبارت درون پرانتز را نیز میتوان با استفاده از یک جفت پرانتز دیگر از خود فایل دریافت کرد. توجه داشته باشید که این آفست غیرمستقیم اضافی همواره نسبت به شروع آفست غیرمستقیم اصلی سنجیده میشود.
0 string MZ >0x18 leshort >0x3f >>(0x3c.l) string PE\0\0 PE executable (MS-Windows) # جستجو برای بخش PE به نام ".idata"... >>>&0xf4 search/0x140 .idata # ...و رفتن به انتهای آن، محاسبهشده از شروع + طول؛ # این مقادیر ۱۴ و ۱۰ بایت پس از نام بخش قرار دارند >>>>(&0xe.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive
اگر فهرستی از مقادیر مشخص در یک سطح تداوم خاص دارید و میخواهید یک حالت پیشفرض شبیه switch فراهم کنید:
# پاک کردن تطبیق آن سطح تداوم >18 clear >18 lelong 1 one >18 lelong 2 two >18 default x # چاپ تطبیق پیشفرض >>18 lelong x unmatched 0x%x
همچنین ببینید (SEE ALSO)
file(1) - دستوری که این فایل را میخواند.
اشکالات (BUGS)
قالبهای long، belong، lelong، melong، short، beshort و leshort به طول انواع داده C یعنی short و long در پلتفرم وابسته نیستند، اگرچه استاندارد Single UNIX Specification چنین القا میکند. با این حال، از آنجا که سیستمعامل OS X Mountain Lion آزمونهای اعتبارسنجی مجموعه Single UNIX Specification را با موفقیت گذرانده و نسخهای از دستور file(1) را ارائه میدهد که در آن این انواع به اندازههای انواع داده C وابسته نیستند و برای یک محیط ۶۴ بیتی ساخته شده که در آن long به جای ۴ بایت، ۸ بایت است، احتمالاً مجموعه اعتبارسنجی بررسی نمیکند که آیا به عنوان مثال long به عنصری با اندازه مشابه نوع داده C یعنی long اشاره دارد یا خیر. احتمالاً بهتر بود نامهای نوع به صورت int8، uint8، int16، uint16، int32، uint32، int64 و uint64 و انواع دارای ترتیب بایت مشخص برای آنها میبودند تا کاملاً مشخص باشد که این انواع داده دارای عرضهای ثابتی هستند.
| مه ۲۰۲۵ | file |