Reversing/Inżynieria odwrotna w technice i w informatyce – wstęp

No i znów jestem. Dziś napiszę coś o ciekawym zastosowaniu technik badawczych. Aby jednak to zrobić, użyję dość dalekiej – nie tylko geograficznie kwestii – kwestii Chińskiej. Dzisiejsze Chiny nadal słyną z „podróbek” – choć Chińskie produkty są coraz lepszej jakości i bynajmniej nie ograniczają się do „tandety”. To już nie te czasy. Można Chinach dzisiaj mówić wiele. Ale tak, czy inaczej trzeba Chińczykom przyznać jedno. Ku wściekłości i rozpaczy świata zachodniego, sztukę kopiowania opanowali na bardzo wysokim poziomie i na skalę przemysłową. Ale czy tylko Chiny tak robiły ? Nie. ZSRR również korzystał zapewne (obok, lub w ramach szpiegostwa przemysłowego) z technik reversingu. Ba,czy również broniące dziś swoich praw firmy informatyczne jak Apple i Microsoft nie tylko korzystały z rozwiązań konkurencji (Xeroxa) ale i w razie potrzeby również dokonywały reversingu, podobnie jak firmy od hardware które dokonywały w latach 80-tych inżynierii odwrotnej swoich układów – po to,by stworzyć specyfikację a potem opracować inne – lecz kompatybilne – rozwiązania, różne od opatentowanych ?

W istocie tak było, a choćby technika reversingu „clean room” (nie mająca chyba wiele wspólnego poza nazwą z technologią produkcyjną cleanroom), polegająca na wykorzystanie reversingu do stworzenia specyfikacji a następnie wykonaniu własnego układu, wykorzystana do stworzenia BIOSu kompatybilnego z BIOSem koncernu IBM przez firmę Phoenix,a później inne firmy, przełożyła się na to,że IBM PC stał się standardem komputera osobistego, dzięki nasileniu wolnej konkurencji i obecności różnych rozwiązań. Oczywiście korporacja taka jak IBM mogłaby i na tym zarobić i tak mając odpowiednie podejście, w późniejszych latach, a to dlaczego tak nie było to kwestia,którą powinien rozważać kto inny. Świadczy o tym fakt, że stosujące otwarte standardy korporacje nie tylko na tym dziś nie tracą,ale i często zyskują dzięki intensywniejszej współpracy – często wchłaniając później korzystające z ich rozwiązań startupy . WIN-WIN z wolną konkurencją w tle. Ale czy inżynieria odwrotna, znana pod angielskimi terminami jako „reverse engineering” czy „reversing” ogranicza się do takich, często wątpliwych prawnie kwestii jak kopiowanie cudzych produktów ? Niekoniecznie. W istocie reversing może polegać np. na:

  • W przypadku produktów materialnych:
    • zrozumieniu i ewentualnemu skopiowaniu a nawet udoskonaleniu istniejącego rozwiązania technicznego
    • odtworzeniu zagubionej/utraconej dokumentacji produktu
    • znalezieniu właściwego sposobu na dokonanie samodzielnej naprawy,bądź naśladowania określonej techniki naprawczej
    • odtworzeniu dawnych technik o znaczeniu historycznym oraz odrestaurowanie / wykonanie możliwie repliki przedmiotu o znaczeniu historycznym
    • rozpoznanie lub odtworzenie procesu produkcyjnego i jego parametrów
  • W informatyce:
    • Poznawanie działania algorytmów szyfrujących celem deszyfracji komunikatu
    • Poznanie działania oprogramowania (tak cudzego programu jak i wirusa) i ewentualna reimplementacja w innym środowisku informatycznym (inny procesor,system itd.) bądź modyfikacja
    • Poznanie zastosowanych technik programistycznych i ewentualne ich wykorzystanie,bądź stworzenie rozwiązań dających podobne rezultaty bez naruszania patentów
    • Określenie specyfikacji urządzenia/oprogramowania – celem wytworzenia nowego,kompatybilnego
    • Wykrycie błędów programistycznych i luk oprogramowania którego kod źródłowy jest niedostępny

