Źródło obrazu: pixabay.com

Python jest językiem wysokiego poziomu. Chociaż wielu z was może myśleć, to nie jest język programowania. To jest język skryptowy. Nigdzie nie zbliża się do kodu maszynowego ani języka maszynowego. Więc co sprawia, że ​​Python jest tak interesujący? Jeśli masz jakieś doświadczenie w pentestowaniu lub rozmawiałeś z wieloma ekspertami od bezpieczeństwa sieci lub analizatorami złośliwego oprogramowania, zawsze sugerowali oni python jako główny język do tworzenia złośliwego oprogramowania lub exploitów.

Chociaż niektórzy ludzie wolą C, C ++ lub perl, osobiście głosowałbym na Pythona. Ponieważ jest on nie tylko użyteczny jako narzędzie do pisania programu, ale także użyteczne jest jego złamanie.

Co to jest inżynieria odwrotna?

Inżynieria odwrotna to bardzo szeroka koncepcja. Nie można tego tak naprawdę zdefiniować za pomocą prostych składni. Właściwą koncepcją inżynierii odwrotnej jest rozbicie kodu na prostsze części, zrozumienie go, zmodyfikowanie i udoskonalenie zgodnie z naszym własnym celem, a następnie ponowne złożenie go w celu dopasowania do naszych potrzeb. Aby było to nieco prostsze, pozwólcie, że podam kilka skrajnie powszechnych przykładów.

Weźmy przykład telefonu komórkowego z Androidem. Producenci tworzą magazyn akcji i sprzedają go swoim konsumentom. Ale przez większość czasu zawiera dużo wzdęć i staje się opóźniony. Tak więc na stronach takich jak XDA i androidcentral znajdują się ludzie, którzy dokonują inżynierii wstecznej w celu uzyskania dostępu do ROM, ulepszają go i sprawiają, że jest odporny na opóźnienia. Jednym praktycznym przykładem byłby CyanogenMod Rom.

Ale to był tylko przykład, który pozwoli ci zrozumieć, co to jest. Odwrotna inżynieria ma tę samą koncepcję, ale jest zbyt skomplikowana, by modyfikować ROM.

Kompilacja i Python

Jeśli masz doświadczenie w Pythonie, wiesz, że pisząc skrypt Pythona, może to być wirus, ładunek, trojan lub cokolwiek to plik, będzie działał tylko na komputerach, na których jest zainstalowany Python. Powiedzmy, że napisałem doskonałego trojana komputerowego, który może ominąć dowolny program antywirusowy, i zaczynam wdrażać go w systemie Windows, ale jeśli system Windows nie ma zainstalowanego interpretera Pythona, to nie będzie działać. Trzeba więc skompilować każdy plik napisanego skryptu Pythona w pliku wykonywalnym, a następnie wdrożyć go w systemie Windows.

Pliki wykonywalne Windows dla inżynierii odwrotnej

Teraz wiesz, że musimy skompilować skrypty Pythona, aby działały w systemie Windows, musisz także wiedzieć, że musi istnieć kompilator, który konwertuje skrypty Pythona na pliki wykonywalne. Tak jest. Nazywa się Py2exe. Py2exe to prosty instalator, który konwertuje skrypty Pythona na samodzielne programy Windows. Teraz jest też inne narzędzie, które konwertuje pliki wykonywalne Windows napisane w pythonie z powrotem na skrypty pythona. Nazywa się Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder to narzędzie do ponownej kompilacji / inżynierii wstecznej plików wykonywalnych wygenerowanych przez pyinstaller bez dostępu do kodu źródłowego. Po uruchomieniu EXE - jest rozpakowywany w pamięci. Obejmuje to pliki .pyc (kod python, który jest konwertowany na kod bajtowy). Zasadniczo narzędzia, takie jak pyinstaller i py2exe, to biblioteki pakietów i zależności, aby można było uruchomić „samodzielny” plik EXE bez konieczności ich pobierania lub przygotowywania komputera za pomocą interpretera python.

