ایجاد یک نوع فایل شناخته شده سفارشی برای R-Studio. تعیین نوع فایل با امضای امضای فایل چیست

مفهوم " عدد جادویی"در برنامه نویسی سه معنی دارد:

  • امضای داده
  • انتخاب شد ارزش های منحصر به فرد، که نباید با مقادیر دیگر یکسان باشد (مانند UUID)
  • تمرین برنامه نویسی بد

امضای داده

عدد جادویی، یا امضا، - یک عدد صحیح یا ثابت متنی که برای شناسایی منحصر به فرد یک منبع یا داده استفاده می شود. چنین عددی به خودی خود هیچ معنایی ندارد و اگر در کد برنامه بدون زمینه یا نظر مناسب ظاهر شود، می تواند باعث سردرگمی شود، در حالی که تلاش برای تغییر آن به دیگری، حتی از نظر ارزش نزدیک، می تواند منجر به عواقب کاملاً غیرقابل پیش بینی شود. به همین دلیل چنین اعدادی را از قضا اعداد جادویی می نامیدند. در حال حاضر، این نام به طور محکم به عنوان یک اصطلاح تثبیت شده است. به عنوان مثال، هر کلاس زبان جاوا کامپایل شده با عدد جادویی هگزادسیمال 0xCAFEBABE شروع می شود. دومین نمونه به طور گسترده شناخته شده هر کدام است فایل اجراییسیستم عامل ویندوز مایکروسافتبا پسوند .exe با دنباله بایت 0x4D5A (که مربوط به کاراکترهای ASCII MZ - حروف اول مارک زبیکوفسکی، یکی از سازندگان MS-DOS) شروع می شود. یک مثال کمتر شناخته شده، اشاره گر بدون مقدار اولیه در Microsoft Visual C++ (از نسخه 2005 Microsoft Visual Studio) است که دارای آدرس 0xDEADBEEF در حالت اشکال زدایی است.

در یونیکس مانند سیستم های عاملنوع فایل معمولاً بدون توجه به پسوند نام آن، با امضای فایل تعیین می شود. آنها یک ابزار استاندارد فایل برای تفسیر امضای فایل ارائه می کنند.

تمرین برنامه نویسی بد

همچنین "اعداد جادویی" نامیده می شود، یک روش برنامه نویسی بد زمانی است که یک مقدار عددی در متن منبع رخ می دهد و معنی آن مشخص نیست. به عنوان مثال، قطعه ای مانند این که در جاوا نوشته شده باشد، بد خواهد بود:

drawSprite(53, 320, 240);

int نهایی SCREEN_WIDTH = 640 ; نهایی نهایی SCREEN_HEIGHT = 480 ; int نهایی SCREEN_X_CENTER = SCREEN_WIDTH / 2 ; int نهایی SCREEN_Y_CENTER = SCREEN_HEIGHT / 2 ; int نهایی SPRITE_CROSSHAIR = 53 ; ... drawSprite(SPRITE_CROSSHAIR، SCREEN_X_CENTER، SCREEN_Y_CENTER);

اکنون واضح است: این خط یک جن - خط تیره دید - را در مرکز صفحه نمایش می دهد. در اکثر زبان های برنامه نویسی، تمام مقادیر استفاده شده برای چنین ثابت هایی در زمان کامپایل محاسبه شده و در مکان هایی که مقادیر استفاده می شوند جایگزین می شوند. بنابراین، چنین تغییری در متن منبع باعث کاهش عملکرد برنامه نمی شود.

علاوه بر این، اعداد جادویی یک منبع بالقوه خطا در یک برنامه هستند:

  • اگر همان عدد جادویی بیش از یک بار در یک برنامه استفاده شود (یا به طور بالقوه می توان از آن استفاده کرد)، تغییر آن نیاز به ویرایش در هر رخداد دارد (به جای فقط یک ویرایش در مقدار ثابت نامگذاری شده). اگر همه رخدادها اصلاح نشوند، حداقل یک خطا رخ خواهد داد.
  • حداقل در یکی از موارد، عدد جادویی ممکن است در ابتدا غلط املایی داشته باشد و تشخیص آن بسیار دشوار است.
  • عدد جادویی ممکن است به یک پارامتر ضمنی یا یک عدد جادویی دیگر بستگی داشته باشد. اگر این وابستگی ها که به صراحت مشخص نشده اند، ارضا نشوند، حداقل یک خطا رخ خواهد داد.
  • هنگام تغییر رخدادهای یک عدد جادویی، ممکن است به اشتباه یک عدد جادویی دیگر را تغییر دهید که مستقل است اما مقدار عددی یکسانی دارد.

اعداد جادویی و کراس پلتفرم

گاهی اوقات اعداد جادویی به کد بین پلتفرمی آسیب می رسانند. واقعیت این است که در C، در سیستم‌عامل‌های 32 و 64 بیتی، اندازه انواع char، short و long تضمین شده است، در حالی که اندازه int، long، size_t و ptrdiff_t می‌تواند تغییر کند (برای دو مورد اول، بسته به ترجیحات توسعه دهندگان کامپایلر، برای دو مورد آخر - بسته به ظرفیت بیت سیستم هدف). در کدهای قدیمی یا ضعیف، ممکن است "اعداد جادویی" وجود داشته باشد که اندازه یک نوع را نشان می دهد - هنگام حرکت به ماشین هایی با ظرفیت بیت متفاوت، ممکن است منجر به خطاهای ظریف شود.

مثلا:

const size_t NUMBER_OF_ELEMENTS = 10 ; طولانی [NUMBER_OF_ELEMENTS]؛ memset(a, 0, 10 * 4); // نادرست - طولانی 4 بایت فرض می شود، تعداد عناصر جادویی استفاده می شود memset(a, 0, NUMBER_OF_ELEMENTS * 4); // نادرست - طولانی 4 بایت در نظر گرفته شده است memset(a, 0, NUMBER_OF_ELEMENTS * sizeof(long)); // کاملاً صحیح نیست - تکرار نام نوع (در صورت تغییر نوع، باید آن را در اینجا نیز تغییر دهید) memset (a , 0 , NUMBER_OF_ELEMENTS * sizeof (a [ 0 ])); // صحیح، بهینه برای آرایه های پویا با اندازه غیر صفر memset(a, 0, sizeof(a)); // صحیح، بهینه برای آرایه های استاتیک

اعدادی که جادو نیستند

لازم نیست همه اعداد به ثابت تبدیل شوند. به عنوان مثال، کد برای

جستجو با اسکن انواع فایل های شناخته شده (یا همانطور که اغلب گفته می شود جستجوی فایل ها با امضا) یکی از موثرترین موارد مورد استفاده در ابزار بازیابی اطلاعات R-Studio است. در مواردی که اطلاعات مربوط به ساختار دایرکتوری و نام فایل ها به طور جزئی یا کامل وجود ندارد (آسیب دیده است) استفاده از یک امضای مشخص به شما امکان می دهد فایل هایی از نوع خاصی را بازیابی کنید.

معمولاً از جدول پارتیشن دیسک برای تعیین محل فایل ها استفاده می شود. اگر یک دیسک را با یک کتاب مقایسه کنید، جدول پارتیشن مشابه فهرست مطالب آن خواهد بود. هنگام اسکن، R-Studio انواع فایل های شناخته شده را در جدول پارتیشن دیسک با استفاده از امضاهای مشخص شده جستجو می کند. این امر با این واقعیت امکان پذیر می شود که تقریباً هر نوع فایل دارای یک امضا یا الگوی داده منحصر به فرد است. امضای فایل در یک مکان خاص در ابتدای پرونده و در بسیاری از موارد نیز در انتهای پرونده یافت می شود. هنگام اسکن، R-Studio داده های یافت شده را با امضاهای انواع فایل های شناخته شده مطابقت می دهد، که به آنها امکان شناسایی و بازیابی داده های آنها را می دهد.

با استفاده از فناوری برای اسکن انواع فایل های شناخته شده، R-Studio به شما امکان می دهد تا داده ها را از دیسک هایی که دوباره فرمت شده اند و جداول پارتیشن آنها رونویسی شده اند، بازیابی کنید. علاوه بر این، اگر یک پارتیشن دیسک بازنویسی، آسیب دیده یا حذف شود، اسکن انواع فایل های شناخته شده تنها گزینه است.