W istocie, część tych rozwiązań jest jak najbardziej legalna,natomiast część pozostałych zawadzać może o szpiegostwo przemysłowe. Nawet jeśli tak jest,to należy pamiętać,że zakazanie danych działań lub ich kryminalizacja , nigdy nie oznacza całkowitego wykluczenia danych działań w praktyce. (Gdyby było inaczej to przestępcy w Polsce nie posiadaliby broni, czy narkotyków, ponieważ to nielegalne). Oznacza to,że zgodnie z przysłowiem „dżina wypuszczonego z pudełka” bardzo trudno zamknąć w nim ponownie, całkowite powstrzymanie postępu technologicznego jest właściwie niemożliwe. Należy też zwrócić uwagę, że inżynieria odwrotna zastosowanych produktów materialnych, jak najbardziej mogłaby być wykorzystana celem wykrycia ewentualnych wad zastosowanego procesu produkcyjnego, oraz celowego wykorzystania jego słabości – szczególnie w wojskowości,ale nie tylko – w literaturze fachowej dotyczącej bezpieczeństwa znany jest przykład amerykańskich inżynierów, którzy dokonali inżynierii odwrotnej automatów do gier hazardowych,aby wygrywać. Wracając do „sprawy Chińskiej”. Chińczykom pewnych rzeczy nie udało się skopiować, pomimo usilnych starań. Do takich rzeczy należą silniki lotnicze. W dalszej części tego tekstu, spróbuję również wyjaśnić potencjalne powody. Tekst ten również wyjaśni, dlaczego jednak łączę przypadki reversingu informatycznego oprogramowania i produktów materialnych. Jeśli się zastanowić,wbrew pozorom, stosowane w tych dziedzinach metodologie mają podobny sens i jedna może inspirować drugą – zarówno, jeśli chodzi o koncepcję znalezienia sposobu na osiągnięcie powtórnego wykorzystania rozwiązania – jak i przeciwnie – koncepcję sposobu utrudnienia, lub wręcz uniemożliwienia czegoś podobnego. Jak wspominałem, inżynieria odwrotna jest techniką badawczo-(re)produkcyjną, zmierzającą do poznania struktury i działania obiektu badań i jego ewentualnego odtworzenia. Co za tym idzie oczywiście należy przeprowadzić:

  • Badania zmierzające do określenia jego struktury – najlepiej w sposób nieniszczący, jednak jeśli dysponować się może większą (bądź w informatyce) nieograniczoną liczbą kopii obiektu badań – również w sposób inwazyjny
  • Badania jego zachowania i działania w możliwie naturalnym środowisku/środowiskach w których obiekt badań pracuje / mógłby pracować.
  • Badania zmierzające do określenia cech charakterystycznych i ograniczeń procesu produkcyjnego (oraz porównać go z dostępnymi sobie procesami produkcyjnymi).

Wymaga zaznaczyć,że przeprowadzenie takich badań wymaga dostatecznych kwalifikacji badacza/badaczy w danej dziedzinie.Przez „dostateczne” rozumiem „potrafi więcej,niż zaprojektować coś samodzielnie” i zna całkiem dziedzinę,w której przeprowadza działania,o chakterze reversingowym. Ponadto, z naturalnych względów analiza oprogramowania, bądź obiektu materialnego ,o którym nic nie wiemy, powoduje znacznie większe trudności, niż analiza czegoś, o czym mamy możliwie sporo informacji nawet specjaliście. W końcu, jeśli ktoś nie wie co to są tosty, nie będzie rozumieć tego czym dokładnie jest toster i tym,co jest istotne w procesie jego działania – choć może, możliwie prawidłowo, nadal określić jego budowę, przy zachowaniu odpowiedniej staranności i doboru właściwości / właściwego materiału, co umożliwia, przynajmniej częściowe skopiowanie jego funkcjonalności w praktyce. Istotne jest jednak wtedy zebranie kompletnych – ba, często wręcz nadmiarowych danych na temat obiektu badań, przy użyciu najnowocześniejszych możliwych narzędzi – które, w praktyce i tak mogą być prymitywne, bądź nieadekwatne, w porównaniu z napotkanym problemem. Odkrycie statku kosmicznego obcej cywilizacji na ziemi wcale nie musiałoby się więc przełożyć na znaczne rozwinięcie technologii podróży kosmicznej.Choć oczywiście mogłoby znacznie ułatwić sprawę, o ile ta cywilizacja byłaby na tyle podobna do naszej,by można było zrozumieć jak działają jej urządzenia. Ponadto, inżynieria odwrotna badając zastosowanie danej koncepcji ma ten naturalny problem,że nie zawsze da się określić, co było błędem wykonawcy obiektu badań/wynikiem eksploatacji, lub niewłaściwego przechowywania, a co jego naturalnych cech. Ujmując to dowcipnie: kopiując zardzewiały gwóźdź, nie każdy musi zauważyć,że gwóźdź nie musi być zardzewiały – zwłaszcza, jeśli kopiuje się coś bardziej zaawansowanego technicznie, jak zardzewiały gwóźdź. Reguły są niezwykle pomocne, lecz nie wszystkie reguły są znane publicznie. Co gorsza, (szczególnie w przypadku produktów materialnych, ale nie tylko) informacja na temat procesu produkcyjnego może być utracona, w rezultacie zastosowania danego procesu wytwarzania, a informacje z nim powiązane mogą być również zmienione,lub zatarte/usunięte w inny sposób. Dla przykładu:

  • Obróbka cieplna lub chemiczna stopów metali może zmienić skład chemiczny stopu startowego – lokalnie lub w całym stopie (to samo zresztą dotyczy polimerów i innych materiałów)
  • W przypadku wielokrotnego kucia i wielokrotnej obróbki cieplnej pewne parametry procesowe mogą zostać zatarte lub utracone.