Istnieje również inny zestaw narzędzi, który prowadzi do bardzo blisko kodu źródłowego. Nazywa się PyRetic, co oznacza Bytecode odwróconego kodu Pythona. Ten zestaw narzędzi pozwala zabrać obiekt z pamięci do kodu źródłowego, bez potrzeby dostępu do kodu bajtowego bezpośrednio na dysku. Może to być przydatne, jeśli aplikacje pyc na dysku są zaciemnione na jeden z wielu sposobów.

Polecane kursy

  • Szkolenie z Java Hibernate
  • Szkolenie certyfikacyjne online w Java Spring
  • Program WordPress
  • Szkolenie certyfikacyjne w Ruby

Inżynieria odwrotna

Teraz powyższa część jest łatwa do zrozumienia i praktycznie zrobisz to, gdy przynajmniej opanujesz podstawową wiedzę w Pythonie. Ale nie zawsze tak jest. Czasami nie masz żadnej dokumentacji ani komentarzy w skrypcie python, a są też pliki, które możesz sam zrozumieć. Teraz jest niesamowita książka z tej strony, ale nie będę się nad tym zbytnio koncentrować.

Książka nazywa się „Skutecznie współpracuje ze starszym kodem”. Książka jest niezależna od Pythona lub jakiegokolwiek innego języka i da ci pomysł na inżynierię odwrotną w prawie każdym języku. Głównym celem, gdy próbujesz zrozumieć fragment kodu, jest powód, dla którego chcesz go zrozumieć.

Bez względu na to, czy chcesz zmodyfikować kod, aby go zmodyfikować, czy też przenieść go, podejście do obu byłoby zupełnie inne. Tak więc oprzyrządowanie starszego kodu za pomocą baterii i rusztowań testów oraz śledzenia / rejestrowania jest kluczową ścieżką długiego, twardego hasła do zrozumienia i modyfikacji w sposób bezpieczny i odpowiedzialny.

Narzędzia inżynierii odwrotnej

Teraz jest inna metoda, aby ułatwić, którą można wykonać, wykonując powyższe kroki. Istnieje strona o nazwie Epydoc. W tej witrynie sprawdzi kod i przygotuje dla niego dokumentację. Wynik nie będzie tak dobry, jak oryginalna dokumentacja, ale przynajmniej da ci pojęcie, jak dokładnie działa. W ten sposób możesz rozpocząć pisanie własnej dokumentacji, a po częściowym napisaniu dokumentu możesz ponownie wygenerować pozostały częściowy dokument ze strony dla pozostałej części.

Możesz nawet użyć narzędzia IDE do analizy kodu. Zazwyczaj zapewnia to uzupełnienie kodu, ale co ważniejsze w tym przypadku, umożliwia kliknięcie zmiennej, przytrzymując klawisz Ctrl, aby zobaczyć, skąd pochodzi. To naprawdę przyspiesza, gdy chcesz zrozumieć kod innych ludzi.

Musisz także nauczyć się debuggera. W trudnych częściach kodu będziesz musiał przejść przez nie w debuggerze, aby zobaczyć, co faktycznie robi kod. Pythons pdb działa, ale wiele IDE ma zintegrowane debuggery, które ułatwiają debugowanie. PyReverse z Logilab i PyNSource z Andy Bulka są również pomocne w generowaniu diagramów UML.

Istnieje proces tworzenia modelu klasy UML na podstawie danych wejściowych kodu źródłowego. Dzięki temu możesz odwrócić migawkę bazy kodu do klas UML i dalej tworzyć diagram klas. Wprowadzając treść kodu do wizualnego modelu UML, pomaga to programistom lub inżynierom oprogramowania w przejrzeniu implementacji, zidentyfikowaniu potencjalnych błędów lub braków i szukaniu możliwych ulepszeń.

Poza tym programiści mogą odwracać bibliotekę kodów jako klasy UML i budować z nimi model, na przykład odwracając ogólne ramy kolekcji i opracowując własne ramy, rozszerzając ogólne. W tym rozdziale omówimy natychmiastowe odwrócenie Pythona.

Obiekty i podkłady

