R-Studio üçün xüsusi tanınan fayl növünün yaradılması. İmza ilə fayl növünün müəyyən edilməsi Fayl imzası nədir

Konsepsiya " Sehrli nömrə"proqramlaşdırmada üç məna var:

  • Məlumat imzası
  • Seçildi unikal dəyərlər, digər dəyərlərlə eyni olmamalıdır (məsələn, UUID)
  • Səhv proqramlaşdırma təcrübəsi.

Məlumat imzası

Sehrli nömrə, və ya imza, - resursu və ya verilənləri unikal şəkildə müəyyən etmək üçün istifadə edilən tam ədəd və ya mətn sabiti. Belə bir nömrənin özlüyündə heç bir mənası yoxdur və proqram kodunda müvafiq kontekst və ya şərh olmadan görünsə, çaşqınlıq yarada bilər, halbuki onu digərinə, hətta dəyərinə yaxın birinə dəyişdirmək cəhdi tamamilə gözlənilməz nəticələrə səbəb ola bilər. Bu səbəbdən belə rəqəmlərə istehza ilə sehrli rəqəmlər deyirdilər. Hal-hazırda bu ad bir termin kimi möhkəm şəkildə qurulmuşdur. Məsələn, hər hansı tərtib edilmiş Java dili sinfi onaltılıq "sehrli nömrə" 0xCAFEBABE ilə başlayır. İkinci geniş məlum nümunə hər hansıdır icra edilə bilən faylƏS Microsoft Windows.exe uzantısı ilə 0x4D5A bayt ardıcıllığı ilə başlayır (bu, MZ ASCII simvollarına - MS-DOS-un yaradıcılarından biri olan Mark Zbikovskinin baş hərflərinə uyğundur). Daha az tanınan nümunə, debug rejimində 0xDEADBEEF ünvanına malik olan Microsoft Visual C++ proqramında (Microsoft Visual Studio-nun 2005-ci il versiyasından bəri) işə salınmamış göstəricidir.

UNIX kimi əməliyyat sistemləri Fayl tipi adətən adının genişlənməsindən asılı olmayaraq fayl imzası ilə müəyyən edilir. Onlar fayl imzasını şərh etmək üçün standart fayl yardım proqramı təqdim edirlər.

Səhv proqramlaşdırma təcrübəsi

“Sehrli nömrələr” də adlanır, mənbə mətndə rəqəmsal dəyər baş verdikdə və bunun nə demək olduğu aydın olmayanda pis proqramlaşdırma təcrübəsidir. Məsələn, Java-da yazılmış bu kimi bir parça pis olardı:

drawSprite(53, 320, 240);

son int SCREEN_WIDTH = 640; son int SCREEN_HEIGHT = 480; final int SCREEN_X_CENTER = SCREEN_WIDTH / 2; final int SCREEN_Y_CENTER = SCREEN_HEIGHT / 2 ; yekun int SPRITE_CROSSHAIR = 53; ... drawSprite(SPRITE_CROSSHAIR, SCREEN_X_CENTER, SCREEN_Y_CENTER);

İndi aydındır: bu xətt ekranın mərkəzində bir sprite - mənzərənin çarpaz işarəsini göstərir. Əksər proqramlaşdırma dillərində bu cür sabitlər üçün istifadə olunan bütün dəyərlər kompilyasiya zamanı hesablanacaq və dəyərlərin istifadə olunduğu yerlərə əvəz olunacaq. Buna görə də mənbə mətnində belə bir dəyişiklik proqramın işini pisləşdirmir.

Bundan əlavə, sehrli nömrələr proqramda potensial səhv mənbəyidir:

  • Əgər eyni sehrli nömrə bir proqramda bir dəfədən çox istifadə edilərsə (və ya potensial olaraq istifadə oluna bilər), onda onun dəyişdirilməsi hər bir hadisəyə (adlandırılmış sabitin dəyərinə bir redaktə əvəzinə) düzəlişlər tələb edəcəkdir. Bütün hadisələr düzəldilməzsə, ən azı bir səhv baş verəcəkdir.
  • Baş verənlərin ən azı birində sehrli nömrə başlanğıcda səhv yazıla bilər və bunu aşkar etmək olduqca çətindir.
  • Sehrli nömrə gizli parametrdən və ya başqa sehrli nömrədən asılı ola bilər. Əgər açıq şəkildə müəyyən edilməmiş bu asılılıqlar təmin edilməzsə, ən azı bir səhv baş verəcəkdir.
  • Bir sehrli nömrənin baş verməsini dəyişdirərkən, müstəqil, lakin eyni ədədi dəyərə malik olan başqa bir sehrli nömrəni səhvən dəyişdirmək mümkündür.

Sehrli nömrələr və çarpaz platforma

Bəzən sehrli nömrələr çarpaz platforma koduna zərər verir. Fakt budur ki, C-də 32 və 64 bitlik əməliyyat sistemlərində char , short və long long növlərinin ölçüsünə zəmanət verilir, int , long , size_t və ptrdiff_t ölçüsü dəyişə bilər (ilk ikisi üçün, kompilyator tərtibatçılarının üstünlüklərindən asılı olaraq , son ikisi üçün - hədəf sistemin bit tutumundan asılı olaraq). Köhnə və ya zəif yazılmış kodda növün ölçüsünü göstərən "sehrli nömrələr" ola bilər - fərqli bit tutumu olan maşınlara keçərkən onlar incə səhvlərə səbəb ola bilər.

Misal üçün:

const size_t NUMBER_OF_ELEMENTS = 10 ; uzun [NUMBER_OF_ELEMENTS]; memset(a, 0, 10 * 4); // yanlış - uzun 4 bayt qəbul edilir, elementlərin sehrli sayı istifadə olunur memset(a, 0, NUMBER_OF_ELEMENTS * 4); // yanlış - uzun 4 bayt olduğu qəbul edilir memset(a, 0, NUMBER_OF_ELEMENTS * sizeof(uzun)); // tamamilə düzgün deyil - növün adının təkrarlanması (növ dəyişirsə, onu burada da dəyişməli olacaqsınız) memset (a , 0 , NUMBER_OF_ELEMENTS * sizeof (a [ 0 ])); // düzgün, sıfır olmayan ölçülü dinamik massivlər üçün optimaldır memset(a, 0, sizeof(a)); // düzgün, statik massivlər üçün optimaldır

Sehrli olmayan nömrələr

Bütün ədədləri sabitlərə çevirmək lazım deyil. Məsələn, kodu

Məlum növ faylları skan edərək axtarış (və ya tez-tez deyildiyi kimi, faylları imza ilə axtarın) R-Studio məlumat bərpa proqramında istifadə olunan ən təsirli olanlardan biridir. Verilmiş imzadan istifadə kataloq strukturu və fayl adları haqqında məlumatların qismən və ya tamamilə çatışmadığı (zədələnmiş) hallarda müəyyən tipli faylları bərpa etməyə imkan verir.

Tipik olaraq, faylların yerini müəyyən etmək üçün disk bölmələri cədvəlindən istifadə olunur. Diski kitabla müqayisə etsəniz, bölmə cədvəli onun məzmun cədvəlinə bənzəyəcək. Skan edərkən, R-Studio müəyyən edilmiş imzalardan istifadə edərək disk bölmələri cədvəlində məlum fayl növlərini axtarır. Bu, faktiki olaraq hər bir fayl növünün unikal imza və ya məlumat nümunəsinə malik olması ilə mümkün olur. Fayl imzaları faylın əvvəlində və bir çox hallarda faylın sonunda da müəyyən bir yerdə tapılır. Skan edərkən, R-Studio tapılmış məlumatları məlum fayl növlərinin imzaları ilə uyğunlaşdırır ki, bu da onları müəyyən etməyə və onların məlumatlarını bərpa etməyə imkan verir.

Məlum fayl növlərinin skan edilməsi texnologiyasından istifadə edərək, R-Studio sizə yenidən formatlanmış və bölmə cədvəlləri üzərinə yazılmış disklərdən məlumatları bərpa etməyə imkan verir. Üstəlik, disk bölməsi üzərinə yazılmış, zədələnmiş və ya silinmişsə, məlum fayl növlərini skan etmək yeganə seçimdir.

Ancaq demək olar ki, hər şeyin çatışmazlıqları var və R-Studio-da istifadə olunan məlum fayl növləri istisna deyil. Beləliklə, məlum fayl növlərini skan edərkən, R-Studio yalnız fraqmentləşməmiş faylları bərpa etməyə imkan verir, lakin artıq qeyd edildiyi kimi, əksər hallarda bu, mümkün olan ən son üsuldur.