Ale też:

  • Po kompilacji do wersji binarnej utracone mogą być pewne dane dotyczące języka programowania, i wykorzystanych bibliotek oraz planowanego algorytmu i ewentualnej specyfikacji programu w UML.

Samo prowadzenie analizy produktu materialnego konieczne jest określenie:

  • Wymiarów odtwarzanego obiektu /obiektów wraz z tolerancjami i pasowaniami
  • Charakteru powierzchni
  • Uzyskanie porównywalnych właściwości materiałowych – takich jak np.:
    • Skład chemiczny i fazowy
    • Morfologia i struktura
    • Właściwości mechaniczne,plastyczne i zmęczeniowe
    • Twardość
    • Odporność na zmęczenie materiałów
    • Odporność chemiczna
    • Wprowadzone naprężenia w materiale
    • itd.

Jeśli chodzi o tolerancje,pasowania i charakter powierzchni pod względem ekonomicznym i praktycznym ważne jest określenie jakie są tolerancje i które z nich mają krytyczne znaczenie dla prawidłowego działania produktu oraz określenie prawidłowych punktów bazowych. Samych pomiarów dokonać tego można poprzez zastosowanie:

  • standardowych narzędzi pomiarowych wykorzystujących metody dotykowe i bezdotykowe
  • skanerów laserowych 3d
  • itp.

