
ImHex-ის ავტორი აჩვენებს, როგორ იშიფრება უცნობი ფაილის ფორმატი
ImHex-ის შემქმნელმა გამოაქვეყნა გზამკვლევი უცნობი ბინარული ფაილის რევერს-ინჟინერიაზე, FEZ-ის შენახვის ფაილის მაგალითზე — ნედლი ბაიტებიდან სრულ Pattern-ამდე. სტატიაში ასევე მოცემულია ზოგადი მიდგომა ნებისმიერი უცნობი ფორმატისთვის.
ImHex-ის, ღია კოდის hex-რედაქტორის ავტორმა WerWolv-მა 27 აგვისტოს გამოაქვეყნა დეტალური გზამკვლევი, რომელიც უჩვეულო ბინარული ფაილის ფორმატის რევერს-ინჟინერიას ასწავლის. მაგალითად აღებულია თამაშ FEZ-ის შენახვის ფაილი - ნედლი ბაიტებიდან ImHex-ის Pattern Language-ზე დაწერილ სრულ აღწერამდე. ImHex უფასო და ღია პროგრამაა, ნებისმიერ ოპერაციულ სისტემაზე მუშაობს და ბრაუზერშიც არის ხელმისაწვდომი.
დეკომპილაციიდან სწორ ფუნქციამდე
FEZ-ის შენახვის ფაილი არ არის დაშიფრული ან შეკუმშული და მას „მაგიური“ მისამართიც არ აქვს. რადგან თამაში C#-ზეა დაწერილი, JetBrains Rider-ით ბინარები თითქმის საწყის კოდად იშლება. ავტორისთვის საინტერესო აღმოჩნდა FEZ.exe, FezEngine.dll, Common.dll, ContentSerialization.dll და EasyStorage.dll. სწორედ EasyStorage-ის PCSaveDevice კლასში ჩანს ფაილის სახელის წარმოქმნა და Save() ფუნქცია, რომელიც 40 960-ბაიტიან (0xA000) ბუფერს ავსებს: ჯერ იწერება მიმდინარე დრო Windows-ის FILETIME ფორმატში, შემდეგ - შენახვის მონაცემები; მოკლე ფაილი ნულებით ივსება, დიდი კი გამონაკლისს იწვევს. SaveFileOperations.Write ფუნქცია კი ყველა ველს ჩამოთვლის: ვერსია (რომელიც წაკითხვისას 6-ის ტოლი უნდა იყოს), დროის ნიშნები და New Game Plus-ის დროშები. გზამკვლევში ავტორი აღნიშნავს, რომ ზოგიერთი გამოყენებული ფუნქცია ჯერ მხოლოდ Nightly აგებაშია და FEZ-ის სიუჟეტის სპოილერებსაც შეიცავს.
Pattern-ის აწყობა ImHex-ში
Pattern Language-ში ავტორი სტრუქტურას ფაილის დასაწყისში ათავსებს, ტიპებს სახელებს უცვლის და სტანდარტული ბიბლიოთეკიდან FILETIME ტიპს იყენებს, რომ დროის ნიშანი ადამიანისთვის წასაკითხად გამოჩნდეს. სტრიქონები აღმოჩნდა 7-ბიტიანი კოდირებით დაწერილი სიგრძის პრეფიქსით - ავტორი მას ციკლით ამუშავებს, სანამ ბაიტში გაგრძელების ბიტი არ განულდება, ხოლო ჩვენებისთვის სპეციალურ ატრიბუტებს იყენებს. ობიექტები nullable-გარსებია, სიები - რაოდენობის პრეფიქსის მქონე მასივები, ხოლო enum-ები C#-იდან პირდაპირ გადაიტანა. საბოლოოდ ფაილის ყველა ბაიტი დეკოდირდება და მნიშვნელობების ნახვა და რედაქტირება პირდაპირ ინტერფეისიდან შეიძლება.
ზოგადი რეცეპტი
ბოლოს ავტორი აზოგადებს სამუშაო პროცესს: ჯერ შეამოწმეთ, ცნობილი ფორმატია თუ არა - ამაში ImHex-ის magic-დეტექცია და binwalk დაგეხმარებათ. შემდეგ იპოვეთ კოდი, რომელიც ფაილს კითხულობს ან ქმნის: .NET-ისთვის კარგად მუშაობს Rider, ნატიური კოდისთვის - Ghidra, IDA ან Binary Ninja, JVM ენებისთვის - Recaf. ძებნა უმარტივდება ფაილური შეყვანა-გამოყვანის გამოძახებებითა და ფაილის სახელის შემცველი სტრიქონებით. შემდეგ ამოიცანით ძირითადი სამშენებლო ბლოკები - მთელი რიცხვები, ლოგიკური მნიშვნელობები, სტრიქონები და მონაცემთა სტრუქტურები - და დაწერეთ Pattern ფაილი, რომელიც ნაპოვნს ადოკუმენტირებს და ამოწმებს.
ავტორი აღიარებს, რომ ყველა პროგრამა FEZ-ივით მარტივად არ იშლება, მაგრამ მიდგომა იგივე რჩება. სრული Pattern ფაილი ბლოგპოსტშია მიბმული, კითხვებისთვის კი იგი ImHex-ის Discord-სერვერზე გიპასუხებთ.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.