R-Studio artıq ən çox yayılmış fayl növlərinin imzalarını ehtiva edir (görünüş tam siyahı məlum tipli fayllar R-Studio Online Yardım bölməsində tapıla bilər.)

Lazım gələrsə, istifadəçi R-Studio-ya yeni fayl növləri əlavə edə bilər. Məsələn, unikal tipli faylları və ya R-Studio-nun son buraxılış tarixindən sonra işlənmiş faylları tapmaq lazımdırsa, məlum tipli fayllara öz imzalarınızı əlavə edə bilərsiniz. Bu proses bundan sonra müzakirə olunacaq.

Məlum Növlərin Xüsusi Faylları
Məlum fayl növlərinin xüsusi fayl imzaları saxlanılır XML faylı e Parametrlər dialoq qutusunda göstərilmişdir. İmza əlavə etmək iki hissədən ibarətdir:

  1. Faylın əvvəlində və əgər varsa, faylın sonunda yerləşən fayl imzasının müəyyən edilməsi.
  2. Fayl imzası və fayl növü haqqında digər məlumatları ehtiva edən XML faylı yaradın.

Bütün bunlar R-Studio istifadə edərək edilə bilər. Eyni zamanda, istifadəçinin özünə yönəlmiş bu təlimatda (məqalədə) XML sənədlərinin tərtibi (redaktəsi) və ya onaltılıq redaktə sahəsində mütəxəssis olmağa ehtiyac yoxdur. Giriş səviyyəsi, bu prosesin bütün mərhələləri ətraflı müzakirə olunacaq.

Nümunə: MP4 faylı üçün imza əlavə etmək (XDCam-EX Codec)
Sony XDCAM-EX istifadə edərək yaradılmış .MP4 faylı nümunəsindən istifadə edərək fayl imzasının əlavə edilməsinə baxaq. Siz, məsələn, kompüterinizin sabit diskində hələ saxlaya bilmədiyiniz fayllar üçün SD kartın zədələnməsi halında istifadə edə bilərsiniz.

Birinci Mərhələ: Fayl İmzasının Müəyyən edilməsi
Fayl imzasını müəyyən etmək üçün eyni formatlı faylların nümunələrini nəzərdən keçirin.

Bunlar Sony XDCAM-EX-dən dörd video fayl olsun:
ZRV-3364_01.MP4
ZRV-3365_01.MP4
ZRV-3366_01.MP4
ZRV-3367_01.MP4

Baxış asanlığı üçün bunlar kiçik fayllar olsun. Daha böyük faylları onaltılıq sistemdə görmək daha çətindir.

1. Faylları R-Studio-da açın. Bunu etmək üçün hər bir faylın üzərinə sağ klikləyin və kontekst menyusundan View/Edit seçin.

2. Faylları müqayisə edək. Biz bütün dörd faylda olan eyni nümunəni axtaracağıq. O görünəcək fayl imzası. Tipik olaraq, fayl imzaları faylın əvvəlində, lakin bəzən sonunda olur.

3. Faylın əvvəlində fayl imzasını təyin edin. Bizim nümunəmizdə o, faylın ən əvvəlində yerləşir. Qeyd edək ki, bu həmişə baş vermir - çox vaxt fayl imzası faylın əvvəlində olur, lakin birinci sətirdə deyil (ofset).

Aşağıdakı şəkillərdən görünür ki, bütün dörd faylın məzmunu fərqlidir, lakin onların hamısı eyni fayl imzası ilə başlayır.


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin

Şəkillərdə vurğulanan sahə fayl imzasıdır bu tipdən fayllar. O, həm mətn, həm də onaltılıq formatda təqdim olunur.

Mətn formasında fayl imzası belə görünür:
....ftypmp42....mp42.......pulsuz

Nöqtələr (“.”) mətn şəklində təqdim edilə bilməyən simvolları göstərir. Buna görə də, fayl imzasının onaltılıq formasını təmin etmək lazımdır:
00 00 00 18 66 74 79 6D 70 34 32 00 00 00 6D 70 34 32 00 00 00 00 00 00 00 08 66 72 65 65

4. Eyni şəkildə, biz fayl imzasını təyin edirik, lakin faylın ən sonunda. Bu, fərqli bir fayl imzası, fərqli uzunluq ola bilər.

Aşağıdakı şəkillər faylın sonundakı fayl imzasını vurğulayır:


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin

Nəzərə alın ki, seçilmiş sahədən əvvəlki məlumatlar (fayl imzası) dörd faylın hamısında eynidir. Bu, fayl imzası olmayan texniki məlumatdır, lakin bütün dörd şəklin (faylın) eyni parametrlərlə eyni kameradan istifadə edilərək çəkildiyini göstərir. Adətən texniki məlumatlarla uyğun gələn nümunələri fayl imzasından ayırmaq mümkündür. Nümunəmizdə, fayl imzasının başlamazdan əvvəl sonuncu sətirdə ‘RecordingMode type=“normal”’ mətnini görürük ki, bu da bunun imza deyil, bir növ fayl parametri olduğunu açıq şəkildə göstərir. Səhv daxil etməmək üçün həmişə bu xəttə xüsusi diqqət yetirin texniki məlumat fayl imzasının bir hissəsi.

Bizim vəziyyətimizdə fayl imzası aşağıdakı mətndir:
...
Nəzərinizə çatdıraq ki, nöqtələr mətn şəklində təqdim edilə bilməyən simvolları göstərir.

Onaltılıq sistemdə fayl imzası belə görünür:
3N 2F 4E 6F 6E 52 65 61 6N 54 69 6A 65 4A 65 74 61 3E 0D 0A 00
Diqqət edin: imza həmişə faylın sonunda olmayacaq.

İkinci Mərhələ: Məlum Fayl Tipini təsvir edən XML faylının yaradılması
İndi fayl imzasını təyin edərək, siz XML faylı yarada və müvafiq fayl növünü R-Studio-ya daxil edə bilərsiniz. Bu iki yolla edilə bilər:

2.1 Daxili istifadə qrafik redaktoru fayl imzaları:
Alətlər menyusundan Parametrlər elementini seçin, açılan Parametrlər dialoq qutusunda Bilinən Fayl Tipləri sekmesini və sonra İstifadəçinin Fayl Növlərini Redaktə et düyməsini klikləyin.

Şəkili böyütmək üçün üzərinə klikləyin

İstifadəçinin Fayl Tiplərini Redaktə et informasiya qutusunda Fayl Tipi Yarat düyməsini klikləyin.
Aşağıdakı seçimləri təyin edin:

  • Id - unikal rəqəmsal identifikator. Bu nömrə təsadüfi seçiləcək; Yeganə odur ki, o, hər hansı digər fayl növünün rəqəmsal identifikatoruna uyğun gəlməməlidir.
  • Qrup Təsviri - tapılan faylların R-Studio-da yerləşəcəyi qrup. İstənilən halda təyin edə bilərsiniz yeni qrup, və ya artıq mövcud olanlardan birini seçin. Bizim üçün bu, “Multimedia Video (Multimedia: Video)” qrupu olacaq.
  • Təsvir - Qısa Təsvir fayl növü. Bizim nümunəmizdə, məsələn, "Sony cam video, XDCam-EX" istifadə edə bilərsiniz.
  • Genişləndirmə - bu tip faylların genişləndirilməsi. Bizim vəziyyətimizdə - mp4.

Xüsusiyyətlər parametri isteğe bağlıdır, bizim vəziyyətimizdə ondan istifadə etmək lazım deyil.

Şəkili böyütmək üçün üzərinə klikləyin

Sonra, başlanğıc və son fayl imzasını daxil etməlisiniz. Bunu etmək üçün Başlayın və sonra daxil olun kontekst menyusuİmza əlavə et əmri.

Şəkili böyütmək üçün üzərinə klikləyin

Sonra sahəyə iki dəfə klikləyin<пустая сигнатура> () və müvafiq mətni daxil edin.

Şəkili böyütmək üçün üzərinə klikləyin

Sonra son fayl imzasını yaradın. Kimdən sütununa 21 daxil etməyinizə əmin olun.

Şəkili böyütmək üçün üzərinə klikləyin

Siz məlum fayl növləri üçün öz imzanızı uğurla yaratdınız.

