
ImHex-ի հեղինակը ցույց է տալիս՝ ինչպես ռևերս-ինժինիրինգ անել անհայտ ֆայլային ձևաչափը
Բաց կոդով ImHex hex-խմբագրիչի մշակողը հրապարակել է անհայտ բինար ձևաչափերի ռևերս-ինժինիրինգի ուղեցույց՝ FEZ խաղի պահպանման ֆայլի օրինակով։Հոդվածը եզրափակիչում ընդհանրացնում է մեթոդը ցանկացած անհայտ ձևաչափի համար։
Բաց կոդով ImHex hex-խմբագրիչի հեղինակ WerWolv-ը հրապարակել է քայլ առ քայլ ուղեցույց անհայտ բինար ֆայլային ձևաչափի ռևերս-ինժինիրինգի վերաբերյալ։ Օրինակը 2012 թվականի FEZ խաղի պահպանման ֆայլն է՝ հում բայթերից մինչև ImHex-ի Pattern Language-ով գրված ամբողջական նկարագրություն։ ImHex-ը անվճար է և բաց կոդով։
Ապակոմպիլացումից մինչև ճիշտ ֆունկցիան
FEZ-ի պահպանման տվյալները սեղմված կամ գաղտնագրված չեն և չունեն ֆայլի «կախարդական» նշան, այնպես որ առաջին հայացքից ֆայլը ոչնչով չի ճանաչվում։ Քանի որ խաղը գրված է C#-ով, JetBrains Rider-ի նման գործիքները բինարները վերածում են գրեթե սկզբնական կոդի։ Ամենահետաքրքիր ժողովածուներն էին FEZ.exe, FezEngine.dll, Common.dll, ContentSerialization.dll և EasyStorage.dll։ PCSaveDevice դասում ֆայլի անունը կառուցվում է «SaveSlot» տողից և ինդեքսից, իսկ Save() մեթոդը լցնում է 40 960 բայթանոց (0xA000) բուֆեր՝ սկզբում ընթացիկ ժամանակը Windows-ի FILETIME ձևաչափով, ապա պահպանման տվյալները. կարճ ֆայլերը լցվում են զրոներով, իսկ ավելի մեծերը բացառություն են առաջացնում։ Շղթան մինչև SaveFileOperations.Write հետևելով՝ երևում են բոլոր դաշտերը. տարբերակի համարը, որը ընթերցիչը պահանջում է հավասար լինի 6-ի, ժամային նշիչները և New Game Plus-ի դրոշները։
Pattern-ի կառուցումը ImHex-ում
Pattern Language-ում հեղինակը struct-ը տեղադրում է ֆայլի սկզբում, ավելացնում տիպերի կեղծանուններ, որպեսզի կոդը նման լինի իրական իրականացմանը, և ստանդարտ գրադարանից ներմուծում FILETIME տիպը, որ ժամանակի նշիչը ընթեռնելի ամսաթիվ դառնա։ Տողերը պարզվում է ունեն 7-բիթանոց կոդավորմամբ երկարության նախածանց. հեղինակը դա իրականացնում է ցիկլով, որը բայթեր է կարդում, մինչև շարունակության բիթը զրոյանա, և ավելացնում format ու transform ատրիբուտներ արժեքը ինտերֆեյսում ցուցադրելու համար։ Օբյեկտները մոդելավորվում են որպես nullable-փաթաթաններ՝ ընտրովի արժեքից առաջ տրամաբանական դրոշով, ցուցակները՝ քանակի նախածանցով զանգվածներ, իսկ enum-ները C#-ից գրեթե անփոփոխ են տեղափոխվում։ Հոդվածի վերջում ֆայլի բոլոր բայթերը, բացի վերջնական լցոնումից, վերծանված են, և արժեքները կարելի է խմբագրել անմիջապես ինտերֆեյսից։
Ընդհանուր բաղադրատոմս
Եզրափակչում հեղինակը ընդհանրացնում է ընթացքը. նախ ստուգեք՝ արդյոք ձևաչափն արդեն հայտնի է. այստեղ կօգնեն ImHex-ի magic-ճանաչումը և binwalk-ի նման գործիքները, իսկ փաստաթղթավորված ձևաչափերի համար կարող են արդեն պատրաստ վերլուծիչներ լինել։ Ապա գտեք ֆայլը կարդացող կամ գեներացնող կոդը. ապակոմպիլացրեք լեզվին համապատասխան գործիքով՝ Rider՝ .NET-ի, Ghidra, IDA կամ Binary Ninja՝ նատիվ կոդի, Recaf՝ JVM լեզուների համար, փնտրելով ֆայլային մուտք-ելքի կանչեր կամ ֆայլի անուն պարունակող տողեր։ Հետո առանձնացրեք հիմնական բլոկները՝ ամբողջ թվեր, տրամաբանական արժեքներ, տողեր և տվյալների կառուցվածքներ, և գրեք pattern ֆայլ, որը կփաստաթղթավորի ու կստուգի գտածոները։
Ամեն ծրագիր FEZ-ի պես հեշտ չի վերլուծվի, ընդունում է հեղինակը, սակայն մոտեցումը մնում է նույնը։ Ամբողջական pattern-ը հրապարակված է հոդվածի հետ, իսկ հարցերը կարելի է ուղղել ImHex-ի Discord սերվերում։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։