Określenie tolerancji wymiarowych,choć kluczowe, może zostać dokonane:

  • korzystając z wiedzy, na temat innych elementów produktu i powszechnej wiedzy inżynierskiej / standardów, uwzględniając szczególnie czytelność, charakterystykę procesu produkcyjnego (jeśli jest dostatecznie znany) i łatwość realizacji pomiarów (np. GD&T)
  • eksperymentalnie metodą prób i błędów (testowanie prototypów uzyskanych metodami rapid prototyping [wiki: PL, ANG).

Na ustalenie składu chemicznego,fazowego i wielu innych parametrów materiałowych istnieje bardzo wiele specyficznych metod charakterystycznych dla inżynierii materiałowej i fizyki ciała stałego. Są to np.:

  • Analiza rentgenowska
  • Mikroskopia optyczna
  • Różne techniki mikroskopii elektronowej – SEM,TEM
  • Spektroskopia (masy ale nie tylko)
  • Techniki nieniszczące – np. ultradźwiękowe
  • Technologia FIB
  • i wiele wiele innych rozwiązań

Należy pamiętać,że kwestią pierwszorzędną jest nie uzyskanie w miarę identycznej struktury,lecz raczej w miarę identycznych krytycznych właściwości, wszelkie zaś zmiany zmierzające do poprawienia właściwości produktu – nawet przy wykorzystaniu innych rozwiązań są wysoce wskazane. Krytyczne właściwości zaś, jak zwykle są bardzo trudne do ustalenia bez zewnętrznych informacji,bądź przeprowadzenia eksperymentów. Ponadto, w praktyce działanie urządzeń materialnych, powinno być badane poprzez wykorzystanie m.in. szeregu sensorów (uwaga: tu szczególnie sensorem może być nawet kamera) i narzędzi pomiarowych poza obiektem w trakcie działania, jak również (co byłoby wskazane) wewnątrz obiektu badań inżynierii odwrotnej, celem określenia parametrów i samego działania urządzenia. Przydatne jest również określenie przyczyn ewentualnej usterki, poprzez określenie np. efektów zmęczeniowych,czy korozyjnych („czas życia” produktu poddanego reversingowi). W praktyce uruchomienie urządzenia / jego fragmentów i wykonanie pewnych testów, to niezbędne minimum. Jak widać, przy produktach materialnych, dużo większego znaczenia nabierają koszty przeprowadzania prób i eksploatacji, sam zaś proces inżynierii odwrotnej ma dość dobrze określone reguły i może mieć duże szanse powodzenia. Mimo to, należy pamiętać, że zarówno wykorzystanie sensorów wewnątrz badanego obiektu napotyka na ograniczenia techniczne (odpowiednio małe i odporne sensory) i ekonomiczne. W praktyce, wiele stwierdzeń ma charakter hipotez przeprowadzonych nie wprost,a każda zastosowana metoda analityczna posiada własne ograniczenia i wady,mogące spowodować błąd. Wspomniany przykład problemu z odtworzeniem przez Chiny silników lotniczych z Rosji prawdopodobnie nie wynika głównie z użytych stopów (to rozwiązania zachodnie koncentrują się na lepszych stopach i materiałach w lotnictwie),lecz na braku dostatecznie precyzyjnej bazy przemysłowej i mierniczej, oraz wynikają z braku dostatecznego zrozumienia fizycznych zasad działania takich silników (brak dostatecznej kwalifikacji i wiedzy kadr) ,co wobec braku dostatecznej liczby sensorów wewnątrz działającego silnika utrudniać może zrozumienie koniecznych szczegółów i w konsekwencji wymaga zastosowania metody prób i błędów. W praktyce produkcyjnej zabezpieczania koncepcji produktu, stosunkowo niewiele stoi na przeszkodzie wprowadzania celowych „udziwnień” procesu produkcyjnego jak i swego rodzaju mechanizmów samozniszczenia w niektórych mechanizmach czy układach elektronicznych. W pewnych warunkach możliwe jest też dobranie specyficznej technologii produkcyjnej przez specjalistów,celem utrudnienia reversingu i ewentualnego stworzenia rozwiązania bliskiego duplikatowi. Dla przykładu spotkałem się ostatnio z problemem, który rozwiązywał mój ojciec – z wykształcenia ślusarz-mechanik, w praktyce – mechanik hobbysta. Pewien element samochodowy był bardzo kosztowny (a producent nie wytwarza części zamiennych),a żeby go naprawić trzeba było wykonać pewną „kostkę” z odpowiednio rozmieszczonymi otworami.Cały problem polegał jednak na tym,ze położenie tych otworów nie było jakoś symetryczne (kiedyś było to pewnie zabezpieczenie chroniące właśnie przed mechanikami-hobbystami i nie autoryzowanymi serwisami,aby wymienić całe urządzenie a nie jego część), stąd wykonanie pomiarów ich położenia było w praktyce bardzo trudne bez dokonania wielu pomiarów (uszkodzony oryginał bynajmniej nie był prostokątną płytą) – mimo braku konieczności stosowania wyrafinowanych tolerancji (gdyby jednak było trzeba sprawa wyglądałaby inaczej). Ale mojemu ojcu udało się to obejść (inaczej bym o tym nie pisał). Jak ? Wystarczy pomyśleć, do czego można wykorzystać dostatecznie cienką tekturową kartkę. 😀 Jednak kto nie wpadnie na pomysł obejścia danego rozwiązania, nie zrobi tego i tyle. Większość ludzi nie pracuje z prymitywnym sprzętem, większość ludzi nie potrzebuje być osobą pomysłową – lub wręcz nie jest. W dzisiejszych czasach można zastosować naprawdę skomplikowane rozwiązania przeciwdziałające inżynierii odwrotnej produktu. Trzeba jednak wiedzieć jak to zrobić… Przejdźmy do kwestii informatycznych. W informatyce reversing dotyczy głównie oprogramowania lub jego fragmentów – czy to zapisanego na dysku, czy to funkcjonującego w pamięci komputera. Zarówno środki jak i stosowane odpowiedzi są tutaj bardziej zaawansowane – lecz tu również ich skuteczność bywa różna. Jeśli chodzi o analizę kodu stosowna jest:

  • Disasemblacja kodu – czyli sprowadzenie kodu do instrukcji najbliższego procesorowi języka jakim jest asembler
  • Dekompilacja – czyli próba sprowadzenia kodu do języka wysokiego poziomu.

Pamiętać należy o fakcie, że niektóre kompilatory są stosunkowo uniwersalne – jak GCC i mogą być wykorzystane dla wielu architektur, jak i mogą być przystosowane do konkretnej architektury procesora, tak jak kompilatory Intela. Przekłada się to nie tylko na szybkość pracy kodu na danej architekturze procesora,ale też na nieco inny kod danego asemblera. Sama disasemblacja wymaga zatem znajomości cech charakterystycznych dla danego kompilatora, oraz procesora, oraz zrozumienia instrukcji asemblera. Konieczna jest też stosunkowo duża wyobraźnia,ponieważ stosunkowo wiele instrukcji asemblera przekłada się na pojedynczą instrukcję języka wysokiego poziomu. Problem dekompilacji to problem sprowadzenia kodu z powrotem do poziomu języka wysokiego poziomu. Zależnie od tego,czy język jest:

  • kompilowany do kodu binarnego jak C czy C++
  • sprowadzany do interpretowalnego pseudokodu jak Java czy C# (MSIL / .NET)

Pseudokod jest stosunkowo łatwiejszy do dekompilacji, ze względu na pozostawienie szeregu tagów w kodzie (możliwe do usunięcia np. podczas obfuskacji) jak i na bardziej „wysokopoziomowy” jego charakter, natomiast kwestia dekompilacji kodu binarnego napotyka na większe przeszkody i zazwyczaj tego rodzaju kod jest dużo mniej zrozumiały. Jako zabezpieczenia przed tego typu rozwiązaniami jak dekompilacja i disasemblacja stosuje się:

  • Szyfrowanie kodu (szczególnie różnego rodzaju wirusy – najbardziej prymitywne rozwiązania wykorzystują do szyfrowania operację XOR)
  • Obfuskacja („zaciemnianie”) celem skomplikowania kodu dla:
    • programisty (np. rozrzucenie operacji po kodzie)
    • dekompilatora (wprowadzenie nie obsługiwanych przez dekompilator instrukcji)
  • Unieszkodliwienie disasemblera (z reguły wymaga jednak znajomości stosowanego środowiska i dostosowania do niego, polega na wprowadzeniu instrukcji z którymi program tego typu sobie nie poradzi,jako przykład podaje się instrukcję GOTO w pseudokodzie języka Java)

Jednak również przeciwko tego typu rozwiązaniom istnieją odpowiednie rozwiązania i narzędzia programistyczne służące do deobfuskacji – dostępne np. [tutaj] Jeśli chodzi o określenie funkcjonalności konieczne jest przeprowadzenie testów z operatorem,lub testów zautomatyzowanych mających określić funkcjonowanie aplikacji. Specjalną kategorię takich testów są testy przeprowadzane na wirusach. Stosunkowo bezpieczną metodą przeprowadzania takiego testu jest wirtualizacja. Znane są jednak również metody na wykrycie środowiska wirtualizacji przez wirusa – a tym samym znaczne utrudnienie reversingu. Zdecydowanie najgorsza sytuacja jest jeśli chodzi o ślady procesu produkcji aplikacji,rozpoznania wymaganych funkcjonalności i rozpoznanie braków funkcjonalności (szczególnie w systemach bezpieczeństwa). Niemal niemal niemożliwe jest określenie oryginalnego środowiska testowego i specyfikacji klienta. Osobiście nie uważam,że zawarłem w tym artykule bardzo dużo informacji mimo jego długości. Jest to jak zwykle cała dziedzina wiedzy,której można się uczyć przez lata – i do której możliwe,że potrzebny jest – podobnie jak w przypadku tworzenia wynalazków – talent.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s