İndi onu saxlamaq lazımdır. İki yol var: ya Saxla düyməsini klikləməklə onu Parametrlər informasiya qutusunun Əsas nişanında göstərilən standart faylda saxlaya bilərsiniz. Və ya Save As... düyməsini klikləyin və imzanı başqa bir faylda saxlayın.

2.2 Məlum Fayl Tipini təsvir edən XML faylının əl ilə yaradılması:
Yaratmaq üçün bu fayl XML versiyası 1.0 və UTF-8 kodlaşdırmasından istifadə edək. Bunun nə olduğunu bilmirsinizsə, ümidsiz olmayın - sadəcə hər hansı birini açın mətn redaktoru(məsələn, Notepad.exe) və ilk sətirə aşağıdakı mətni daxil edin:

Sonra fayl növünü (FileType) təyin edən XML etiketi yaradacağıq. Daha əvvəl təsvir edilmiş XML atributlarını nəzərə alaraq, etiket belə görünəcək:

Gəlin onu dərhal sonra daxil edək

Sonra, fayl imzasını təyin edirik (etiket ). İlkin imza (faylın əvvəlində) etiketin içərisində olacaq heç bir atribut olmadan. Biz imzanın mətn növündən istifadə edirik, lakin eyni zamanda mətn şəklində təqdim edilə bilməyən onaltılıq simvollarla əvəz edirik. Hər onaltılıq simvoldan əvvəl biz "\x" işarəsini daxil edirik fayl imzası ilə belə görünəcək:

Əgər varsa, son imzanı da müəyyən etməlisiniz (faylın sonunda). Bu, eyni teqdən istifadə edir, lakin "from" elementi və "son" atributu ilə. Bu belə görünəcək:

Yadda saxlayın ki, son fayl imzasında mətn olmayan simvollar yox idi, lakin kəsiklər və üçbucaqlı mötərizələr var idi. XML sintaksisində çaşqınlığın və səhvlərin qarşısını almaq üçün imzadakı "/", " simvollarını əvəz edəcəyik.<" и ">"onların onaltılıq dəyərləri.

Sonda fayl imzalarından sonra FileType və FileTypeList qapanma teqləri olmalıdır:

Beləliklə, bütün fayl bu kimi görünməlidir:


\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42\x00\x00\x00\x00\x00\x00\x00\x08pulsuz
\x3C\x2FNonRealTimeMeta\x3E\x0D\x0A\x00

Unutmayın: XML sintaksisi böyük hərflərə həssasdır, ona görə də düzgün teq olacaq , amma yox .

Faylı .xml uzadılması ilə mətn formatında saxlayaq. Məsələn: SonyCam.xml.

Biz məlum fayl növləri üçün öz imzamızı uğurla yaratdıq. Bu nümunə xüsusi fayl növünün yaradılmasının əsas prinsiplərini başa düşmək üçün kifayətdir. Daha təcrübəli istifadəçilər XML 2.0 versiyasından istifadə edə bilərlər. Bu barədə daha çox R-Studio onlayn Yardım bölməsində oxuya bilərsiniz.

Addım 3: Məlum Fayl Tipini Təsvir edən Faylın Yoxlanması və Əlavə edilməsi
Növbəti addım XML faylınızı R-Studio-ya əlavə etməkdir (yükləməkdir). Bu halda avtomatik olaraq yoxlanılacaq.

Əvvəlki mərhələdə yaradılmış XML faylını R-Studio-ya yükləyək. Bunu etmək üçün Alətlər menyusunda Parametrlər elementini seçin. Parametrlər dialoq qutusunun Əsas sekmesinin İstifadəçinin fayl növləri sahəsinə yaratdığımız XML faylını əlavə edin (SonyCam.xml). Tətbiq et düyməsini basın.

Şəkili böyütmək üçün üzərinə klikləyin

2. Yeni fayl növünün endirilməsi sorğusuna Bəli cavabını verin.

Şəkili böyütmək üçün üzərinə klikləyin

3. Fayl növünün uğurla yükləndiyini yoxlamaq üçün Parametrlər dialoq qutusunun Bilinən Fayl Tipləri sekmesine klikləyin. Fayl növünü Multimedia Video qrupuna əlavə etdiyimizi unutmayın (Multimedia: Video). Bu qrupu (qovluğu) genişləndirərək, XML faylını yaratarkən qeyd etdiyimiz təsviri olan elementi görməliyik: Sony cam video, XDCam-EX (.mp4).

Şəkili böyütmək üçün üzərinə klikləyin


Şəkili böyütmək üçün üzərinə klikləyin

Fayl sintaksisində hər hansı bir səhv varsa, müvafiq mesajı görəcəksiniz:

Şəkili böyütmək üçün üzərinə klikləyin

Bu halda, XML faylınızı səhvlər üçün yenidən yoxlayın. Unutmayın: XML sintaksisi hərflərə həssasdır və hər bir teq sonunda bağlanma teqi olmalıdır.

Addım 4: Məlum fayl növünü təsvir edən faylı sınaqdan keçirin
Yaratdığımız xüsusi fayl növünün düzgünlüyünü yoxlamaq üçün .mp4 fayllarımızı çıxarıla bilən USB flash sürücüsündə tapmağa çalışaq.

1. Windows Vista və ya Windows 7-də diskin tam (sürətli olmayan) formatlaşdırılmasını həyata keçirin və ya disk boşluğunu təmizləmə proqramından (məsələn, R-Wipe & Clean) istifadə edin. tam çıxarılması diskdə mövcud olan bütün məlumatlar. Qoy USB disk FAT32-də formatlanmışdır (axtarılan faylların ölçüsü 2 GB-dan çox deyil).

2. Gəlin onu kopyalayaq test faylları diskə köçürün və keş yaddaşının məzmunu diskdə saxlanması üçün kompüteri yenidən başladın. Siz həmçinin söndürə bilərsiniz xarici sürücü və sonra yenidən birləşdirin.

3. ƏS-də sürücü, məsələn, məntiqi sürücü F:\ kimi müəyyən ediləcək.

4. R-Studio-nu işə salaq. Diskimizi seçin (F:\) və Scan düyməsini basın

Şəkili böyütmək üçün üzərinə klikləyin

5. Scan dialoq qutusunda (Fayl Sistemi) sahəsində Dəyişdir... düyməsini klikləyin və bütün qutuların işarəsini çıxarın. Beləliklə, bölmə cədvəlindən istifadə edərək fayl sistemləri və faylları axtarmağı dayandıracağıq.
Şəkili böyütmək üçün üzərinə klikləyin

6. Məlum Fayl Tipləri üçün Əlavə Axtarış qutusunu yoxlayın. Bu, R-Studio-ya skan edərkən məlum fayl növlərini axtarmağa imkan verəcək.

7. Skanlamağa başlamaq üçün Skan düyməsini klikləyin.

8. R-Studio diski skan edənə qədər gözləyək. Skan Məlumatı nişanı skan prosesini (proqress) göstərəcək.


Şəkili böyütmək üçün üzərinə klikləyin

9. Skanlama tamamlandıqdan sonra Əlavə Tapılmış Fayllar elementini seçin və üzərinə iki dəfə klikləyin.


Şəkili böyütmək üçün üzərinə klikləyin

10. Test fayllarımız Sony cam video, XDCam-EX qovluğunda (və ya İkinci Mərhələdə göstərilən fayl növü təsvirinə uyğun gələn başqa adla qovluqda) yerləşdiriləcək.


Şəkili böyütmək üçün üzərinə klikləyin

Fayl adlarının, tarixlərin və yerlərin (qovluqların) bərpa edilmədiyini görürsünüz, çünki bu məlumat fayl sistemində saxlanılır. Beləliklə, R-Studio avtomatik olaraq hər bir faylı yeni adla göstərəcək.

Bununla belə, faylların məzmununun zədələnmədiyi aydındır. Bunu yoxlamaq üçün onları müvafiq proqramda, məsələn, VLC media pleyerində açaq.


Şəkili böyütmək üçün üzərinə klikləyin

Nəticə
R-Studio-nun məlum fayl növlərini skan etmək qabiliyyəti sizə hətta fayl sistemləri ya üzərinə yazılmış diskdən məlumatları bərpa etməyə imkan verir. İmzalarından istifadə edərək faylları kifayət qədər səmərəli şəkildə axtara bilərsiniz, bu, nümunəmizdə olduğu kimi bərpa olunan faylların növünü dəqiq bilsəniz xüsusilə faydalıdır. Xüsusi fayl növləri yaratmaq imkanı, məlum fayl növlərinin siyahısına xüsusi fayl imzası olan istənilən faylı əlavə etməyə imkan verir.