اما تقریباً همه چیز دارای اشکالاتی است و انواع فایل های شناخته شده مورد استفاده در R-Studio نیز از این قاعده مستثنی نیستند. بنابراین، هنگام اسکن انواع فایل های شناخته شده، R-Studio به شما امکان می دهد فقط فایل های تکه تکه نشده را بازیابی کنید، اما، همانطور که قبلا ذکر شد، در بیشتر موارد این آخرین روش ممکن است.

R-Studio قبلاً شامل امضاهای رایج ترین انواع فایل (نمایش لیست کاملفایل‌های انواع شناخته شده را می‌توانید در بخش راهنمای آنلاین R-Studio پیدا کنید.)

در صورت لزوم، کاربر می تواند انواع فایل های جدید را به R-Studio اضافه کند. برای مثال، اگر نیاز به یافتن فایل‌هایی از نوع منحصربه‌فرد دارید، یا فایل‌هایی که پس از آخرین تاریخ انتشار R-Studio ایجاد شده‌اند، می‌توانید امضاهای خود را به فایل‌های انواع شناخته شده اضافه کنید. این روند در ادامه مورد بحث قرار خواهد گرفت.

فایل های سفارشی از انواع شناخته شده
امضاهای فایل سفارشی انواع فایل های شناخته شده در آن ذخیره می شوند فایل XML e در کادر گفتگوی تنظیمات مشخص شده است. اضافه کردن امضا شامل دو بخش است:

  1. تعیین امضای پرونده در ابتدای پرونده و در صورت وجود در انتهای پرونده.
  2. یک فایل XML حاوی امضای فایل و سایر اطلاعات مربوط به نوع فایل ایجاد کنید.

همه اینها را می توان با استفاده از R-Studio انجام داد. در عین حال، لازم نیست در زمینه نوشتن (ویرایش) اسناد XML یا در زمینه ویرایش هگزادسیمال متخصص باشید - در این راهنما (مقاله) که هدف آن خود کاربر است. سطح ورودی، تمام مراحل این فرآیند به تفصیل مورد بحث قرار خواهد گرفت.

مثال: اضافه کردن یک امضا برای یک فایل MP4 (کدک XDCam-EX)
بیایید به اضافه کردن یک امضای فایل با استفاده از مثال یک فایل MP4. ایجاد شده با Sony XDCAM-EX نگاه کنیم. به عنوان مثال، در صورت آسیب به کارت SD برای فایل هایی که هنوز موفق به ذخیره آنها در هارد دیسک رایانه خود نشده اید، می توانید از آن استفاده کنید.

مرحله اول: تعیین امضای فایل
برای تعیین امضای فایل، نمونه هایی از فایل های هم فرم را در نظر بگیرید.

بگذارید این چهار فایل ویدیویی از Sony XDCAM-EX باشد:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

برای سهولت در نظر گرفتن، بگذارید این فایل‌های کوچک باشند. مشاهده فایل های بزرگتر در هگزادسیمال دشوارتر است.

1. فایل ها را در R-Studio باز کنید. برای انجام این کار، روی هر فایل کلیک راست کرده و از منوی زمینه گزینه View/Edit را انتخاب کنید.

2. بیایید فایل ها را با هم مقایسه کنیم. ما به دنبال همان الگوی موجود در هر چهار فایل خواهیم بود. او ظاهر خواهد شد امضای فایل. به طور معمول، امضای فایل در ابتدای فایل یافت می شود، اما گاهی اوقات در انتهای آن.

3. امضای فایل را در ابتدای فایل تعریف کنید. در مثال ما، در همان ابتدای فایل قرار دارد. توجه داشته باشید که همیشه این اتفاق نمی افتد - اغلب امضای فایل در ابتدای فایل است، اما نه در خط اول (افست).

از تصاویر زیر به نظر می رسد که محتویات هر چهار فایل متفاوت است، اما همه آنها با یک امضای فایل شروع می شوند.


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید

ناحیه برجسته شده در تصاویر یک امضای فایل است از این نوعفایل ها. به دو صورت متنی و هگزادسیمال ارائه شده است.

در فرم متن، امضای فایل به شکل زیر است:
....ftypmp42....mp42.........رایگان

