2013-02-21 12 views
6

W rzeczywistości Dropbox zrobił to bardzo dobrze, udało im się zabezpieczyć swoją aplikację na pulpicie wykonaną w Pythonie; Dużo się nad tym zastanawiałem, ale nie ma lepszego rozwiązania niż obfuskacja, co nie jest zbyt bezpiecznym rozwiązaniem, a zobaczysz gdzieś swój kod.Obfuscowanie kodu bajtowego python poprzez mutację interpretera

Słuchałem sesji wykonanej przez Giovanni Bajo (założyciel PyInstaller), powiedział Dropbox to robi:

  1. Bytecode-kodowania przez rekompilacji tłumacza CPython, a przez ten standard CPython interpreter nie będzie w stanie go uruchomić, tylko rekompilowany interpreter cpython.
  2. Wszystko, co musisz zrobić, to przetasować liczby poniżej numeru define loadup 8.

Nigdy nie przeszukiwałam kodu źródłowego Pythona, więc nie będę twierdził, że w pełni rozumiem powyższe słowa.

Muszę usłyszeć głos ekspertów: jak to zrobić? A jeśli po ponownej kompilacji będę mógł spakować moją aplikację przy użyciu dostępnych narzędzi, takich jak PyInstaller?

Aktualizacja:

Zrobiłem rozeznanie odnośnie jak Dropbox robi tego typu zaciemniania/mutacji i znalazłem to:

Według Hagen Fritsch, robią to w dwóch etapach:

  1. Używają one szyfru TEA wraz z RNG wysianymi przez pewne wartości w kodzie obiektu każdego modułu python. One dostosowane interpreter odpowiednio tak, że

    a) Odszyfrowuje moduły i

    b) uniemożliwia dostęp do odszyfrowanych kodowej obiektów.

    Byłaby to prosta ścieżka pozwalająca odszyfrować wszystko i zrzucić moduły za pomocą wbudowanego programu Marshall.

  2. Inną używaną sztuczką jest ręczne szyfrowanie kodów operacyjnych. Niestety, można to naprawić tylko półautomatycznie, dlatego ich jednolphabetyczny algorytm podstawiania okazał się dość skuteczny pod względem wygranej trochę czasu.

wciąż chcę więcej wgląd w jaki sposób można to zrobić, bardziej skończy, nie wiem, w jaki sposób deszyfrowanie dzieje się w tym procesie ... Chcę głos wszystkich ekspertów tutaj ... wspólne faceci gdzie jesteś.

+0

Podobne, bardziej aktualne pytanie: [Undecompilable Python] (http://stackoverflow.com/q/15087339/222914) –

+0

Dzięki Janne. Bardzo podobne do tego, co powiedziałeś, dodając do tego, usunięcie modułów introspekcji w nowo utworzonym/przetasowanym tłumaczu. – securecurve

+0

na koniec dnia kod bajtowy będzie można wyodrębnić z pamięci, a następnie osoba atakująca może porównać nowy przetasowany kod bajtowy ze standardowym, aby wiedzieć, w jaki sposób tasowanie było; ale, bądźmy uczciwi, czy ten sam napastnik nie może dekompilować programu napisanego w C, aby uzyskać kod źródłowy, nic nie jest zabezpieczone przed odwróceniem, to kompromis ... tak widzę rzeczy, może jestem w błędzie . – securecurve

Odpowiedz

2

Przypuszczam, że chodzi o przetasowanie liczb w include/opcode.h. Nie widzę tam jednak żadnego #define loadup, ale może to odnosi się do starej wersji Pythona. Nie próbowałem tego.

Spowoduje to zaciemnienie plików .pyc, aby nie można było ich przeglądać za pomocą jakichkolwiek narzędzi rozpoznających zwykłe pliki .pyc.Może to pomóc ci ukryć niektóre środki bezpieczeństwa w twoim programie. Osoba atakująca może jednak (na przykład) wyodrębnić niestandardowego interpretera języka Python z pakietu aplikacji i wykorzystać go do sprawdzenia plików. (Wystarczy uruchomić interaktywny interpreter i rozpocząć dochodzenie przez zaimportowanie i użycie polecenia dir w module).

Należy również pamiętać, że pakiet na pewno będzie zawierał niektóre moduły ze standardowej biblioteki Python. Jeśli napastnik odgadnie, że przetasował kod opcji, może przeprowadzić porównanie bajt-by-bajt między wersją a normalną wersją standardowego modułu i odkryć w ten sposób swoje kody opcyjne. Aby zapobiec temu prostemu atakowi, można zabezpieczyć moduły z odpowiednim szyfrowaniem i spróbować ukryć krok odszyfrowywania w tłumaczeniu, jak wspomniano w zaktualizowanym pytaniu. Zmusza to intruza do użycia debugowania kodu maszynowego w celu wyszukania kodu deszyfrującego.


nie wiem jak deszyfrowanie dzieje się w tym procesie ...

byłoby zmodyfikować rolę tłumacza, który importuje moduły i wstawić tam swoją deszyfrowania kod C.

+0

Cóż, czy to wszystko? Zmieniamy tylko liczby w 'opcode.h', rekompilujemy interpreter python, pakujemy aplikację, a następnie wysyłam ją do klienta? Czy powstanie aplikacja podobna do Dropbox z takim samym poziomem bezpieczeństwa? – securecurve

+0

@securecurve Rozszerzyłem moją odpowiedź. Nie wiem, jaki poziom zabezpieczeń ma aplikacja Dropbox. –

+0

W tym momencie ekstrakcja tych kodów nie będzie prosta, atakujący będzie musiał użyć deasemblerów/dekompilatorów i narzędzi do debugowania, aby obejrzeć te kody w pamięci ... Czy mówię poprawnie, czy będzie inaczej? – securecurve

Powiązane problemy