Çoxları rarjpeg kimi fayllar haqqında eşitmiş ola bilər.Bu, jpeg şəkli və bir-birinə sıx şəkildə yapışdırılmış rar arxivi olan xüsusi fayl növüdür.Bu, informasiyanın ötürülməsi faktını gizlətmək üçün əla konteynerdir. aşağıdakı əmrlər:

UNIX: cat image1.jpg arxiv.rar > image2.jpg
PENCERELER: surəti /b image1.jpg+arxiv.rar image2.jpg

Və ya bir hex redaktorunuz varsa.

Əlbəttə ki, məlumat ötürmə faktını gizlətmək üçün yalnız JPEG formatından deyil, bir çox başqalarından da istifadə edə bilərsiniz. Hər bir formatın öz xüsusiyyətləri var, buna görə konteyner roluna uyğun ola bilər və ya olmaya bilər. Ən populyar formatlarda yapışdırılmış faylları necə tapa biləcəyinizi və ya yapışdırma faktını göstərə biləcəyinizi təsvir edəcəyəm.

Birləşdirilmiş faylları aşkar etmək üsullarını üç qrupa bölmək olar:

  1. EOF markerindən sonrakı ərazinin yoxlanılması üsulu. Bir çox məşhur fayl formatında istədiyiniz məlumatları göstərmək üçün cavabdeh olan sözdə fayl sonu işarəsi var. Məsələn, foto izləyiciləri bu markerə qədər bütün baytları oxuyur, lakin ondan sonrakı sahə nəzərə alınmır. Bu üsul aşağıdakı formatlar üçün idealdır: JPEG, PNG, GIF, ZIP, RAR, PDF.
  2. Fayl ölçüsünü yoxlamaq üsulu. Bəzi formatların strukturu (audio və video konteynerləri) faktiki fayl ölçüsünü hesablamağa və onu orijinal ölçüsü ilə müqayisə etməyə imkan verir. Formatlar: AVI, WAV, MP4, MOV.
  3. CFB fayllarını yoxlamaq üsulu. CFB və ya Mürəkkəb Fayl İkili Format, öz fayl sisteminə malik konteyner olan Microsoft tərəfindən hazırlanmış sənəd formatıdır. Bu üsul faylda anomaliyaların aşkarlanmasına əsaslanır.

Fayl bitdikdən sonra həyat varmı?

JPEG

Bu suala cavab tapmaq üçün birləşdirilmiş faylların "əcdadı" olan formatın xüsusiyyətlərini araşdırmaq və onun strukturunu anlamaq lazımdır. İstənilən JPEG 0xFF 0xD8 imzası ilə başlayır.

Bu imzadan sonra xidmət məlumatı, istəyə görə bir şəkil simvolu və nəhayət, sıxılmış təsvirin özü var. Bu formatda təsvirin sonu iki baytlıq 0xFF 0xD9 imzası ilə qeyd olunur.

PNG

PNG faylının ilk səkkiz baytını aşağıdakı imza tutur: 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A. Məlumat axınını bitirən imza imzası: 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82.

RAR

Bütün rar arxivləri üçün ümumi imza: 0x52 0x61 0x72 0x21 (Rar!). Bundan sonra arxiv versiyası və digər əlaqəli məlumatlar haqqında məlumat gəlir. Eksperimental olaraq müəyyən edilmişdir ki, arxiv 0x0A, 0x25, 0x25, 0x45, 0x4F, 0x46 imzası ilə bitir.

Format cədvəli və onların imzaları:
Bu formatlarda yapışqanlığı yoxlamaq alqoritmi olduqca sadədir:

  1. İlkin imzanı tapın;
  2. Yekun imzanı tapın;
  3. Son imzadan sonra heç bir məlumat yoxdursa, faylınız təmizdir və əlavələr yoxdur! Əks halda, yekun imzadan sonra başqa formatları axtarmaq lazımdır.

GIF və PDF

PDF sənədində birdən çox EOF markeri ola bilər, məsələn, sənədin səhv yaradılması səbəbindən. GIF faylındakı son imzaların sayı onun içindəki kadrların sayına bərabərdir. Bu formatların xüsusiyyətlərinə əsasən, əlavə edilmiş faylların mövcudluğunu yoxlamaq alqoritmini təkmilləşdirmək mümkündür.
  1. 1-ci nöqtə əvvəlki alqoritmdən təkrarlanır.
  2. 2-ci bənd əvvəlki alqoritmdən təkrarlanır.
  3. Son imzanı tapdığınız zaman onun yerini xatırlayın və daha çox baxın;
  4. Bu şəkildə son EOF markerinə çatsanız, fayl təmizdir.
  5. Fayl son imza ilə bitmirsə, goto tapılan son imzanın yeridir.
Fayl ölçüsü ilə son imzadan sonrakı mövqe arasında böyük fərq yapışqan əlavənin mövcudluğunu göstərir. Fərq on baytdan çox ola bilər, baxmayaraq ki, digər dəyərlər təyin edilə bilər.

ZIP

ZIP arxivlərinin özəlliyi üç müxtəlif imzanın olmasıdır: Arxivin strukturu aşağıdakı kimidir:
Yerli Fayl Başlığı 1
Fayl məlumatları 1
Məlumat təsviri 1
Yerli Fayl Başlığı 2
Fayl məlumatları 2
Məlumat təsviri 2
...
Yerli Fayl Başlığı
Fayl Məlumatı n
Data Deskriptor n
Arxiv deşifrə başlığı
Əlavə məlumat qeydini arxivləşdirin
Mərkəzi kataloq
Ən maraqlısı arxivdəki fayllar haqqında metadata olan mərkəzi kataloqdur. Mərkəzi kataloq həmişə 0x50 0x4b 0x01 0x02 imzası ilə başlayır və 0x50 0x4b 0x05 0x06 imzası ilə bitir, ardınca 18 bayt metadata. Maraqlıdır ki, boş arxivlər yalnız yekun imzadan və 18 sıfır baytdan ibarətdir. 18 baytdan sonra faylı gizlətmək üçün ideal konteyner olan arxiv şərh sahəsi gəlir.

ZIP arxivini yoxlamaq üçün mərkəzi kataloqun son imzasını tapmalı, 18 baytı atlamalı və şərh sahəsində məlum formatların imzalarını axtarmalısınız. Böyük ölçüŞərh həm də yapışdırma faktını göstərir.

Ölçü vacibdir

AVI

AVI faylının strukturu aşağıdakı kimidir: hər bir fayl RIFF imzası ilə başlayır (0x52 0x49 0x46 0x46). 8 baytında formatı təyin edən AVI imzası var (0x41 0x56 0x49 0x20). 4 baytdan ibarət ofset 4-də blok məlumat blokunun ilkin ölçüsünü ehtiva edir (bayt sırası - kiçik endian). Növbəti ölçüsü olan blok nömrəsini tapmaq üçün başlıq ölçüsünü (8 bayt) və 4-8 baytlıq blokda əldə edilən ölçüsü əlavə etməlisiniz. Bu, ümumi fayl ölçüsünü hesablayır. Hesablanmış ölçüsün faktiki fayl ölçüsündən kiçik ola biləcəyi məqbuldur. Ölçü hesablandıqdan sonra fayl yalnız sıfır baytdan ibarət olacaq (1Kb sərhədi uyğunlaşdırmaq lazımdır).

Ölçü hesablama nümunəsi:


WAV

AVI kimi, WAV faylı da RIFF imzası ilə başlayır, lakin bu fayl 8 baytdan imzaya malikdir - WAVE (0x57 0x41 0x56 0x45). Fayl ölçüsü AVI ilə eyni şəkildə hesablanır. Həqiqi ölçü hesablanmış ölçüyə tam uyğun olmalıdır.

MP4

MP4 və ya MPEG-4 video və audio axınlarını saxlamaq üçün istifadə edilən, həmçinin altyazıların və şəkillərin saxlanmasını təmin edən media konteyner formatıdır.
4 bayt ofsetdə imzalar var: fayl növü ftyp (66 74 79 70) (QuickTime Konteyner Fayl Tipi) və fayl alt növü mmp4 (6D 6D 70 34). Tanınması üçün gizli fayllar, biz faylın ölçüsünü hesablamaq imkanı ilə maraqlanırıq.

