2013-08-14 26 views
6

Tydzień temu znalazłem się w sytuacji, w której musiałem przeczytać binarny obiekt serializowany utworzony przez inną aplikację stworzoną przez kogoś innego. Miałem tylko plik SomeSerializedData.bin, więc próbowałem ręcznie odtworzyć definicję klasy dla nieznanego obiektu i mogłem to zrobić, ze względu na metadane w zserializowanym pliku. Dziwnie, nie mogłem znaleźć żadnego narzędzia w google..NET Metadane serializacji binarnej

Pytanie 1: Dlaczego nie ma narzędzia, które odtwarza definicję klasy z binarnego serializowanego pliku/danych?

I to prowadzi do mojego drugiego pytania

Q2: Czy istnieje taki przypadek, gdy jest to niemożliwe, aby przywrócić definicję klasy z danych odcinkach? (Zakładając, że nie jest on zaszyfrowany lub w jakikolwiek sposób zaciemniony, interesują mnie przypadki związane z "domyślnymi" właściwościami binarnego edytora .NET, aby wyłączyć informacje o typie i zawarte w nim metadane).

+2

Proszę nie tylko głosuj, powiedz mi, co jest nie tak, więc mogę poprawić pytanie. –

+0

Myślę, że czego szukasz, nazywa się odbicie (biorąc kod maszynowy i odwrócić go z powrotem do C#) mam rację? – Liran

+1

Czy masz kopię aplikacji, która utworzyła plik .bin? Jeśli tak, możesz go zdekompilować i spojrzeć na kod. Zobacz dotPeak: http://www.jetbrains.com/decompiler/ – dana

Odpowiedz

1

tego powodu, że nie istnieje, jest narzędziem, ponieważ często nie wystarczy, aby utworzyć typ, który zawiera tylko dane. Metody są często tak samo ważne jak dane, zwłaszcza w przypadku właściwości, które nie tylko ustawiają swoje prywatne zmienne. Nikt nie wie, jakie są te metody.

Po tym, może być przydatne narzędzie, które jest co najmniej w stanie wygenerować typ do przechowywania danych. Może będziesz pierwszym, który stworzy takie narzędzie?

2

Nie można deserializować danych binarnych bez znajomości Co w tym jest. Jedynym sposobem na to jest serializowanie go za pomocą JSON lub XML na przykład. Przykład ilustrujący:

Twoje imię "Casual" może być serializowane w ten sposób: 67,97,115,117,97,108. W przypadku, gdy nie zauważyłeś: odbywa się to przy użyciu kodu ASCII (jeśli nie popełniłem żadnych błędów). A więc wyobraź sobie, że nie wiesz, że dzieje się tak z ASCII, który mówi, że to nie jest tylko tablica z liczbami? Lub 3 tablice 2 liczb? Lub obiekt o ID 67 i obiekt o ID 117. Nikt nie wie, twoje zadanie jest niemożliwe.

Jedyną opcją jest komunikowanie się z osobą, która serializowała pierwotnie i pyta go, jak to się robi i jakie obiekty są serializowane w tym obiekcie binarnym.

poważaniem

+1

Mówimy o serializacji binarnej .NET, a nie serializacji niestandardowej. Moje pytanie nie polegało na tym, że mogę lub nie mogę zserializować nieznanego obiektu. (btw jest to możliwe ze względu na zawarte w nim dane meta -> pytania/17996701/deserializacja binarna-bez definicji obiektu) Moje pytanie brzmiało, czy można serializować z Binaryformatter (nie spersonalizowany!) bez tak wielu metadanych, które pomogłyby każdy, kto przywróci oryginalną definicję klasy obiektu. Dziękuję za odpowiedź i tak :) –

+0

@Casual * Moje pytanie brzmiało, czy możesz serializować za pomocą Binaryformatter (nie spersonalizowany!) Bez tak wielu metadanych, które pomogłyby każdemu w przywróceniu oryginalnej definicji klasy obiektu *, ** Nie ** twoje pytanie nie jest tym ... To nie jest równe * Czy jest taki przypadek, kiedy nie można przywrócić definicji klasy z danych zserializowanych? * –

1

Nie jestem pewien, czy w metadanych jest wystarczająco dużo informacji, aby ponownie utworzyć typ. Wyobraź sobie złożone (jak zagnieżdżone) wykresy obiektów. W poprzednim pytaniu problemem były typy członków (String vs int).

Jeśli chodzi o drugie pytanie, nie jestem pewien, co próbujesz osiągnąć. Nie jestem pewien, czy można użyć BinaryFormatter do wyprowadzania danych w sposób, który nie jest zbyt łatwy do inżynierii wstecznej, ale inne metody powinny być proste do wdrożenia.

+1

string vs int było tylko problemem, ponieważ zgadywał typy zamiast czytania rzeczywistych danych binarnych. – Will

2

Pytanie 1: Dlaczego nie ma narzędzia, które odtwarza definicję klasy z binarnego serializowanego pliku/danych?

Przypuszczam, że bardzo niewielu ludzi tego potrzebuje. Na początek serializacja binarna nie jest tak popularna jak XML, JSON i inne formaty, które są standaryzowane i są obsługiwane praktycznie w dowolnym miejscu.

Brak dokumentacji dotyczącej formatu binarnego. Aby to zrozumieć, należy zagłębić się w źródła .NET Framework. To nie jest zabawne.

Q2: Czy jest taki przypadek, gdy niemożliwe jest przywrócenie definicji klasy z danych zsekularyzowanych?

Wygląda na to, że format binarny zawiera wystarczającą ilość danych. Jeśli naprawdę potrzebujesz narzędzia do inżynierii wstecznej oryginalnych klas i ich pól z plików serializowanych, możesz zacząć od odczytu źródeł System.Runtime.Serialization.Formatters.Binary.BinaryFormatter, System.Runtime.Serialization.Formatters.Binary.ObjectReader i innych klas z mscorlib.

Jeśli jednak aplikacja, która utworzyła pliki, nie jest zaciemniana, sugeruję najpierw jej dekompilację. To będzie prawdopodobnie łatwiejsze.

P.S. Nie zapomnij skonsultować się z prawnikiem.

+0

#Athari Co masz na myśli przez "Nie zapomnij skonsultować się z prawnikiem". ? : P –

+1

@ Oprogramowanie do dekompilacji, którego nie posiadasz, jest nielegalne w wielu krajach. I przez posiadanie komercyjnego oprogramowania mam na myśli faktyczne posiadanie, nie kupowanie kopii do użytku, ponieważ wiele umów EULA uniemożliwia dekompilację. Jest kilka krajów, w tym Australia i Rosja, które zawsze umożliwiają dekompilację w określonych celach, zastępując wszystkie umowy EULA. Nie jestem pewien co do formatów plików i protokołów inżynierii wstecznej. Ogólnie rzecz biorąc, jeśli nie masz pewności, skonsultuj się z prawnikiem. P.S. To nie jest "#". Powiadomienia o komentarzach są zawsze wysyłane do autorów pytań i odpowiedzi. – Athari