نقطه (.") نشان دهنده کاراکترهایی است که نمی توانند به صورت متن نمایش داده شوند. بنابراین، ارائه فرم هگزادسیمال امضای فایل نیز ضروری است:
00 00 00 18 66 74 79 6D 70 34 32 00 00 00 00 6D 70 34 32 00 00 00 00 00 00 00 00 08 66 72 65 65

4. به همین ترتیب، امضای فایل را تعریف می کنیم، اما در انتهای فایل. ممکن است یک امضای فایل متفاوت، با طول متفاوت باشد.

تصاویر زیر امضای فایل در انتهای فایل را برجسته می کند:


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید

لطفا توجه داشته باشید که داده های قبل از ناحیه انتخاب شده (امضای فایل) در هر چهار فایل یکسان است. این اطلاعات فنی است که امضای فایل نیست، اما نشان می دهد که هر چهار عکس (فایل) با استفاده از یک دوربین با پارامترهای یکسان گرفته شده اند. معمولاً می توان الگوهای تطبیق با اطلاعات فنی را از امضای فایل تشخیص داد. در مثال ما، در آخرین خط قبل از شروع امضای فایل، متن "RecordingMode type="normal" را می بینیم که به وضوح نشان می دهد که این نوعی پارامتر فایل است و نه یک امضا. همیشه به این خط توجه ویژه ای داشته باشید تا به اشتباه وارد نشود اطلاعات فنیبخشی از امضای فایل

در مورد ما، امضای فایل متن زیر است:
...
به شما یادآوری می کنیم که نقاط نشان دهنده کاراکترهایی هستند که نمی توانند به صورت متن نمایش داده شوند.

در هگزادسیمال، امضای فایل به شکل زیر است:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
لطفا توجه داشته باشید: امضا همیشه در انتهای پرونده نخواهد بود.

مرحله دوم: ایجاد یک فایل XML که یک نوع فایل شناخته شده را توصیف می کند
اکنون با تعریف امضای فایل، می توانید یک فایل XML ایجاد کنید و نوع فایل مربوطه را در R-Studio قرار دهید. این میتواند با دو راه انجام شود:

2.1 استفاده از داخلی ویرایشگر گرافیکیامضای فایل:
مورد Settings را از منوی Tools انتخاب کنید، در کادر گفتگوی Settings که باز می شود، روی زبانه Known Files Types کلیک کنید و سپس روی دکمه Edit User’s File Types کلیک کنید.

برای بزرگنمایی روی تصویر کلیک کنید

روی دکمه ایجاد نوع فایل در کادر محاوره ای ویرایش انواع فایل کاربر کلیک کنید.
گزینه های زیر را تنظیم کنید:

  • شناسه - یک شناسه دیجیتال منحصر به فرد. این شمارهبه صورت تصادفی انتخاب خواهد شد؛ تنها نکته این است که نباید با شناسه دیجیتال هر نوع فایل دیگری مطابقت داشته باشد.
  • توضیحات گروه - گروهی که فایل های یافت شده در R-Studio در آن قرار دارند. شما می توانید هر دو را تنظیم کنید گروه جدید، یا یکی از موارد موجود را انتخاب کنید. برای ما این گروه "ویدئو چند رسانه ای (چند رسانه ای: ویدئو)" خواهد بود.
  • شرح - توضیح کوتاهنوع فایل. در مثال ما، می توانید برای مثال از "Sony cam video, XDCam-EX" استفاده کنید.
  • پسوند - پسوند فایل هایی از این نوع. در مورد ما - mp4.

پارامتر Features اختیاری است، در مورد ما نیازی به استفاده از آن نداریم.

برای بزرگنمایی روی تصویر کلیک کنید

در مرحله بعد، باید امضای فایل شروع و پایان را وارد کنید. برای این کار گزینه Begin و سپس را انتخاب کنید منوی زمینهدستور Add Signature

برای بزرگنمایی روی تصویر کلیک کنید

سپس روی فیلد دوبار کلیک کنید<пустая сигнатура> () و متن مناسب را وارد کنید.

برای بزرگنمایی روی تصویر کلیک کنید

سپس امضای نهایی فایل را ایجاد کنید. در ستون From حتما عدد 21 را وارد کنید.

برای بزرگنمایی روی تصویر کلیک کنید

شما با موفقیت امضای خود را برای انواع فایل های شناخته شده ایجاد کرده اید.

حالا باید آن را ذخیره کنید. دو راه وجود دارد: می توانید با کلیک بر روی دکمه ذخیره، آن را در فایل پیش فرض مشخص شده در برگه اصلی کادر گفتگوی تنظیمات ذخیره کنید. یا روی دکمه Save As... کلیک کنید و امضا را در فایل دیگری ذخیره کنید.

2.2 ایجاد دستی یک فایل XML که یک نوع فایل شناخته شده را توصیف می کند:
برای ایجاد این فایلبیایید از XML نسخه 1.0 و رمزگذاری UTF-8 استفاده کنیم. اگر نمی دانید چیست ناامید نشوید - فقط کافی است هر کدام را باز کنید ویرایشگر متن(به عنوان مثال Notepad.exe) و متن زیر را در خط اول وارد کنید:

سپس یک تگ XML ایجاد می کنیم که نوع فایل (FileType) را مشخص می کند. با در نظر گرفتن ویژگی های XML که قبلاً توضیح داده شد، تگ به شکل زیر خواهد بود:

بیایید آن را بلافاصله بعد از آن وارد کنیم

در مرحله بعد، امضای فایل (برچسب ). امضای اولیه (در ابتدای فایل) داخل تگ خواهد بود بدون هیچ ویژگی ما از نوع متن امضا استفاده می کنیم، اما در عین حال جایگزین نویسه های هگزادسیمال می شویم که نمی توانند به صورت متن نمایش داده شوند. قبل از هر کاراکتر هگزادسیمال "\x" را وارد می کنیم بنابراین تگ با امضای فایل به شکل زیر خواهد بود:

در صورت وجود، باید امضای پایانی را نیز (در انتهای فایل) تعریف کنید. این از همان تگ استفاده می کند، اما با یک عنصر "از" و یک ویژگی "پایان". شبیه این خواهد شد:

به یاد داشته باشید که امضای فایل نهایی حاوی کاراکترهای غیر متنی نبود، اما حاوی خطوط اسلش و مثلث بود. برای جلوگیری از سردرگمی و خطا در نحو XML، کاراکترهای "/" را در امضا جایگزین می کنیم.<" и ">مقادیر هگزادسیمال آنها.

در پایان، پس از امضای فایل، باید تگ های بسته شدن FileType و FileTypeList وجود داشته باشد:

بنابراین کل فایل باید به شکل زیر باشد:


\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42\x00\x00\x00\x00\x00\x00\x00\x08رایگان
\x3C\x2FNonRealTimeMeta\x3E\x0D\x0A\x00

به یاد داشته باشید: نحو XML به حروف بزرگ و کوچک حساس است، بنابراین تگ صحیح خواهد بود ، اما نه .

بیایید فایل را با فرمت متنی با پسوند xml ذخیره کنیم. به عنوان مثال: SonyCam.xml.

ما با موفقیت امضای خود را برای انواع فایل های شناخته شده ایجاد کرده ایم. این مثال برای درک اصول اولیه ایجاد یک نوع فایل سفارشی کاملاً کافی است. کاربران با تجربه تر می توانند از XML نسخه 2.0 استفاده کنند. می‌توانید در بخش راهنمای آنلاین R-Studio اطلاعات بیشتری در این مورد بخوانید.

مرحله 3: بررسی و افزودن یک فایل با توصیف یک نوع فایل شناخته شده
مرحله بعدی اضافه کردن (آپلود) فایل XML خود به R-Studio است. در این صورت به صورت خودکار بررسی می شود.

اجازه دهید فایل XML ایجاد شده در مرحله قبل را در R-Studio بارگذاری کنیم. برای انجام این کار، مورد تنظیمات را در منوی ابزار انتخاب کنید. در قسمت User’s file type ها در برگه Main کادر گفتگوی تنظیمات، فایل XML را که ایجاد کردیم (SonyCam.xml) اضافه کنید. روی دکمه Apply کلیک کنید.

برای بزرگنمایی روی تصویر کلیک کنید

2. به درخواست دانلود یک نوع فایل جدید پاسخ مثبت دهید.

برای بزرگنمایی روی تصویر کلیک کنید

3. برای تأیید اینکه نوع فایل با موفقیت بارگذاری شده است، بر روی زبانه Known File Types در کادر گفتگوی تنظیمات کلیک کنید. به یاد داشته باشید که ما نوع فایل را به گروه Multimedia Video (Multimedia: Video) اضافه کردیم. پس از گسترش این گروه (پوشه)، باید عنصری را با توضیحاتی که هنگام ایجاد فایل XML مشخص کردیم مشاهده کنیم: Sony cam video، XDCam-EX (.mp4).

برای بزرگنمایی روی تصویر کلیک کنید


برای بزرگنمایی روی تصویر کلیک کنید

اگر خطایی در نحو فایل وجود داشته باشد، پیام مربوطه را مشاهده خواهید کرد:

برای بزرگنمایی روی تصویر کلیک کنید

در این مورد، فایل XML خود را دوباره برای خطا بررسی کنید. به یاد داشته باشید: سینتکس XML به حروف بزرگ و کوچک حساس است و هر تگ باید یک تگ بسته در پایان داشته باشد.

مرحله 4: آزمایش فایل با توصیف یک نوع فایل شناخته شده
برای بررسی صحت نوع فایل سفارشی که ایجاد کردیم، بیایید سعی کنیم فایل‌های mp4 خود را در یک درایو فلش USB قابل جابجایی پیدا کنیم.

1. در ویندوز ویستا یا ویندوز 7، قالب‌بندی کامل (نه سریع) دیسک را انجام دهید یا از ابزار تمیز کردن فضای دیسک (مثلاً R-Wipe & Clean) استفاده کنید. حذف کاملتمام داده های موجود روی دیسک اجازه دهید دیسک USBفرمت شده در FAT32 (اندازه فایل های جستجو شده از 2 گیگابایت تجاوز نمی کند).

2. بیایید آن را کپی کنیم فایل های تستبه دیسک و راه اندازی مجدد کامپیوتر به طوری که محتویات حافظه کش روی دیسک ذخیره شود. همچنین می توانید غیرفعال کنید درایو خارجیو سپس آن را دوباره وصل کنید.

3. در سیستم عامل، درایو به عنوان مثال، درایو منطقی F:\ تعریف می شود.

4. بیایید R-Studio را راه اندازی کنیم. درایو ما (F:\) را انتخاب کنید و روی دکمه Scan کلیک کنید

برای بزرگنمایی روی تصویر کلیک کنید

5. در کادر محاوره ای Scan، در قسمت (File System) روی دکمه Change... کلیک کنید و تیک تمام کادرها را بردارید. به این ترتیب جستجوی سیستم های فایل و فایل ها را با استفاده از جدول پارتیشن غیرفعال می کنیم.
برای بزرگنمایی روی تصویر کلیک کنید

6. چک باکس Extra Search for Known File Types را علامت بزنید. این به R-Studio اجازه می دهد تا در هنگام اسکن انواع فایل های شناخته شده را جستجو کند.

7. برای شروع اسکن، روی دکمه Scan کلیک کنید.

8. صبر کنیم تا R-Studio دیسک را اسکن کند. تب اطلاعات اسکن پیشرفت (پیشرفت) اسکن را نمایش می دهد.


برای بزرگنمایی روی تصویر کلیک کنید

9. پس از اتمام اسکن، عنصر Extra Found Files را انتخاب کرده و روی آن دوبار کلیک کنید.


برای بزرگنمایی روی تصویر کلیک کنید

10. فایل های آزمایشی ما در فولدر XDCam-EX ویدیوی سونی (یا در پوشه ای با نام دیگری مطابق با توضیحات نوع فایل مشخص شده در مرحله دوم) قرار خواهند گرفت.


برای بزرگنمایی روی تصویر کلیک کنید

می بینید که نام فایل ها، تاریخ ها و مکان ها (پوشه ها) بازیابی نشدند زیرا این اطلاعاتدر سیستم فایل ذخیره می شود. بنابراین، R-Studio به طور خودکار هر فایل را با یک نام جدید نمایش می دهد.

اما واضح است که محتویات فایل ها آسیبی ندیده است. برای تأیید این موضوع، اجازه دهید آنها را در برنامه مناسب باز کنیم، به عنوان مثال پخش کننده رسانه VLC.


برای بزرگنمایی روی تصویر کلیک کنید

نتیجه
توانایی R-Studio برای اسکن انواع فایل های شناخته شده به شما امکان می دهد تا داده ها را حتی از دیسکی که سیستم فایل آن بازنویسی شده است بازیابی کنید. شما می‌توانید با استفاده از امضای آن‌ها، فایل‌ها را کاملاً مؤثر جستجو کنید، که مخصوصاً اگر دقیقاً نوع فایل‌های در حال بازیابی را بدانید، مانند مثال ما، مفید است. توانایی ایجاد انواع فایل های سفارشی به شما این امکان را می دهد که هر فایلی را که دارای امضای فایل خاصی است به لیست انواع فایل های شناخته شده اضافه کنید.

شاید خیلی ها نام فایل هایی مانند rarjpeg را شنیده باشند. این یک نوع خاص از فایل است که یک تصویر jpeg و یک آرشیو rar است که از نزدیک به هم چسبانده شده اند. این یک ظرف عالی برای مخفی کردن واقعیت انتقال اطلاعات است. شما می توانید با استفاده از یک rarjpeg ایجاد کنید. دستورات زیر:

یونیکس: cat image1.jpg archive.rar > image2.jpg
پنجره ها: کپی /b image1.jpg+archive.rar image2.jpg

یا اگر ویرایشگر هگز دارید.

البته، برای پنهان کردن واقعیت انتقال اطلاعات، می توانید نه تنها از فرمت JPEG، بلکه از بسیاری دیگر نیز استفاده کنید. هر قالب ویژگی های خاص خود را دارد که به همین دلیل ممکن است برای نقش ظرف مناسب باشد یا نباشد. من توضیح خواهم داد که چگونه می توانید فایل های چسبانده شده را در محبوب ترین فرمت ها پیدا کنید یا واقعیت چسباندن را نشان دهید.

روش های تشخیص فایل های ادغام شده را می توان به سه گروه تقسیم کرد:

  1. روش بررسی ناحیه بعد از نشانگر EOF. بسیاری از فرمت های محبوب فایل دارای یک نشانگر به اصطلاح پایان فایل هستند که وظیفه نمایش داده های مورد نظر را بر عهده دارد. برای مثال، بینندگان عکس تمام بایت‌ها را تا این نشانگر می‌خوانند، اما ناحیه بعد از آن نادیده گرفته می‌شود. این روش برای فرمت های زیر ایده آل است: JPEG، PNG، GIF، ZIP، RAR، PDF.
  2. روش بررسی اندازه فایل ساختار برخی از فرمت ها (ظروف صوتی و تصویری) به شما امکان می دهد اندازه واقعی فایل را محاسبه کرده و آن را با اندازه اصلی مقایسه کنید. فرمت ها: AVI، WAV، MP4، MOV.
  3. روش بررسی فایل های CFB CFB یا Compound File Binary Format یک فرمت سند است که توسط مایکروسافت ایجاد شده است که یک ظرف با سیستم فایل خاص خود است. این روش بر اساس تشخیص ناهنجاری ها در یک فایل است.

آیا پس از پایان یک پرونده حیات وجود دارد؟

JPEG

برای یافتن پاسخ این سوال، لازم است مشخصات قالب را که "جد" فایل های ادغام شده است، بررسی کنیم و ساختار آن را درک کنیم. هر JPEG با امضای 0xFF 0xD8 شروع می شود.

بعد از این امضا، اطلاعات سرویس، به صورت اختیاری یک نماد تصویر و در نهایت، خود تصویر فشرده وجود دارد. در این فرمت انتهای تصویر با امضای دو بایتی 0xFF 0xD9 مشخص می شود.

PNG

هشت بایت اول فایل PNG توسط امضای زیر اشغال می شود: 0x89، 0x50، 0x4E، 0x47، 0x0D، 0x0A، 0x1A، 0x0A. امضای پایانی که به جریان داده پایان می‌دهد: 0x49، 0x45، 0x4E، 0x44، 0xAE، 0x42، 0x60، 0x82.

RAR

امضای مشترک برای همه آرشیوهای rar: 0x52 0x61 0x72 0x21 (Rar!). پس از آن اطلاعاتی در مورد نسخه آرشیو و سایر داده های مرتبط می آید. به طور تجربی مشخص شد که بایگانی با امضای 0x0A، 0x25، 0x25، 0x45، 0x4F، 0x46 به پایان می رسد.

جدول فرمت ها و امضای آنها:
الگوریتم بررسی چسباندن در این قالب ها بسیار ساده است:

  1. امضای اولیه را پیدا کنید.
  2. امضای نهایی را پیدا کنید.
  3. اگر پس از امضای نهایی هیچ داده ای وجود نداشته باشد، فایل شما تمیز است و حاوی پیوست نیست! در غیر این صورت لازم است پس از امضای نهایی به دنبال فرمت های دیگر باشید.

GIF و PDF

یک سند PDF ممکن است بیش از یک نشانگر EOF داشته باشد، برای مثال به دلیل تولید نادرست سند. تعداد امضاهای نهایی در یک فایل GIF برابر با تعداد فریم های موجود در آن است. بر اساس ویژگی های این فرمت ها، امکان بهبود الگوریتم بررسی وجود فایل های پیوست شده وجود دارد.
  1. نقطه 1 از الگوریتم قبلی تکرار می شود.
  2. نقطه 2 از الگوریتم قبلی تکرار شده است.
  3. وقتی امضای نهایی را پیدا کردید، مکان آن را به خاطر بسپارید و بیشتر نگاه کنید.
  4. اگر از این طریق به آخرین نشانگر EOF برسید، فایل تمیز است.
  5. اگر فایل به امضای پایانی ختم نشود، goto محل آخرین امضای پایان یافت شده است.
تفاوت زیاد بین اندازه فایل و موقعیت پس از آخرین امضای پایانی نشان دهنده وجود یک پیوست چسبنده است. تفاوت می تواند بیش از ده بایت باشد، اگرچه مقادیر دیگری را می توان تنظیم کرد.

ZIP

ویژگی آرشیو ZIP وجود سه امضای مختلف است: ساختار آرشیو به شرح زیر است:
سربرگ فایل محلی 1
داده های فایل 1
توصیفگر داده 1
سربرگ فایل محلی 2
داده های فایل 2
توصیفگر داده 2
...
سربرگ فایل محلی
فایل داده n
توصیفگر داده n
هدر رمزگشایی بایگانی
رکورد داده های اضافی را بایگانی کنید
دایرکتوری مرکزی
جالب ترین دایرکتوری مرکزی است که حاوی ابرداده در مورد فایل های موجود در آرشیو است. دایرکتوری مرکزی همیشه با امضای 0x50 0x4b 0x01 0x02 شروع می شود و با امضای 0x50 0x4b 0x05 0x06 پایان می یابد و به دنبال آن 18 بایت ابرداده به پایان می رسد. جالب اینجاست که آرشیوهای خالی فقط از امضای نهایی و 18 صفر بایت تشکیل شده است. پس از 18 بایت، ناحیه نظرات بایگانی می آید که یک ظرف ایده آل برای مخفی کردن فایل است.

برای بررسی یک آرشیو ZIP، باید امضای پایانی دایرکتوری مرکزی را پیدا کنید، 18 بایت را رد کنید و امضاهای فرمت های شناخته شده را در قسمت نظرات جستجو کنید. سایز بزرگکامنت نیز حاکی از واقعیت چسباندن است.

مسائل اندازه

AVI

ساختار یک فایل AVI به شرح زیر است: هر فایل با امضای RIFF (0x52 0x49 0x46 0x46) شروع می شود. در بایت 8 یک امضای AVI وجود دارد که فرمت را مشخص می کند (0x41 0x56 0x49 0x20). بلوک در افست 4، متشکل از 4 بایت، شامل اندازه اولیه بلوک داده است (ترتیب بایت - اندیان کوچک). برای پیدا کردن شماره بلوک حاوی اندازه بعدی، باید اندازه سرصفحه (8 بایت) و اندازه به دست آمده در بلوک 4-8 بایت را اضافه کنید. این اندازه کل فایل را محاسبه می کند. قابل قبول است که اندازه محاسبه شده ممکن است کوچکتر از اندازه واقعی فایل باشد. پس از اندازه محاسبه شده، فایل فقط حاوی صفر بایت خواهد بود (برای تراز کردن مرز 1 کیلوبایت لازم است).

نمونه ای از محاسبه اندازه:


WAV

مانند AVI، یک فایل WAV با امضای RIFF شروع می شود، با این حال، این فایل دارای امضای از بایت 8 - WAVE (0x57 0x41 0x56 0x45) است. اندازه فایل به همان روش AVI محاسبه می شود. اندازه واقعی باید کاملاً با اندازه محاسبه شده مطابقت داشته باشد.

MP4

MP4 یا MPEG-4 یک فرمت محفظه رسانه ای است که برای ذخیره جریان های ویدیویی و صوتی استفاده می شود و همچنین برای ذخیره سازی زیرنویس ها و تصاویر استفاده می شود.
در آفست 4 بایت، امضاهایی وجود دارد: نوع فایل ftyp (66 74 79 70) (نوع فایل ظرف QuickTime) و نوع فرعی فایل mmp4 (6D 6D 70 34). برای شناخت فایل های مخفی، ما به توانایی محاسبه اندازه فایل علاقه مند هستیم.

بیایید به یک مثال نگاه کنیم. اندازه بلوک اول در آفست صفر است و 28 (00 00 00 1C، ترتیب بایت Big Endian) است. همچنین نشان دهنده افست جایی است که اندازه بلوک داده دوم در آن قرار دارد. در آفست 28، اندازه بلوک بعدی برابر با 8 (00 00 00 08) است. برای پیدا کردن اندازه بلوک بعدی، باید اندازه بلوک های قبلی پیدا شده را اضافه کنید. بنابراین، اندازه فایل محاسبه می شود:

MOV

این فرمت پرکاربرد نیز یک ظرف MPEG-4 است. MOV از یک الگوریتم فشرده سازی داده اختصاصی استفاده می کند، ساختاری مشابه MP4 دارد و برای اهداف مشابه - برای ذخیره داده های صوتی و تصویری و همچنین مواد مرتبط استفاده می شود.
مانند MP4، هر فایل mov دارای امضای ftyp 4 بایتی در افست 4 است، با این حال، امضای بعدی مقدار qt__ (71 74 20 20) را دارد. قانون محاسبه اندازه فایل تغییر نکرده است: با شروع از ابتدای فایل، اندازه بلوک بعدی را محاسبه کرده و آن را جمع می کنیم.

روش بررسی این گروه از فرمت ها برای وجود فایل های "چسبنده" به این صورت است که اندازه را طبق قوانین مشخص شده در بالا محاسبه کرده و با اندازه فایل مورد بررسی مقایسه کنید. اگر اندازه فایل فعلی بسیار کوچکتر از اندازه محاسبه شده باشد، این نشان دهنده واقعیت چسباندن است. هنگام بررسی فایل های AVI، پذیرفته شده است که اندازه محاسبه شده ممکن است کوچکتر از اندازه فایل باشد به دلیل وجود صفرهای اضافه شده برای تراز کردن حاشیه. در این صورت لازم است صفرها را بعد از حجم فایل محاسبه شده بررسی کنید.

بررسی فرمت باینری فایل مرکب

این فرمت فایل که توسط مایکروسافت توسعه یافته است، با نام های OLE (Object Linking and Embedding) یا COM (Component Object Model) نیز شناخته می شود. فایل های DOC, XLS, PPT متعلق به گروه فرمت های CFB هستند.

یک فایل CFB شامل یک هدر 512 بایتی و بخش هایی با طول مساوی است که جریان های داده یا اطلاعات سرویس را ذخیره می کند. هر بخش شماره غیر منفی خود را دارد، به استثنای اعداد خاص: "-1" - شماره بخش آزاد، "-2" - شماره بخشی که زنجیره را بسته است. تمام زنجیره های سکتور در جدول FAT تعریف شده اند.

بیایید فرض کنیم که یک مهاجم یک فایل .doc خاص را تغییر داده و فایل دیگری را در انتهای آن قرار داده است. مقدار کمی وجود دارد به طرق مختلفآن را شناسایی کنید یا یک ناهنجاری را در سند نشان دهید.

اندازه فایل غیر طبیعی

همانطور که در بالا ذکر شد، هر فایل CFB از یک هدر و بخش هایی با طول مساوی تشکیل شده است. برای پی بردن به اندازه سکتور، باید یک عدد دو بایتی در افست 30 را از ابتدای فایل بخوانید و عدد 2 را به توان این عدد ببرید. این عدد باید به ترتیب برابر با 9 (0x0009) یا 12 (0x000C) باشد، اندازه بخش فایل 512 یا 4096 بایت است. پس از یافتن بخش، باید برابری زیر را بررسی کنید:

(FileSize - 512) mod SectorSize = 0

اگر این برابری برآورده نشد، می توانید به واقعیت چسباندن پرونده ها اشاره کنید. با این حال، این روش دارای یک نقص قابل توجه است. اگر یک مهاجم اندازه بخش را بداند، فقط باید فایل خود و n بایت دیگر را جایگذاری کند تا اندازه داده های چسبانده شده مضربی از اندازه بخش باشد.

نوع بخش ناشناخته

اگر مهاجم از روشی برای دور زدن بررسی قبلی اطلاع داشته باشد، پس این روشمی تواند وجود بخش هایی با انواع نامشخص را تشخیص دهد.

بیایید برابری را تعریف کنیم:

FileSize = 512 + CountReal * SectorSize، که در آن FileSize اندازه فایل است، SectorSize اندازه بخش است، CountReal تعداد بخش ها است.

همچنین متغیرهای زیر را تعریف می کنیم:

  1. CountFat – تعداد بخش های چربی. در افست 44 از ابتدای فایل (4 بایت) قرار دارد.
  2. CountMiniFAT – تعداد بخش های MiniFAT. در افست 64 از ابتدای فایل (4 بایت) قرار دارد.
  3. CountDIFAT - تعداد بخش های DIFAT. در افست 72 از ابتدای فایل (4 بایت) قرار دارد.
  4. CountDE - تعداد بخش‌های ورودی فهرست. برای یافتن این متغیر، باید اولین بخش DE را پیدا کنید که در آفست 48 است. سپس لازم است که یک نمایش کامل از DE از FAT بدست آوریم و تعداد بخش های DE را بشماریم.
  5. CountStreams – تعداد بخش‌های دارای جریان داده.
  6. CountFree – تعداد بخش های رایگان؛
  7. CountClassified – تعداد بخش ها با نوع خاصی.
CountClassified = CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

بدیهی است که اگر CountClassified و CountReal نابرابر باشند، می‌توان نتیجه گرفت که فایل‌ها ممکن است ادغام شوند.

رئیسم کار نسبتاً جالبی به من داد. در مدت زمان کوتاهی، یک تحلیلگر فایل اجرایی بنویسید که بتواند بدنه های ویروس را بر اساس امضاها پیدا کند و بسته بندی/رمزگر مورد استفاده را تعیین کند. نمونه اولیه نهایی ظرف چند ساعت ظاهر شد.

حرف نویسنده

تجزیه و تحلیل امضا

جستجوی یک شی مخرب با استفاده از امضاها کاری است که هر آنتی ویروسی می تواند انجام دهد. به طور کلی، امضا یک توصیف رسمی از ویژگی های خاص است که با آن می توان تشخیص داد که فایل مورد اسکن یک ویروس و یک ویروس کاملاً تعریف شده است.

در اینجا تکنیک های مختلفی وجود دارد. یک جایگزین استفاده از امضای متشکل از N بایت یک شی مخرب است. در این مورد، شما می توانید یک مقایسه احمقانه نیست، بلکه یک مقایسه با استفاده از یک ماسک خاص انجام دهید (مانند جستجوی بایت EB ?? ?? CD 13). یا شرایط اضافی مانند "فلان بایت باید در نقطه ورود به برنامه باشد" و غیره را تنظیم کنید. امضای بدافزار موضوع خاصی است.

به همین ترتیب، برخی از نشانه‌ها توصیف می‌شوند که با استفاده از آنها می‌توان تشخیص داد که فایل اجرایی با یک رمزارز یا بسته‌کننده دیگر (به عنوان مثال، ASPack پیش پا افتاده) بسته شده است. اگر مجله ما را به دقت مطالعه کرده باشید، مطمئناً در مورد ابزاری مانند PEiD شنیده اید که قادر به شناسایی متداول ترین بسته کننده ها، رمزگذارها و کامپایلرها (پایگاه داده دارای تعداد زیادی امضا است) برای فایل PE منتقل شده به آن است. . افسوس که نسخه های جدید این برنامه مدت زیادی است که منتشر نشده است و اخیراً پیامی در وب سایت رسمی منتشر شده مبنی بر اینکه این پروژه توسعه بیشتری نخواهد داشت. حیف شد، چون قابلیت های PEiD (مخصوصاً با توجه به سیستم افزونه) می تواند برای من بسیار مفید باشد. پس از یک تحلیل کوتاه، مشخص شد که این یک گزینه نیست. اما پس از جستجو در وبلاگ های انگلیسی زبان، به سرعت آنچه را که برایم مناسب بود پیدا کردم. پروژه YARA (code.google.com/p/yara-project).

YARA چیست؟

از همان ابتدا، من متقاعد شده بودم که در جایی در اینترنت یک توسعه منبع باز وجود دارد که وظیفه تعیین مطابقت بین یک امضای خاص و پرونده مورد بررسی را بر عهده می گیرد. اگر من می توانستم چنین پروژه ای را پیدا کنم، می توان آن را به راحتی در ریل یک برنامه وب قرار داد، امضاهای مختلفی را در آنجا اضافه کرد و آنچه را که از من می خواست دریافت کرد. وقتی شرح پروژه YARA را خواندم، طرح حتی واقعی تر به نظر می رسید.

خود توسعه دهندگان آن را به عنوان ابزاری برای کمک به محققان بدافزار در شناسایی و طبقه بندی نمونه های مخرب قرار می دهند. محقق می تواند توصیفاتی برای انواع متفاوتبدافزار با استفاده از الگوهای متنی یا باینری که ویژگی های رسمی بدافزار را توصیف می کند. امضاها به این صورت است. در واقع، هر توصیف شامل مجموعه‌ای از خطوط و برخی بیان‌های منطقی است که بر اساس آن منطق آغازگر تحلیلگر تعیین می‌شود.

در صورت داشتن شرایط یکی از قوانین برای فایل مورد بررسی، بر اساس آن تعیین می شود (مثلاً فلان کرم). یک مثال ساده از یک قانون برای درک آنچه در مورد آن صحبت می کنیم:

rule silent_banker: بانکدار
{
متا:
توضیحات = "این فقط یک مثال است"
thread_level = 3
in_the_wild = درست است
رشته های:
$a = (6A 40 68 00 30 00 00 6A 14 8D 91)
$b = (8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9)
$c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
وضعیت:
$a یا $b یا $c
}

در این قانون به YARA می گوییم که هر فایلی که حاوی حداقل یکی از رشته های نمونه توصیف شده در متغیرهای $a, $b, $c باشد باید به عنوان یک تروجان silent_banker طبقه بندی شود. و این یک قانون بسیار ساده است. در واقعیت، قوانین می توانند بسیار پیچیده تر باشند (در زیر در مورد این صحبت خواهیم کرد).
حتی لیست پروژه هایی که از آن استفاده می کنند، در مورد اقتدار پروژه YARA صحبت می کند و این عبارت است از:

  • VirusTotal Malware Intelligence Services (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org)؛
  • ما وب سایت شما را تماشا می کنیم (wewatchyourwebsite.com).

همه کدها در پایتون نوشته شده اند و به کاربر هم خود ماژول برای استفاده در توسعه آنها و هم به سادگی یک فایل اجرایی برای استفاده از YARA به عنوان یک برنامه مستقل ارائه می شود. به عنوان بخشی از کارم، گزینه اول را انتخاب کردم، اما برای سادگی در این مقاله به سادگی از تحلیلگر به عنوان یک برنامه کنسول استفاده می کنیم.

پس از کمی حفاری، به سرعت متوجه شدم که چگونه قوانین YARA را بنویسم، و همچنین چگونه امضاهای ویروس را از نرم افزار رایگان و بسته کننده های PEiD را به آن وصل کنم. اما ما با نصب شروع می کنیم.

نصب و راه اندازی

همانطور که قبلاً گفتم، این پروژه با پایتون نوشته شده است، بنابراین می توان آن را به راحتی بر روی لینوکس، ویندوز و مک نصب کرد. در ابتدا، شما فقط می توانید باینری را بگیرید. اگر برنامه را در کنسول فراخوانی کنیم، قوانین راه اندازی را دریافت خواهیم کرد.

$yara
استفاده: yara ... ... FILE | PID

یعنی فرمت فراخوانی برنامه به شرح زیر است: ابتدا نام برنامه وجود دارد، سپس لیستی از گزینه ها، پس از آن فایل با قوانین مشخص می شود، و در انتها - نام فایل موجود است. بررسی شده (یا دایرکتوری حاوی فایل ها)، یا شناسه فرآیند. اکنون می خواهم به خوبی توضیح دهم که این قوانین چگونه ترسیم می شوند، اما نمی خواهم فوراً شما را با تئوری خشک تحمیل کنم. بنابراین، ما کارها را متفاوت انجام می دهیم و امضای افراد دیگر را قرض می گیریم تا YARA بتواند یکی از وظایفی را که تعیین کرده ایم انجام دهد - شناسایی کامل ویروس ها توسط امضاها.

آنتی ویروس خودت

مهمترین سوال: پایگاه داده امضای ویروس های شناخته شده را از کجا می توان دریافت کرد؟ شرکت های آنتی ویروس به طور فعال چنین پایگاه های داده ای را بین خود به اشتراک می گذارند (برخی سخاوتمندانه تر، برخی دیگر کمتر). صادقانه بگویم، در ابتدا حتی شک داشتم که در جایی در اینترنت کسی آشکارا چنین چیزهایی را پست کند. اما، همانطور که معلوم شد، افراد خوبی وجود دارند. یک پایگاه داده مناسب از آنتی ویروس محبوب ClamAV در دسترس همه است (clamav.net/lang/en). در بخش "آخرین نسخه پایدار" می توانید پیوندی به آن پیدا کنید آخرین نسخهمحصول آنتی ویروس و همچنین لینک های دانلود پایگاه داده ویروس ClamAV. ما در درجه اول به فایل های main.cvd (db.local.clamav.net/main.cvd) و daily.cvd (db.local.clamav.net/daily.cvd) علاقه مند خواهیم بود.

اولی شامل پایگاه داده اصلی امضاها، دومی شامل کامل ترین پایگاه داده است این لحظهپایه با اضافات مختلف Daily.cvd که حاوی بیش از 100000 نمایش بدافزار است، برای این منظور کاملاً کافی است. با این حال، پایگاه داده ClamAV یک پایگاه داده YARA نیست، بنابراین باید آن را به فرمت مورد نظر تبدیل کنیم. اما چگونه؟ از این گذشته، ما هنوز چیزی در مورد فرمت ClamAV یا فرمت Yara نمی دانیم. این مشکل قبلاً با تهیه یک اسکریپت کوچک که پایگاه داده امضای ویروس ClamAV را به مجموعه ای از قوانین YARA تبدیل می کند، برطرف شده است. این فیلمنامه clamav_to_yara.py نام دارد و توسط متیو ریچارد (bit.ly/ij5HVs) نوشته شده است. اسکریپت را دانلود کنید و پایگاه های داده را تبدیل کنید:

$ python clamav_to_yara.py -f daily.cvd -o clamav.yara

در نتیجه در فایل clamav.yara یک پایگاه داده امضایی دریافت می کنیم که بلافاصله آماده استفاده خواهد بود. بیایید اکنون ترکیب YARA و پایگاه داده ClamAV را در عمل امتحان کنیم. اسکن یک پوشه با استفاده از امضا تنها با یک دستور انجام می شود:

$ yara -r clamav.yara /pentest/msf3/data

گزینه -r مشخص می کند که اسکن باید به صورت بازگشتی در تمام زیر پوشه های پوشه فعلی انجام شود. اگر بدنه ویروسی در پوشه /pentest/msf3/data (حداقل آنهایی که در پایگاه داده ClamAV هستند) وجود داشته باشد، YARA فوراً این را گزارش خواهد کرد. در اصل، این یک اسکنر امضای آماده است. برای راحتی بیشتر، یک اسکریپت ساده نوشتم که به‌روزرسانی‌های پایگاه داده ClamAV را بررسی می‌کرد، امضاهای جدید را دانلود می‌کرد و آنها را به فرمت YARA تبدیل می‌کرد. اما اینها قبلاً جزئیات هستند. یک قسمت از کار تکمیل شده است، اکنون می توانید قوانینی را برای شناسایی بسته بندی کننده ها/رمزگذاران شروع کنید. اما برای انجام این کار مجبور شدم کمی با آنها کنار بیایم.

طبق قوانین بازی کنید

بنابراین، یک قانون مکانیسم اصلی یک برنامه است که به شما امکان می دهد یک فایل داده شده را به یک دسته خاص اختصاص دهید. قوانین در یک فایل (یا فایل) جداگانه توضیح داده شده اند و از نظر ظاهری بسیار شبیه ساختار ()struct از زبان C/C++ هستند.

حکومت بد پسر
{
رشته های:
$a = "win.exe"
$b = "http://foo.com/badfi le1.exe"
$c = "http://bar.com/badfi le2.exe"
وضعیت:
$a و ($b یا $c)
}

اصولاً در نوشتن قوانین هیچ چیز پیچیده ای وجود ندارد. در این مقاله فقط به نکات اصلی پرداختم و جزئیات را در دفترچه راهنما خواهید یافت. در حال حاضر ده نکته مهم:

1. هر قانون با قانون کلمه کلیدی شروع می شود و به دنبال آن شناسه قانون قرار می گیرد. شناسه ها می توانند نام متغیرها را در C/C++ داشته باشند، یعنی می توانند از حروف و اعداد تشکیل شده باشند و کاراکتر اول نمی تواند یک عدد باشد. حداکثر طولنام شناسه - 128 کاراکتر.

2. به طور معمول، قوانین از دو بخش تشکیل شده است: یک بخش تعریف (رشته ها) و یک بخش شرط (شرط). بخش رشته ها داده هایی را مشخص می کند که بر اساس آن بخش شرط تصمیم می گیرد که آیا یک فایل معین شرایط خاصی را برآورده می کند یا خیر.

3. هر خط در بخش رشته ها شناسه مخصوص به خود را دارد که با علامت $ شروع می شود - به طور کلی، مانند یک اعلان متغیر در PHP. YARA از رشته های معمولی محصور در آن پشتیبانی می کند نقل قول های دوگانه("") و رشته های هگزادسیمال محصور در بریس ها(())، و همچنین عبارات منظم:

$my_text_string = "نوشتن در اینجا"
$my_hex_string = ( E2 34 A1 C8 23 FB )

4. بخش شرط شامل تمام منطق قانون است. این بخش باید حاوی یک عبارت Boolean باشد که تعیین می کند چه زمانی یک فایل یا فرآیند با قانون مطابقت دارد. به طور معمول، این بخش به خطوط قبلاً اعلام شده اشاره دارد. و شناسه رشته به‌عنوان یک متغیر بولی در نظر گرفته می‌شود که اگر رشته در فایل یا حافظه پردازش یافت شود true و در غیر این صورت false برمی‌گرداند. قانون بالا مشخص می کند که فایل ها و فرآیندهای حاوی رشته win.exe و یکی از دو URL باید به عنوان BadBoy (با نام قانون) طبقه بندی شوند.

5. رشته های هگزادسیمال سه ساختار را امکان پذیر می کند که آنها را انعطاف پذیرتر می کند: حروف عام، پرش و جایگزین. جانشین ها مکان هایی در یک رشته هستند که ناشناخته هستند و می توانند با هر مقداری جایگزین شوند. آنها با نماد "؟" نشان داده می شوند:

$hex_string = ( E2 34 ?? C8 A? FB )

این رویکرد هنگام تعیین رشته هایی که طول آنها مشخص است بسیار راحت است، اما محتوا ممکن است متفاوت باشد. اگر بخشی از یک رشته می تواند طول های متفاوتی داشته باشد، استفاده از محدوده ها راحت است:

$hex_string = ( F4 23 62 B4 )

این ورودی به این معنی است که در وسط خط می تواند از 4 تا 6 بایت مختلف وجود داشته باشد. شما همچنین می توانید یک انتخاب جایگزین را اجرا کنید:

$hex_string = ( F4 23 (62 B4 | 56) 45 )

این بدان معنی است که به جای بایت سوم می تواند 62 B4 یا 56 وجود داشته باشد، چنین ورودی مربوط به خطوط F42362B445 یا F4235645 است.

6. برای بررسی اینکه یک رشته داده شده در یک آفست خاص در فضای آدرس فایل یا فرآیند قرار دارد، از عملگر at استفاده می شود:

$a در 100 و $b در 200

اگر رشته می تواند در محدوده آدرس خاصی باشد، عملگر in استفاده می شود:

$a اینچ (0..100) و $b در (100..fi lesize)

گاهی اوقات موقعیت‌هایی پیش می‌آید که باید مشخص کنید که یک فایل باید شامل تعداد معینی از یک مجموعه باشد. با استفاده از عملگر of انجام می شود:

قانون Example1
{
رشته های:
$foo1 = "دوم1"
$foo2 = "Dummy2"
$foo3 = "dummy3"
وضعیت:
2 از ($foo1,$foo2,$foo3)
}

قانون فوق مستلزم آن است که فایل حاوی هر دو خط از مجموعه باشد ($foo1,$foo2,$foo3). به جای تعیین تعداد مشخصی از خطوط در فایل، می توانید از متغیرهای any (حداقل یک خط از یک مجموعه معین) و همه (همه خطوط از یک مجموعه معین) استفاده کنید.

7. خوب، آخرین امکان جالبی که باید در نظر گرفته شود، اعمال یک شرط برای چندین ردیف است. این ویژگی بسیار شبیه به عملگر of است، تنها عملگر for..of قدرتمندتر است:

برای بیان string_set: (بیان_بولی)

این ورودی باید به این صورت خوانده شود: از رشته های مشخص شده در مجموعه string_، حداقل قطعات عبارت باید شرایط boolean_expression را برآورده کنند. یا به عبارت دیگر: boolean_expression برای هر رشته در string_set ارزیابی می شود و عبارات آنها باید True را برگردانند. در ادامه با استفاده از یک مثال خاص به این ساختار نگاه خواهیم کرد.

ساخت PEiD

بنابراین، وقتی همه چیز با قوانین کم و بیش روشن شد، می‌توانیم شروع به پیاده‌سازی آشکارساز بسته‌کننده‌ها و رمزگذارها در پروژه خود کنیم. در ابتدا، به عنوان منبع منبع، امضای بسته‌بندان معروف را از همان PEiD قرض گرفتم. در پوشه پلاگین ها یک فایل userdb.txt وجود دارد که شامل موارد مورد نیاز ما است. 1850 امضا در پایگاه داده من وجود داشت.

بسیار زیاد است، بنابراین برای اینکه آنها را به طور کامل وارد کنید، به شما توصیه می کنم که نوعی اسکریپت بنویسید. قالب این پایگاه داده ساده است - از قالب معمول استفاده می شود فایل متنی، که رکوردهایی مانند:


امضا = 50 E8 ?? ?? ?? ?? 58 25 ?? F0 FF FF 8B C8 83 C1 60 51 83 C0 40 83 EA 06 52 FF 20 9D C3
ep_only = درست است

خط اول نام بسته بندی را مشخص می کند که در PEiD نمایش داده می شود، اما برای ما شناسه قانون خواهد بود. دومی خود امضاست. سومین پرچم ep_only است که نشان می دهد آیا باید یک خط معین را فقط در آدرس نقطه ورودی جستجو کنید یا در کل فایل.

خب، بیایید سعی کنیم یک قانون مثلاً برای ASPack ایجاد کنیم؟ همانطور که مشخص است، هیچ چیز پیچیده ای در این مورد وجود ندارد. ابتدا بیایید یک فایل برای ذخیره قوانین ایجاد کنیم و آن را به عنوان مثال packers.yara بنامیم. سپس در پایگاه داده PEiD همه امضاهایی را که شامل ASPack در نام آنها هستند جستجو می کنیم و آنها را به قانون منتقل می کنیم:

قانون ASPack
{
رشته های:
$ = ( 60 E8 ?? ?? ?? ?? 5D 81 ED ?? ?? (43 | 44) ?? B8 ?? ?? (43 | 44) ?? 03 C5 )
$ = ( 60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? E9 )
[.. برش..]
$ = ( 60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01 )
وضعیت:
برای هر یک از آنها: ($ در نقطه ورود)
}

همه رکوردهای یافت شده دارای پرچم ep_only روی true هستند، یعنی این خطوط باید در آدرس نقطه ورودی قرار گیرند. بنابراین، شرط زیر را می نویسیم: "برای هر یک از آنها: ($at entrypoint)".

بنابراین، وجود حداقل یکی از خطوط داده شده در آدرس نقطه ورودی به این معنی است که فایل با ASPack بسته بندی شده است. لطفاً توجه داشته باشید که در این قانون تمام خطوط به سادگی با استفاده از علامت $ و بدون شناسه مشخص می شوند. این امکان پذیر است زیرا در بخش شرط به موارد خاصی دسترسی نداریم، اما از کل مجموعه استفاده می کنیم.

برای بررسی عملکرد سیستم به دست آمده، فقط دستور را در کنسول اجرا کنید:

$ yara -r packers.yara somefi le.exe

با تغذیه چند برنامه بسته بندی شده با ASPack در آنجا، متقاعد شدم که همه چیز کار می کند!

نمونه اولیه آماده

معلوم شد YARA یک ابزار بسیار واضح و شفاف است. نوشتن یک وب مین برای آن و تنظیم آن به عنوان یک وب سرویس برای من سخت نبود. با کمی خلاقیت، نتایج خشک آنالایزر از قبل با رنگ های مختلف رنگ آمیزی شده اند که نشان دهنده میزان خطر بدافزار شناسایی شده است. یک به روز رسانی کوچک از پایگاه داده، و برای بسیاری از رمزگذارها، یک توضیح کوتاه در دسترس است، و گاهی اوقات حتی دستورالعمل های باز کردن بسته بندی. نمونه اولیه ساخته شده است و کاملاً کار می کند و رئیس ها از خوشحالی می رقصند!

کد تابع (FC) در هدر تلگرام نوع تلگرام را مشخص می کند، مانند Request telegram (Request or Send/Request) و Acknowledgment یا Response telegram (Acknowledgement frame, Response frame). علاوه بر این، کد عملکرد حاوی عملکرد انتقال واقعی و اطلاعات کنترلی است که از گم شدن و تکرار پیام ها جلوگیری می کند، یا نوع ایستگاه با وضعیت FDL.

7 6 5 4 3 2 1 0 FC: درخواست کد تابع
1 درخواست تلگرام
ایکس FCV = بیت متناوب روشن است
ایکس href=”http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit”>FCB = بیت متناوب (از تعداد فریم)
1 0 (0x0) CV = Clock Value()
1 دیگر رزرو شده است
0 0 (0x0) TE = رویداد زمان (همگام سازی ساعت)
0 3 (0x3) SDA_LOW = ارسال داده تایید شده - اولویت پایین
0 4 (0x4) SDN_LOW = ارسال داده تایید نشد - اولویت پایین
0 5 (0x5) SDA_HIGH = ارسال داده تایید شده - اولویت بالا
0 6 (0x6) SDN_HIGH = ارسال داده تایید نشد
0 7 (0x7) MSRD = ارسال درخواست داده با پاسخ چندپخشی
0 9 (0x9) درخواست وضعیت FDL
0 12 (0xC) SRD کم = ارسال و درخواست داده
0 13 (0xD) SRD high = ارسال و درخواست داده
0 14 (0xE) درخواست شناسایی با پاسخ
0 15 (0xF) درخواست وضعیت LSAP با پاسخ 1)
0 دیگر رزرو شده است