Bir nümunəyə baxaq. Birinci blokun ölçüsü sıfır ofsetdədir və 28-dir (00 00 00 1C, Big Endian bayt sırası); o, həmçinin ikinci məlumat blokunun ölçüsünün yerləşdiyi ofseti göstərir. Ofset 28-də növbəti blok ölçüsünü 8-ə bərabər tapırıq (00 00 00 08). Növbəti blok ölçüsünü tapmaq üçün əvvəlki tapılmış blokların ölçülərini əlavə etməlisiniz. Beləliklə, fayl ölçüsü hesablanır:

MOV

Bu geniş istifadə olunan format həm də MPEG-4 konteyneridir. MOV xüsusi məlumatların sıxılma alqoritmindən istifadə edir, MP4-ə bənzər bir quruluşa malikdir və eyni məqsədlər üçün - audio və video məlumatların, habelə əlaqəli materialların saxlanması üçün istifadə olunur.
MP4 kimi, hər hansı bir mov faylı ofset 4-də 4 baytlıq ftyp imzaya malikdir, lakin növbəti imza qt__ (71 74 20 20) dəyərinə malikdir. Fayl ölçüsünün hesablanması qaydası dəyişməyib: faylın əvvəlindən başlayaraq növbəti blokun ölçüsünü hesablayırıq və onu əlavə edirik.

Bu formatlar qrupunun "yapışqan" faylların mövcudluğunu yoxlamaq üsulu yuxarıda verilmiş qaydalara uyğun olaraq ölçüsü hesablamaq və yoxlanılan faylın ölçüsü ilə müqayisə etməkdir. Cari fayl ölçüsü hesablanmışdan daha kiçikdirsə, bu, yapışqan faktını göstərir. AVI fayllarını yoxlayarkən, sərhədi hizalamaq üçün əlavə edilmiş sıfırların olması səbəbindən hesablanmış ölçüsün fayl ölçüsündən kiçik ola biləcəyi qəbul edilir. Bu halda, hesablanmış fayl ölçüsündən sonra sıfırların olub olmadığını yoxlamaq lazımdır.

Mürəkkəb fayl ikili formatı yoxlanılır

Microsoft tərəfindən hazırlanmış bu fayl formatı OLE (Object Linking and Embedding) və ya COM (Component Object Model) kimi də tanınır. DOC, XLS, PPT faylları CFB formatları qrupuna aiddir.

CFB faylı 512 baytlıq başlıqdan və məlumat axınlarını və ya xidmət məlumatlarını saxlayan bərabər uzunluqda sektorlardan ibarətdir. Xüsusi nömrələr istisna olmaqla, hər bir sektorun öz qeyri-mənfi nömrəsi var: “-1” - sərbəst sektoru nömrələyir, “-2” - zənciri bağlayan sektoru nömrələyir. Bütün sektor zəncirləri FAT cədvəlində müəyyən edilmişdir.

Tutaq ki, təcavüzkar müəyyən bir .doc faylını dəyişdirdi və onun sonuna başqa bir fayl yapışdırdı. Bir neçə var müxtəlif yollarla onu aşkar edin və ya sənəddə anomaliya göstərin.

Anormal fayl ölçüsü

Yuxarıda qeyd edildiyi kimi, istənilən CFB faylı başlıqdan və bərabər uzunluqdakı sektorlardan ibarətdir. Sektor ölçüsünü öyrənmək üçün faylın əvvəlindən 30 ofsetdə iki baytlıq bir nömrə oxumalı və 2-ni bu rəqəmin gücünə yüksəltməlisiniz. Bu rəqəm müvafiq olaraq 9 (0x0009) və ya 12 (0x000C) bərabər olmalıdır, fayl sektorunun ölçüsü 512 və ya 4096 baytdır. Sektoru tapdıqdan sonra aşağıdakı bərabərliyi yoxlamaq lazımdır:

(FileSize - 512) mod SectorSize = 0

Bu bərabərlik təmin edilmirsə, o zaman faylların yapışdırılması faktını qeyd edə bilərsiniz. Ancaq bu metodun əhəmiyyətli bir çatışmazlığı var. Təcavüzkar sektorun ölçüsünü bilirsə, o, sadəcə öz faylını və başqa n baytı yapışdırmalıdır ki, yapışdırılan məlumatın ölçüsü sektor ölçüsünün qatı olsun.

Naməlum sektor növü

Təcavüzkar əvvəlki yoxlamadan keçmək üçün bir üsul bilirsə, o zaman bu üsul müəyyən edilməmiş növləri olan sektorların mövcudluğunu aşkar edə bilər.

Gəlin bərabərliyi müəyyən edək:

FileSize = 512 + CountReal * SectorSize, burada FileSize fayl ölçüsüdür, SectorSize sektor ölçüsüdür, CountReal sektorların sayıdır.

Aşağıdakı dəyişənləri də müəyyən edirik:

  1. CountFat – FAT sektorlarının sayı. Faylın əvvəlindən 44 ofsetdə yerləşir (4 bayt);
  2. CountMiniFAT – MiniFAT sektorlarının sayı. Faylın əvvəlindən ofset 64-də yerləşir (4 bayt);
  3. CountDIFAT – DIFAT sektorlarının sayı. Faylın əvvəlindən ofset 72-də yerləşir (4 bayt);
  4. CountDE – Kataloq Girişi sektorlarının sayı. Bu dəyişəni tapmaq üçün 48 ofsetdə olan birinci sektor DE-ni tapmaq lazımdır. Sonra FAT-dan DE-nin tam təqdimatını almaq və DE sektorlarının sayını hesablamaq lazımdır;
  5. CountStreams – məlumat axını olan sektorların sayı;
  6. CountFree – pulsuz sektorların sayı;
  7. CountClassified – müəyyən bir növü olan sektorların sayı;
CountClassified = CountFAT + CountMiniFAT + CountDIFAT + CountDE + CountStreams + CountFree

Aydındır ki, CountClassified və CountReal qeyri-bərabərdirsə, faylların birləşdirilə biləcəyi qənaətinə gələ bilərik.

Rəhbərim mənə olduqca maraqlı bir tapşırıq verdi. Qısa müddətdə, imzalara əsaslanaraq virus cəsədlərini tapa biləcək və istifadə olunan paketləyici/kriptoru təyin edə biləcək icra edilə bilən fayl analizatoru yazın. Hazır prototip bir neçə saat ərzində ortaya çıxdı.

Müəllif sözü

İmza təhlili

İmzalardan istifadə edərək zərərli obyektin axtarışı istənilən antivirusun edə biləcəyi bir işdir. Ümumiyyətlə, imza skan edilən faylın virus və dəqiq müəyyən edilmiş virus olduğunu müəyyən etmək üçün müəyyən xüsusiyyətlərin rəsmiləşdirilmiş təsviridir.

Burada müxtəlif texnikalar var. Alternativ, zərərli obyektin N baytından ibarət imzadan istifadə etməkdir. Bu halda, siz axmaq bir müqayisə deyil, bəzi maskalardan istifadə edərək müqayisə edə bilərsiniz (məsələn, EB ?? ?? CD 13 baytlarını axtarırsınız). Və ya “filan baytlar proqrama giriş nöqtəsində olmalıdır” və s. kimi əlavə şərtlər təyin edin. Zərərli proqramın imzası xüsusi bir məsələdir.

Eyni şəkildə, icra olunan faylın bu və ya digər kriptotor və ya paketləyici (məsələn, banal ASPack) ilə dolu olduğunu müəyyən etmək üçün bəzi əlamətlər təsvir edilmişdir. Jurnalımızı diqqətlə oxumusunuzsa, ona ötürülən PE faylı üçün ən çox istifadə olunan paketləyiciləri, kriptotorları və tərtibçiləri (verilənlər bazasında çox sayda imza var) müəyyən etməyə qadir olan PEiD kimi bir vasitə haqqında mütləq eşitmisiniz. . Təəssüf ki, proqramın yeni versiyaları uzun müddətdir ki, buraxılmır və bu yaxınlarda rəsmi saytda layihənin daha da inkişaf etməyəcəyinə dair bir mesaj ortaya çıxdı. Təəssüf ki, PEiD-in imkanları (xüsusilə plagin sistemini nəzərə alsaq) mənim üçün çox faydalı ola bilər. Qısa təhlildən sonra məlum oldu ki, bu variant deyil. Ancaq ingilisdilli bloqları vərəqlədikdən sonra tez bir zamanda mənə uyğun olanı tapdım. YARA Layihəsi (code.google.com/p/yara-project).

