2009-10-13 14 views
5

Zostałem poproszony o przetworzenie niektórych plików serializowanych jako obiekty binarne (nie tekst/JSON niestety) Thrift, ale nie mam dostępu do programu lub programisty, który utworzył pliki, więc nie mam pojęcia o ich strukturze, kolejność w terenie itp. Czy istnieje sposób użycia bibliotek Thrift do otwarcia pliku binarnego i przeanalizowania go, uzyskania listy typów pól, wartości, zagnieżdżenia itp.?Jak można dokonać inżynierii wstecznej pliku binarnego?

+0

Zakładam, że mówisz o http://incubator.apache.org/thrift/ - możesz opublikować/oznaczyć język, którego używasz. – TrueWill

Odpowiedz

7

Niestety wygląda na to, że protokół binarny Thrift w ogóle nie w znaczący sposób znakuje; do dekodowania wydaje się zakładać, że masz plik .thrift w ręce, więc wiesz, że następne 4 bajty mają być liczbą całkowitą i nie są w rzeczywistości pierwszą połową zmiennoprzecinkowej. Wygląda na to, że utknąłeś w zasadzie, patrząc na pliki w edytorze szesnastkowym (lub odpowiedniku) i próbując wywnioskować pola w oparciu o dokładnie te wzorce, które widzisz.

Istnieje bardzo niewiele osób bity:

Każdy plik zaczyna się od numeru wersji, identyfikator protokołu smyczkową i sekwencji. Mapy zaczną się od 6 bajtów identyfikujących typy kluczy i wartości (pierwsze dwa bajty, jako kody całkowite) oraz liczbę elementów jako 4-bajtową liczbę całkowitą. Kody typów wydają się być standardowe (kanoniczna lokalizacja ich definicji wydaje się być TProtocol.h w Źródłach oszczędzania, na przykład wartość boolowska jest określona przez kod typu 2, ciąg znaków UTF-8 według kodu typu 16 i tak dalej) . Łańcuchy poprzedzone są 4-bajtowym polem długości całkowitej, a listy poprzedzone są typem (1 bajt) i 4 bajtową długością. Wygląda na to, że wszystkie pola liczbowe są zapisywane jako duże-endian, a zmiennoprzecinkowe są zapisywane w formacie IEEE (co powinno sprawić, że podwaja się stosunkowo łatwo).

Pliki TBinaryProtocol * w folderze Thrift zawierają dodatkowe pomocne informacje; na plusie jest wiele różnych implementacji, dzięki którym możesz przeczytać te, które są implementowane w języku, który najbardziej Ci odpowiada.

Przepraszam, wiem, że to prawdopodobnie nie jest pomocne, ale tak naprawdę wygląda na to, że wszystkie informacje są dostępne w formacie binarnym Thrift; Oczywiście format binarny został zaprojektowany z myślą, że zawsze będziesz znał dokładną specyfikację protokołu i że celem jest zminimalizowanie przestrzeni drutu, a nie uczynienie go łatwym do rozszyfrowania na ślepo.