1) این مقدار در آخرین نسخه استاندارد است که دیگر تعریف نشده بلکه فقط رزرو شده است

7 6 5 4 3 2 1 0 FC: پاسخ کد تابع
0 پاسخ تلگرام
0 رزرو شده است
0 0 برده
0 1 استاد آماده نیست
1 0 استاد آماده، بدون نشانه
1 1 استاد آماده، در حلقه نشانه
0 (0x0) خوب
1 (0x1) UE = خطای کاربر
2 (0x2) RR = بدون منابع
3 (0x3) RS = SAP فعال نیست
8 (0x8) DL = داده کم (مورد عادی با DP)
9 (0x9) NR = هیچ داده پاسخی آماده نیست
10 (0xA) DH = داده بالا (تشخیص DP در انتظار)
12 (0xC) RDL = داده دریافت نشده و داده کم است
13 (0xD) RDH = داده دریافت نشده و داده زیاد است
دیگر رزرو شده است

بیت شمارش فریم بیت شمارش فریم FCB (b5) از تکرار پیام توسط ایستگاه تایید کننده یا پاسخ دهنده (پاسخ دهنده) و از دست دادن ایستگاه تماس گیرنده (آغازگر) جلوگیری می کند. درخواست‌های بدون تأیید (SDN) و درخواست‌های وضعیت FDL، Ident و وضعیت LSAP از این امر مستثنی می‌شوند.