YARA nədir?

Əvvəldən mən əmin idim ki, İnternetdə hardasa müəyyən bir imza ilə araşdırılan fayl arasındakı uyğunluğu müəyyən etmək vəzifəsini öz üzərinə götürəcək açıq mənbə inkişafı var. Əgər mən belə bir layihə tapa bilsəydim, o zaman onu asanlıqla veb proqramın relslərinə qoyub oraya müxtəlif imzalar əlavə edib məndən tələb olunanı ala bilərdim. YARA layihəsinin təsvirini oxuyanda plan daha real görünməyə başladı.

Tərtibatçıların özləri onu zərərli proqram tədqiqatçılarına zərərli nümunələri müəyyən etmək və təsnif etməkdə kömək etmək üçün bir vasitə kimi yerləşdirirlər. Tədqiqatçı üçün təsvirlər yarada bilər fərqli növlər zərərli proqramın rəsmiləşdirilmiş xüsusiyyətlərini təsvir edən mətn və ya ikili nümunələrdən istifadə edən zərərli proqram. İmzalar belə alınır. Əslində, hər bir təsvir bir sıra xətlərdən və bəzi məntiqi ifadələrdən ibarətdir, bunun əsasında analizatorun tetikleyici məntiqi müəyyən edilir.

Əgər yoxlanılan fayl üçün qaydalardan birinin şərtləri yerinə yetirilirsə, müvafiq olaraq (məsələn, filan qurd) müəyyən edilir. Nə danışdığımızı başa düşmək üçün sadə bir qayda nümunəsi:

qayda səssiz_bankir: bankir
{
meta:
description = "Bu sadəcə bir nümunədir"
mövzu_səviyyəsi = 3
in_the_wild = doğrudur
simlər:
$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"
vəziyyət:
$a və ya $b və ya $c
}

Bu qaydada biz YARA-ya bildiririk ki, $a, $b, $c dəyişənlərində təsvir edilmiş nümunə sətirlərindən ən azı birini ehtiva edən istənilən fayl silent_banker troyan kimi təsnif edilməlidir. Və bu çox sadə bir qaydadır. Əslində, qaydalar daha mürəkkəb ola bilər (bu barədə aşağıda danışacağıq).
Hətta ondan istifadə edən layihələrin siyahısı da YARA layihəsinin nüfuzundan danışır və bu:

  • VirusTotal Zərərli Proqram Kəşfiyyat Xidmətləri (vt-mis.com);
  • jsunpack-n (jsunpack.jeek.org);
  • Veb saytınızı izləyirik (wewatchyourwebsite.com).

Bütün kodlar Python-da yazılmışdır və istifadəçiyə həm modulun özünün hazırlanmasında istifadə etmək, həm də YARA-dan müstəqil proqram kimi istifadə etmək üçün sadəcə icra edilə bilən fayl təklif olunur. İşimin bir hissəsi olaraq mən birinci variantı seçdim, lakin bu məqalədə sadəlik üçün analizatordan sadəcə konsol tətbiqi kimi istifadə edəcəyik.

Bir az qazdıqdan sonra YARA üçün qaydaları necə yazacağımı, həmçinin pulsuz proqramdan və PEiD-dən paketleyicilərdən virus imzalarını necə əlavə edəcəyimi tez başa düşdüm. Ancaq quraşdırma ilə başlayacağıq.

Quraşdırma

Artıq dediyim kimi, layihə Python-da yazılmışdır, ona görə də Linux, Windows və Mac-da asanlıqla quraşdırıla bilər. Əvvəlcə yalnız ikili qəbul edə bilərsiniz. Tətbiqi konsolda çağırsaq, işə salma qaydalarını alacağıq.

$yara
istifadə: yara ... ... FILE | PID

Yəni, proqramı çağırmaq üçün format belədir: əvvəlcə proqramın adı, sonra seçimlərin siyahısı, bundan sonra qaydaları olan fayl göstərilir və ən sonunda - faylın adı göstərilir. yoxlanılmış (və ya faylları ehtiva edən kataloq) və ya proses identifikatoru. İndi bu qaydaların necə tərtib edildiyini yaxşı bir şəkildə izah etmək istərdim, amma sizi dərhal quru nəzəriyyə ilə yükləmək istəmirəm. Buna görə də, biz işləri başqa cür edəcəyik və digər insanların imzalarını götürəcəyik ki, YARA bizim qarşıya qoyduğumuz vəzifələrdən birini - imzalarla virusların tam hüquqlu aşkarlanmasını yerinə yetirə bilsin.

Öz antivirusunuz

Ən vacib sual: məlum virusların imzalarının verilənlər bazasını haradan əldə etmək olar? Antivirus şirkətləri bu cür verilənlər bazalarını öz aralarında aktiv şəkildə paylaşırlar (bəziləri daha səxavətlə, digərləri daha az). Düzünü desəm, ilk əvvəl hətta şübhə edirdim ki, internetdə hardasa kimlərsə açıq şəkildə belə şeylər yazacaq. Ancaq məlum oldu ki, yaxşı insanlar var. Məşhur ClamAV antivirusundan uyğun verilənlər bazası hər kəs üçün əlçatandır (clamav.net/lang/en). "Son Stable Release" bölməsində link tapa bilərsiniz son versiya antivirus məhsulu, həmçinin ClamAV virus verilənlər bazalarını yükləmək üçün keçidlər. Bizi ilk növbədə main.cvd (db.local.clamav.net/main.cvd) və daily.cvd (db.local.clamav.net/daily.cvd) faylları maraqlandıracaq.

Birincisi imzaların əsas bazasını, ikincisi isə ən dolğun verilənlər bazasını ehtiva edir Bu an müxtəlif əlavələrlə əsas. 100.000-dən çox zərərli proqram təəssüratını ehtiva edən Daily.cvd bu məqsəd üçün kifayət qədər kifayətdir. Bununla belə, ClamAV verilənlər bazası YARA verilənlər bazası deyil, ona görə də onu istədiyimiz formata çevirməliyik. Bəs necə? Axı, nə ClamAV formatı, nə də Yara formatı haqqında hələ heç nə bilmirik. ClamAV virus imza verilənlər bazasını YARA qaydaları toplusuna çevirən kiçik bir skript hazırlamaqla bu problem artıq qarşımızda həll edilmişdir. Skript clamav_to_yara.py adlanır və Metyu Riçard tərəfindən yazılmışdır (bit.ly/ij5HVs). Skripti yükləyin və verilənlər bazasını çevirin:

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

Nəticədə, clamav.yara faylında dərhal istifadəyə hazır olan imza bazası alacağıq. İndi YARA və ClamAV verilənlər bazasının birləşməsini işləyək. İmzadan istifadə edərək qovluğun skan edilməsi bir əmrlə həyata keçirilir:

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

-r seçimi skanın cari qovluğun bütün alt qovluqlarında rekursiv şəkildə aparılmalı olduğunu göstərir. Əgər /pentest/msf3/data qovluğunda (ən azı ClamAV verilənlər bazasında olanlar) virus bədənləri varsa, YARA bu barədə dərhal məlumat verəcək. Prinsipcə, bu hazır imza skaneridir. Daha çox rahatlıq üçün mən ClamAV verilənlər bazası yeniləmələrini yoxlayan, yeni imzaları yükləyən və onları YARA formatına çevirən sadə skript yazdım. Amma bunlar artıq detallardır. Tapşırığın bir hissəsi tamamlandı, indi paketləyiciləri/kriptorları müəyyən etmək üçün qaydaları tərtib etməyə başlaya bilərsiniz. Ancaq bunun üçün onlarla bir az məşğul olmalı idim.

Qaydalara uyğun oynayın

Beləliklə, qayda müəyyən bir faylı müəyyən bir kateqoriyaya təyin etməyə imkan verən proqramın əsas mexanizmidir. Qaydalar ayrıca faylda (və ya fayllarda) təsvir olunur və görünüşü C/C++ dilindən struct() konstruksiyasına çox bənzəyir.

BadBoy idarə et
{
simlər:
$a = "win.exe"
$b = "http://foo.com/badfi le1.exe"
$c = "http://bar.com/badfi le2.exe"
vəziyyət:
$a və ($b və ya $c)
}

