Obfuskuj, wirtualizuj i chroń skrypty Python .py dzięki polimorficznemu szyfrowaniu łańcuchów, silnikowi VM, transformacjom automatem stanów, kontroli integralności i antydebugowaniu — przez GUI, CLI, narzędzie online lub API.
Python Obfuscator chroni własnościowe skrypty .py poprzez zmianę nazw, polimorficzne szyfrowanie ciągów znakowych i liczb całkowitych, spłaszczanie przepływu sterowania, automat skończonych stanów (FSA), silnik VM, samoobronne kontrole integralności, linker ochrony oraz sondy antydebugowania i antyanalizy.
Python to wieloplatformowy, dynamicznie typowany język skryptowy szeroko stosowany do automatyzacji, usług backendowych, przetwarzania danych i narzędzi wewnętrznych. Ponieważ pliki .py są dystrybuowane jako czytelny kod źródłowy, lub są trywialnie dekompilowane z bajtkodu .pyc, własnościowa logika i osadzone sekrety są narażone na dostęp każdego, kto ma dostęp do pliku, chyba że kod źródłowy zostanie obfuskowany.
Skrypty są zazwyczaj dystrybuowane jako zwykłe pliki .py lub proste paczki. Ta wygoda oznacza, że każdy z dostępem do pliku może odczytać całą logikę, poszukać danych uwierzytelniających lub kluczy API w ciągach znakowych i wykraść Twoje algorytmy, chyba że podejmiesz dodatkowe kroki, aby ukryć zamysł programu.
Python Obfuscator wykorzystuje najnowocześniejsze strategie obfuskacji, takie jak polimorficzne szyfrowanie ciągów znakowych, szyfrowanie liczb całkowitych i zmiennoprzecinkowych, przepisywanie mieszanych wyrażeń boolowsko-arytmetycznych oraz szum w postaci przynęt. Wynik ukrywa literały i strukturę, zachowując przetestowane zachowanie w czasie działania.
Wybrane instrukcje są przenoszone do losowo generowanego silnika VM z przemieszanymi tabelami dyspozycji, fałszywymi opcode'ami i zaciemnioną pętlą dyspozytora. Analitycy muszą interpretować maszynę wirtualną zamiast czytać zwykły kod Python.
Obfuskacja automatem skończonych stanów (FSA) przepisuje liniowe bloki instrukcji Python na dwustanowe automaty z nieprzezroczystymi harmonogramami i przemieszanymi handlerami dyspozycji. Zamiast czytać kod od góry do dołu, analitycy muszą śledzić liczbowe stany, tabele przejść i fałszywe ścieżki, aby zrekonstruować pierwotną kolejność.
Ochrona antydebugowa wstawia polimorficzne sondy, które wykrywają podłączone debuggery, trasery, maszyny wirtualne, środowiska sandbox i emulowane interpretery. Gdy sonda się aktywuje, zobfuskowany skrypt kończy działanie po cichu zamiast ujawniać chronioną logikę podczas interaktywnej analizy.
Sonda startowa weryfikuje kształt skryptu na dysku (skalowany digest treści) i ustawia klucz naruszenia, gdy plik nie odpowiada już zbudowanej wersji zobfuskowanej. Deszyfratory ciągów znakowych korzystają z tego klucza, więc zmodyfikowane skrypty zwracają śmieci zamiast czystego tekstu. Ta samoobronna warstwa zwiększa koszt swobodnej deobfuskacji i edycji plików.
Linker ochrony dodaje funkcje-przynęty i fałszywe wywołania, żeby skopiowany fragment nadal wyglądał jak zwykły kod programu. Ukryte pułapki uruchamiają się tylko wtedy, gdy ktoś zmieni plik albo odpali sam kawałek kodu. Jeśli skrypt startuje normalnie, te dodatki milczą i program działa jak zwykle.
Spójrz na ten przykład i kliknij zakładkę „Po obfuskacji”, aby zobaczyć jak ten sam skrypt staje się trudniejszy do odczytania na pierwszy rzut oka:
def get_greeting(name):
print(f"Hello World from {name}!")
get_greeting("Python Obfuscator")
_hn_jtskg = 0
_jw_ntq = 297 * 400 + 36
_x4e8bfda = abs(_jw_ntq - 8074)
_ev_koc_nn = max(_jw_ntq, _x4e8bfda) - min(_jw_ntq, _x4e8bfda)
_j_uo_xk_byh = 0
def _gn_jjz_mcn3v8p(slot, salt, guard):
global _hn_jtskg, _j_uo_xk_byh
if not _hn_jtskg:
return ''
[c.upper() for c in ('jfe', 'm0ao', 'r8ysw')]
if (((slot * 31) + salt) & 65535) != guard:
return ''
tk = _j_uo_xk_byh
_ie_m39_csp_doefp = {'ouj1': 455, 'vjz_o': 170, 'iqnv': 291}
_ie_m39_csp_doefp['r5_lr_m'] = _ie_m39_csp_doefp['ouj1'] + _ie_m39_csp_doefp['vjz_o']
_yw_xso = sum(_ie_m39_csp_doefp.values())
if tk is None:
tk = 0
_v93a130f2e4 = 508
if _v93a130f2e4 == 524:
_g_yf7_ia14_go = 'h1_vph'
elif _v93a130f2e4 == 561:
_g_yf7_ia14_go = 'hawo_b'
else:
_g_yf7_ia14_go = _v93a130f2e4 * 2
dk = _vb6a18ffee4 if '_vb6a18ffee4' in dir() else None
try:
_xg_ln5_kz_yeus_fo7 = 850 ** 0.5
finally:
pass
if dk is None:
dk = 0
d = [46866, 46865]
r = ''
for s9q_o_spi_zzuf_ql_vy_v in range(len(d)):
v = d[s9q_o_spi_zzuf_ql_vy_v]
for _j_l9g_l7_pe_tqe_is in range(2, -1, -1):
for _psbom_dh_x_ay in range(2, -1, -1):
v = v + 230
for _zh_h33vzxj_izegl9 in range(0, -1, -1):
v = v + int(((236 + (-3 * s9q_o_spi_zzuf_ql_vy_v) + (3 * _zh_h33vzxj_izegl9)) % 256 + 256) % 256))
v = v ^ 53766
v = v - (salt + slot + tk + dk + 0)
if 0 <= v <= 0xFFFF:
r += chr(v)
elif 0x10000 <= v <= 0x10FFFF:
r += chr(v)
return r
...
Czy nadal rozpoznałbyś pierwotny zamysł, gdybyś miał tylko zobfuskowany tekst i żadnej wcześniejszej kopii skryptu?
Silnik parsuje kod źródłowy Python do drzewa AST, a następnie stosuje wybieralne transformacje: zmianę nazw identyfikatorów, spłaszczanie przepływu sterowania, automat skończonych stanów (FSA), wirtualizację VM, polimorficzne szyfrowanie ciągów znakowych i liczb, wstawianie szumu i przynęt, samoobronne sondy integralności, linker ochrony oraz kontrole antydebugowania i antyanalizy. Wiele technik jest specyficznych dla tego produktu; niektóre pomysły są współdzielone z naszymi innymi narzędziami ochronnymi.
Po zakończeniu wszystkich przebiegów silnik generuje nowy plik .py. Skrajne przypadki w gramatyce Pythona i bibliotekach zewnętrznych oznaczają, że zawsze powinieneś przetestować wynik w docelowym środowisku uruchomieniowym.
Python Obfuscator jest dostarczany z interfejsem konsolowym dla automatyzacji pod Windows i Linux.
Wykorzystaj go do zintegrowania obfuskacji z serwerami budowania, zadaniami CI lub pakowaniem wsadowym.
Jeśli chcesz zapytać o Python Obfuscator, lub coś jest niejasne, napisz do mnie.