برای دنباله امنیتی، آغازگر باید یک FCB برای هر پاسخ دهنده داشته باشد. هنگامی که یک تلگرام درخواستی (درخواست یا ارسال/درخواست) برای اولین بار به یک پاسخ دهنده ارسال می شود، یا اگر مجدداً به پاسخ دهنده ای ارسال می شود که در حال حاضر به عنوان غیرعملیاتی علامت گذاری شده است، FCB باید همانطور که در پاسخ دهنده تعریف شده است تنظیم شود. آغازگر در تلگرام Request با FCV=0 و FCB=1 به این امر دست می یابد. پاسخ دهنده باید تلگرامی از این نوع را به عنوان اولین چرخه پیام ارزیابی کند و FCB=1 را همراه با آدرس آغازگر (SA) ذخیره کند (جدول زیر را ببینید). این چرخه پیام توسط آغازگر تکرار نخواهد شد. در درخواست‌های بعدی تلگرام به همان پاسخ‌دهنده، آغازگر باید FCV=1 را تنظیم کند و FCB را با هر درخواست جدید تلگرام تغییر دهد. هر پاسخ‌دهنده‌ای که تلگرام درخواستی را با FCV=1 دریافت می‌کند، باید FCB را ارزیابی کند. اگر FCB در مقایسه با آخرین درخواست تلگرام از همان آغازگر (همان SA) تغییر کرده باشد، این تأیید معتبری است که چرخه پیام قبلی به درستی به پایان رسیده است. اگر درخواست تلگرام از یک آغازگر دیگر (SA متفاوت) منشأ گرفته باشد، ارزیابی FCB دیگر ضروری نیست. در هر دو مورد، پاسخ دهنده باید FCB را با منبع SA ذخیره کند تا زمانی که تلگرام جدیدی به آن خطاب شود. در صورت گم شدن یا اختلال در تلگراف تأیید یا پاسخ، FCB نباید توسط آغازگر در تلاش مجدد درخواست تغییر کند: این نشان می دهد که چرخه پیام قبلی معیوب بوده است. اگر پاسخ دهنده یک تلگرام درخواست با FCV=1 و همان FCB آخرین تلگرام درخواست از همان آغازگر (همان SA) دریافت کند، این نشان دهنده یک درخواست مجدد است. پاسخ دهنده باید به نوبه خود تلگراف تأیید یا پاسخی را که در آماده بودن نگه داشته است، مجدداً ارسال کند. تا زمان تایید یا دریافت تلگرامی با آدرس دیگر (SA یا DA) که تایید نشده است (Send Data with No Acknowledge, SDN) در بالا، پاسخ دهنده باید آخرین تلگراف تایید یا پاسخ را در آمادگی برای هرگونه درخواست احتمالی برای تلاش مجدد نگه دارد. . در مورد تلگرام های درخواستی که تایید نشده و با وضعیت درخواست FDL، Ident و وضعیت LSAP، FCV=0 و FCB=0؛ ارزیابی توسط پاسخ دهنده دیگر ضروری نیست.

b5 b4 موقعیت بیت
FCB FCV وضعیت معنی عمل
0 0 DA = TS/127 درخواست بدون تایید
درخواست وضعیت FDL/Ident/وضعیت LSAP
آخرین تاییدیه را حذف کنید
0/1 0/1 DA#TS درخواست از پاسخ دهنده دیگر
1 0 DA = TS درخواست اول FCBM: = 1
سام: = SA
آخرین تأیید / پاسخ را حذف کنید
0/1 1 DA = TS
SA = SAM
FCB#FCBM
درخواست جدید آخرین تأیید / پاسخ را حذف کنید
FCBM:=FCB
تأیید / پاسخ را در آمادگی برای تلاش مجدد نگه دارید
0/1 1 DA = TS
SA = SAM
FCB = FCBM
درخواست مجدد را امتحان کنید FCBM:=FCB
تأیید / پاسخ را تکرار کنید و در آمادگی ادامه دهید
0/1 1 DA = TS
SA#SAM
آغازگر جدید FCBM:=FCB
SAM:= SA تأیید / پاسخ را در آمادگی برای تلاش مجدد نگه دارید

FCBM FCB را در حافظه ذخیره کرد SAM SA را در حافظه ذخیره کرد




بالا