Prinsipcə, yazı qaydalarında mürəkkəb bir şey yoxdur. Bu yazıda mən yalnız əsas məqamlara toxundum və təfərrüatları təlimatda tapa bilərsiniz. Hələlik, on ən vacib məqam:

1. Hər bir qayda açar söz qaydası ilə başlayır, ondan sonra qayda identifikatoru gəlir. İdentifikatorlar C/C++ dilində dəyişənlərlə eyni ada malik ola bilər, yəni hərf və rəqəmlərdən ibarət ola bilər və birinci simvol rəqəm ola bilməz. Maksimum uzunluq identifikator adı - 128 simvol.

2. Tipik olaraq, qaydalar iki bölmədən ibarətdir: tərif bölməsi (sətirlər) və şərt bölməsi (şərt). Sətirlər bölməsi, şərt bölməsinin verilmiş faylın müəyyən şərtlərə cavab verib-verməməsinə qərar verəcəyi məlumatları müəyyənləşdirir.

3. Sətirlər bölməsindəki hər bir sətir $ işarəsi ilə başlayan öz identifikatoruna malikdir - ümumiyyətlə, PHP-də dəyişən bəyannaməsi kimi. YARA içəriyə daxil edilmiş müntəzəm sətirləri dəstəkləyir ikiqat sitatlar("") və onaltılıq sətirlər daxil edilir braketlər(()), eləcə də müntəzəm ifadələr:

$my_text_string = "burada mətn"
$my_hex_string = ( E2 34 A1 C8 23 FB )

4. Şərt bölməsi qaydanın bütün məntiqini ehtiva edir. Bu bölmədə fayl və ya prosesin qaydaya nə vaxt uyğun gəldiyini müəyyən edən Boolean ifadəsi olmalıdır. Tipik olaraq, bu bölmə əvvəllər elan edilmiş xətlərə istinad edir. Və sətir identifikatoru, sətir faylda və ya proses yaddaşında tapılıbsa, doğru, əks halda isə false qaytaran mantiqi dəyişən kimi qəbul edilir. Yuxarıdakı qayda müəyyən edir ki, win.exe sətri və iki URL-dən biri olan fayl və proseslər BadBoy (qayda adı ilə) kimi təsnif edilməlidir.

5. Hexadecimal sətirlər onları daha çevik edən üç konstruksiyaya imkan verir: joker işarələr, atlamalar və alternativlər. Əvəzetmələr sətirdə bilinməyən və istənilən qiymətlə əvəz edilə bilən yerlərdir. Onlar “?” işarəsi ilə göstərilir:

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

Uzunluğu məlum olan sətirləri təyin edərkən bu yanaşma çox rahatdır, lakin məzmunu fərqli ola bilər. Sətin bir hissəsi müxtəlif uzunluqlarda ola bilərsə, diapazonlardan istifadə etmək rahatdır:

$hex_string = ( F4 23 62 B4 )

Bu giriş o deməkdir ki, xəttin ortasında 4-dən 6-a qədər müxtəlif bayt ola bilər. Alternativ seçim də həyata keçirə bilərsiniz:

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

Bu o deməkdir ki, üçüncü baytın yerində 62 B4 və ya 56 ola bilər, belə bir giriş F42362B445 və ya F4235645 sətirlərinə uyğundur.

6. Verilmiş sətrin fayl və ya proses ünvan məkanında xüsusi ofsetdə olduğunu yoxlamaq üçün at operatorundan istifadə olunur:

100-də $a və 200-də $b

Əgər sətir müəyyən ünvan diapazonunda ola bilirsə, in operatoru istifadə olunur:

$a in (0..100) və $b in (100..fi ölçüsü)

Bəzən elə hallar yaranır ki, bir faylda müəyyən bir dəstdən müəyyən bir nömrənin olması lazım olduğunu qeyd etmək lazımdır. Bu operatorun köməyi ilə edilir:

Nümunə 1 qaydası
{
simlər:
$foo1 = "dummy1"
$foo2 = "dummy2"
$foo3 = "dummy3"
vəziyyət:
2-dən ($foo1,$foo2,$foo3)
}

Yuxarıdakı qayda faylın dəstdən hər hansı iki sətirdən ibarət olmasını tələb edir ($foo1,$foo2,$foo3). Faylda sətirlərin müəyyən sayını göstərmək əvəzinə, dəyişənlərdən hər hansı (verilmiş çoxluqdan ən azı bir sətir) və hamısını (verilmiş çoxluqdan bütün sətirlər) istifadə edə bilərsiniz.

7. Yaxşı, nəzərə alınmalı olan son maraqlı imkan, bir şərtin bir çox sıraya tətbiq edilməsidir. Bu funksiya operatorun funksiyasına çox bənzəyir, yalnız for..of operatoru daha güclüdür:

string_set ifadəsi üçün: (boolean_expression)

Bu giriş belə oxunmalıdır: sətir_ dəstində göstərilən sətirlərdən ən azı ifadə parçaları boolean_ifadə şərtini təmin etməlidir. Və ya başqa sözlə: boolean_ifadəsi string_setsindəki hər bir sətir üçün qiymətləndirilir və onlardan ifadələr True qaytarmalıdır. Sonra konkret bir nümunədən istifadə edərək bu tikintiyə baxacağıq.

PEiD edilməsi

Beləliklə, qaydalarla hər şey az və ya çox aydınlaşdıqda, layihəmizdə paketləyicilər və kriptotorlar detektorunu tətbiq etməyə başlaya bilərik. Əvvəlcə mənbə materialı olaraq eyni PEiD-dən tanınmış paketçilərin imzalarını götürdüm. Plugins qovluğunda bizə lazım olanları ehtiva edən userdb.txt faylı var. Məlumat bazamda 1850 imza var idi.

Kifayət qədər çoxdur, buna görə də onları tam idxal etmək üçün sizə bir növ skript yazmağı məsləhət görürəm. Bu verilənlər bazasının formatı sadədir - adi olandan istifadə olunur mətn faylı kimi qeydləri saxlayan:


imza = 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 = doğrudur

Birinci sətir PEiD-də göstəriləcək qablaşdırıcının adını müəyyən edir, lakin bizim üçün bu qayda identifikatoru olacaq. İkincisi, imzanın özüdür. Üçüncüsü, verilmiş xəttin yalnız giriş nöqtəsi ünvanında və ya bütün fayl boyunca axtarılacağını göstərən ep_only bayrağıdır.

Yaxşı, ASPack üçün bir qayda yaratmağa çalışaq? Göründüyü kimi, bunda mürəkkəb bir şey yoxdur. Əvvəlcə qaydaları saxlamaq üçün fayl yaradaq və onu, məsələn, packers.yara adlandıraq. Sonra PEiD verilənlər bazasında adlarına ASPack daxil olan bütün imzaları axtarırıq və onları qaydaya köçürürük:

ASPack qaydası
{
simlər:
$ = (60 E8 ?? ?? ?? ?? 5D 81 ED ?? ?? (43 | 44) ?? B8 ?? ?? (43 | 44) ?? 03 C5 )
$ = ( 60 EB ?? 5D EB ?? FF ?? ?? ?? ?? ?? E9 )
[.. kəsmək..]
$ = (60 E8 03 00 00 00 E9 EB 04 5D 45 55 C3 E8 01)
vəziyyət:
onlardan hər hansı biri üçün: ($giriş nöqtəsində)
}

Tapılan bütün qeydlərdə ep_only bayrağı doğru olaraq təyin edilmişdir, yəni bu sətirlər giriş nöqtəsi ünvanında yerləşməlidir. Buna görə də, aşağıdakı şərti yazırıq: "onlardan hər hansı biri üçün: ($at entrypoint)".

Beləliklə, giriş nöqtəsi ünvanında verilmiş sətirlərdən ən azı birinin olması faylın ASPack ilə dolu olması demək olacaq. Nəzərə alın ki, bu qaydada bütün sətirlər identifikator olmadan sadəcə $ işarəsindən istifadə edilməklə göstərilib. Bu mümkündür, çünki vəziyyət bölməsində biz heç bir konkret olanlara daxil olmuruq, lakin bütün dəsti istifadə edirik.

Yaranan sistemin funksionallığını yoxlamaq üçün konsolda əmri yerinə yetirmək kifayətdir:

$ yara -r packers.yara somefi le.exe