Aby w pełni zrozumieć wewnętrzne działanie Pythona, należy najpierw zapoznać się ze sposobem kompilacji i wykonywania kodu w Pythonie. Kiedy kod jest kompilowany w Pythonie, wynikiem jest obiekt kodu. Obiekt kodu jest niezmienny i zawiera wszystkie informacje potrzebne interpreterowi do uruchomienia kodu. Instrukcja kodu bajtowego jest reprezentowana jako jednobajtowa wartość kodu operacyjnego wraz z argumentami, gdy jest to wymagane. Dane są przywoływane za pomocą indeksu do jednej z pozostałych właściwości obiektu kodu.

Łańcuch bajtów wygląda następująco:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

Kod bajtowy Pythona działa na stosie elementów. Bardziej przedsiębiorczym rozszerzeniem byłoby próba dekompilacji kodu bajtowego z powrotem na czytelny kod źródłowy Pythona, wraz z nazwami obiektów i funkcji. Kod Pythona może być dystrybuowany w formie binarnej przy użyciu modułu marszałka. Ten moduł zapewnia możliwość serializacji i deserializacji obiektów kodu za pomocą funkcji przechowywania i ładowania.

Najczęściej spotykanym formatem binarnym jest skompilowany plik Pythona (.pyc), który zawiera magiczną liczbę, znacznik czasu i obiekt zserializowany. Ten typ pliku jest zwykle wytwarzany przez interpreter Pythona jako pamięć podręczna skompilowanego obiektu, aby uniknąć konieczności wielokrotnego analizowania źródła. Techniki te polegają na łatwym dostępie do kodu bajtu i informacji o typie.

Za pomocą kodu bajtowego obiektu kodowego logikę kodu można modyfikować, a nawet całkowicie zastępować. Wyodrębnienie informacji o typie może pomóc w zrozumieniu projektu programu oraz identyfikacji funkcji i celów obiektowych.

Zaciemnianie i utrwalanie kodu bajtu aplikacji zawsze będzie wyścigiem między implementatorami a tymi, którzy chcą go złamać. Aby podjąć próbę obrony przed odczytaniem kodu bajtowego, logicznym pierwszym krokiem jest opracowanie rozwiązania do tłumaczenia środowiska wykonawczego.

Właściwości obiektu kodu mogą być przechowywane w dowolnym podpisanym, zaszyfrowanym lub w inny sposób zaciemnionym formacie, który jest zaciemniony lub przetłumaczony w czasie wykonywania i użyty do utworzenia nowego obiektu. Można nawet zmienić sposób, w jaki wyszukiwania nazw zmiennych działają w interpretatorze, aby zaciemnić informacje o nazewnictwie. Dodając warstwę translacji między wyszukiwaniem rzeczywistych nazw a nazwami w kodzie źródłowym, programista może dodatkowo ograniczyć próby cofania.

Wniosek

Teraz, po przeczytaniu ich wszystkich, możesz poczuć potrzebę pójścia i wypróbowania kilku opłat za przejazd. Oto kilka narzędzi, które mogą pomóc Ci w inżynierii wstecznej w kodzie Pythona:

  1. Paimei
  1. Sulley
  1. Kolekcja Carrera
  1. PyEmu
  1. IDAPython
  1. ImmDbg

Wszystkie są świetnymi fragmentami kodu, ale tak naprawdę wyróżniają się, gdy są używane razem. Pamiętaj, że nie jest to pełna lista, tylko te, których najczęściej używam i myślę, że pokazuje, jak elastyczność Pythona może sprawić, że tak złożone zadanie, takie jak inżynieria odwrotna, będzie możliwe do zarządzania.

Polecane artykuły

Oto kilka artykułów, które pomogą ci uzyskać więcej szczegółów na temat inżynierii odwrotnej w Pythonie, więc po prostu przejdź przez link.

  1. 25 najbardziej niesamowitych pytań i odpowiedzi podczas wywiadu w języku Python
  2. Rozpocznij pracę z Python i Django do tworzenia aplikacji internetowych
  3. Jakie są zalety i ograniczenia używania Pythona?
  4. Kariera w Pythonie
  5. Narzędzia inżynierii odwrotnej