Orada ASPack ilə paketlənmiş bir neçə proqramı bəslədikdən sonra hər şeyin işlədiyinə əmin oldum!

Hazır prototip

YARA son dərəcə aydın və şəffaf bir vasitə oldu. Bunun üçün veb-admin yazmaq və veb xidməti kimi işləmək üçün qurmaq mənim üçün çətin olmadı. Bir az yaradıcılıqla, analizatorun quru nəticələri artıq aşkar edilmiş zərərli proqramın təhlükə dərəcəsini göstərən müxtəlif rənglərlə rənglənir. Verilənlər bazasının kiçik bir yeniləməsi və bir çox kriptotorlar üçün qısa təsvir və bəzən hətta paketdən çıxarma təlimatları mövcuddur. Prototip yaradıldı və mükəmməl işləyir və patronlar zövqlə rəqs edirlər!

Teleqram başlığında funksiya kodu (FC) Teleqramın növünü müəyyən edir, məsələn, Sorğu teleqramı (Tələb və ya Göndər/Tələb) və Təsdiq və ya Cavab teleqramı (Təsdiq çərçivəsi, Cavab çərçivəsi). Bundan əlavə, funksiya kodu mesajların itməsi və təkrarlanmasının qarşısını alan faktiki ötürmə funksiyası və nəzarət məlumatını və ya FDL statuslu stansiya tipini ehtiva edir.

7 6 5 4 3 2 1 0 FC: Funksiya Kodu Sorğu
1 Telegram tələb edin
X FCV = Alternativ bit işə salınıb
X href=”http://profibus.felser.ch/en/funktionscode.htm#aufruffolgebit”>FCB = Alternativ bit (çərçivə sayından)
1 0 (0x0) CV = Saat Dəyəri()
1 başqa Qorunur
0 0 (0x0) TE = Zaman hadisəsi (Saat sinxronizasiyası)
0 3 (0x3) SDA_LOW = Məlumat Göndərmə Təsdiq edildi - aşağı prioritet
0 4 (0x4) SDN_LOW = Məlumat Göndər Təsdiq edilmir - aşağı prioritet
0 5 (0x5) SDA_HIGH = Məlumat Göndərmə Təsdiq edildi - yüksək prioritet
0 6 (0x6) SDN_HIGH = Məlumat Göndər Təsdiq edilmir
0 7 (0x7) MSRD = Multicast Cavab ilə Sorğu Məlumatını Göndər
0 9 (0x9) FDL Statusunu tələb edin
0 12(0xC) SRD aşağı = Məlumat göndərin və tələb edin
0 13(0xD) SRD yüksək = Məlumat göndərin və tələb edin
0 14(0xE) Cavab ilə Ident tələb edin
0 15 (0xF) Cavab 1 ilə LSAP Statusunu tələb edin)
0 başqa Qorunur

1) bu dəyər standartın son versiyasındadır, artıq müəyyən edilmir, ancaq qorunur

7 6 5 4 3 2 1 0 FC: Funksiya Kodu Cavabı
0 Cavab teleqramı
0 Qorunur
0 0 Qul
0 1 Usta hazır deyil
1 0 Usta hazır, nişansız
1 1 Usta hazırdır, nişan halqasında
0 (0x0) tamam
1 (0x1) UE = İstifadəçi xətası
2 (0x2) RR = Resurs yoxdur
3 (0x3) RS = SAP aktiv deyil
8 (0x8) DL = Data Low (DP ilə normal vəziyyət)
9 (0x9) NR = Hazır cavab məlumatı yoxdur
10(0xA) DH = Yüksək Məlumat (DP diaqnozu gözlənilir)
12(0xC) RDL = Məlumat alınmadı və Məlumat Az
13(0xD) RDH = Məlumat alınmadı və Məlumat Yüksək
başqa Qorunur

Çərçivə sayı biti FCB (b5) çərçivə sayı biti təsdiq edən və ya cavab verən stansiya (cavab verən) tərəfindən mesajın təkrarlanmasının və zəng edən stansiyanın (təşəbbüskar) hər hansı itkisinin qarşısını alır. Təsdiq edilmədən sorğular (SDN) və FDL Status, İdentifikator və LSAP Status sorğuları bundan xaric edilir.

Təhlükəsizlik ardıcıllığı üçün təşəbbüskar hər cavab verən üçün bir FCB daşımalıdır. Sorğu teleqramı (Sorğu və ya Göndərmə/Tələb) ilk dəfə cavab verənə göndərildikdə və ya o, hazırda qeyri-işlək kimi qeyd olunmuş cavabdeh şəxsə yenidən göndərildikdə, FCB cavab verəndə müəyyən edildiyi kimi təyin edilməlidir. Təşəbbüskar buna FCV=0 və FCB=1 olan Sorğu teleqramında nail olur. Cavab verən şəxs bu cür teleqramı ilk mesaj dövrü kimi qiymətləndirməli və FCB=1-i təşəbbüsçünün ünvanı (SA) ilə birlikdə saxlamalıdır (aşağıdakı cədvələ baxın). Bu mesaj dövrü təşəbbüskar tərəfindən təkrarlanmayacaq. Eyni cavab verənə sonrakı Sorğu teleqramlarında təşəbbüskar FCV=1 təyin etməli və hər yeni Sorğu teleqramı ilə FCB-ni dəyişməlidir. FCV=1 ilə ünvanlanmış Sorğu teleqramını alan istənilən cavabdeh FCB-ni qiymətləndirməlidir. Eyni təşəbbüsçünün (eyni SA) son Sorğu teleqramı ilə müqayisədə FCB dəyişibsə, bu, əvvəlki mesaj dövrünün düzgün şəkildə bağlanmasının etibarlı təsdiqidir. Əgər Sorğu teleqramı başqa təşəbbüskardan (müxtəlif SA) qaynaqlanırsa, FCB-nin qiymətləndirilməsi artıq lazım deyil. Hər iki halda cavabdeh ona ünvanlanmış yeni teleqramı alana qədər FCB-ni mənbə SA ilə saxlamalıdır. Təsdiq və ya cavab teleqramı itirildikdə və ya zəiflədikdə, FCB sorğunun təkrar cəhdində təşəbbüskar tərəfindən dəyişdirilməməlidir: bu, əvvəlki mesaj dövrünün səhv olduğunu göstərəcək. Cavab verən şəxs eyni təşəbbüskardan (eyni SA) sonuncu Sorğu teleqramı ilə eyni FCV=1 və eyni FCB ilə Sorğu teleqramını alırsa, bu, sorğunun təkrar cəhdini göstərəcək. Cavab verən şəxs öz növbəsində hazır vəziyyətdə saxlanılan təsdiq və ya cavab teleqramını yenidən göndərməlidir. Yuxarıda qeyd olunan təsdiqlənməyə və ya başqa ünvana (SA və ya DA) malik teleqramın qəbuluna qədər (Send Data with No Acknowledge, SDN) cavab verən hər hansı mümkün sorğunun təkrar cəhdinə hazır vəziyyətdə olmalıdır. . Təsdiq edilməyən və Sorğu FDL Status, İdentifikator və LSAP Statuslu Sorğu teleqramları halında, FCV=0 və FCB=0; cavab verən tərəfindən qiymətləndirməyə ehtiyac yoxdur.

b5 b4 Bit mövqeyi
FCB FCV Vəziyyət Məna Fəaliyyət
0 0 DA = TS/127 Təsdiq etmədən sorğu
FDL Status/Ident/ LSAP Status tələb edin
Son təsdiqi silin
0/1 0/1 DA#TS Başqa cavab verənə sorğu göndərin
1 0 DA = TS İlk xahiş FCBM:= 1
SAM:=SA
Son etirafı/cavabı silin
0/1 1 DA = TS
SA = SAM
FCB#FCBM
Yeni Sorğu Son etirafı/cavabı silin
FCBM:=FCB
Yenidən cəhd etməyə hazır olduğunuzda etiraf/cavab saxlayın
0/1 1 DA = TS
SA = SAM
FCB = FCBM
Yenidən cəhd edin FCBM:=FCB
Təsdiq / cavabı təkrarlayın və hazır vəziyyətdə saxlamağa davam edin
0/1 1 DA = TS
SA#SAM
Yeni təşəbbüskar FCBM:=FCB
SAM:= SA Yenidən cəhd etməyə hazır olduğunuzu bildirmə / cavabı saxlayın

FCBM yaddaşda FCB saxladı SAM yaddaşda SA saxladı




Üst