Всем привет, хоть петухон и не возможно тщательно защитить от опытных ревёрсеров, но от школьников это сделать ещё возможно. Решил поделиться самой простой обфускацией исходника на python.
Минусы этого метода в том что код должен быть процедурным и без сторонних модулей или библиотек, так же не возможно использовать под многофайловый проект.
P.S: если хочешь посмотреть полный код обфускатора листай в самый низ этой статьи.
Начнём с алгоритмов работы обфускатора. Моя реализация будет:
1) Используя исходный код шифровать / путать его
2) Записывать зашифрованное значение в новый файл
3) Расшифровывать код и запускать в оперативной памяти
У меня будет 2 файла: obf.py (обфускатор), test.py (тестовый файл). Тестовый файл выглядит вот так:
test.py
Начнём с алгоритма шифрования, я буду использовать обычное сложение индекса ASCII символов с "ключём" (если его можно так назвать).
Вот такой простенький шифратор я накинул буквально за пару секунд. Усложнять обфускатор можно до бесконечность это зависит от вашей фантазии.
Приступим к дешифратору, тому звену, которое будет расшифровывать наш код перед запуском в оперативной памяти:
Теперь перейдем к генератору стаба, он должен создавать зашифрованный / запутанный сорц файл:
Генератор стаба импортирует функцию запуска зашифрованного / запутанного кода и исполняет её предварительно подставив параметры.
Теперь остаётся главная функция обфускатора - загрузчик.
Вот и вссе функции нашего обфускатора, призапуске обфускатора из:
test.py
Получается вот такой код:
stub.py
Теперь нужно этот код проверить, вот вывод при запуске этого кода:
Попробуем теперь компилировать этот же код и проверить его уже скомпилированным ( я буду использовать pyinstaller для этих целей ).
Из за того что петухон и pyinstaller вес вышел вот такой:
Можно воспользоваться nuitka тогда файл будет весить в разы меньше (проверенно).
Теперь самое время запустить и проверить уже скомпилированный и обфусцированный файл:
Как вы можете замететь обфусцированный файл работает отлично.
А вот полный код обфускатора:
Пишите свои идеи по поводу обфускации python кода, будет интересно послушать чьи то мнения по защите питухона от злых хацкерс
Минусы этого метода в том что код должен быть процедурным и без сторонних модулей или библиотек, так же не возможно использовать под многофайловый проект.
P.S: если хочешь посмотреть полный код обфускатора листай в самый низ этой статьи.
Начнём с алгоритмов работы обфускатора. Моя реализация будет:
1) Используя исходный код шифровать / путать его
2) Записывать зашифрованное значение в новый файл
3) Расшифровывать код и запускать в оперативной памяти
У меня будет 2 файла: obf.py (обфускатор), test.py (тестовый файл). Тестовый файл выглядит вот так:
test.py
Python:
from os import getlogin
print(getlogin())
Начнём с алгоритма шифрования, я буду использовать обычное сложение индекса ASCII символов с "ключём" (если его можно так назвать).
Python:
KEY = 4 # это мой ключ
def encrypt(src: bytes, key: int) -> str:
buffer = ""
for index in src:
buffer += chr(index + key)
return buffer
Вот такой простенький шифратор я накинул буквально за пару секунд. Усложнять обфускатор можно до бесконечность это зависит от вашей фантазии.
Приступим к дешифратору, тому звену, которое будет расшифровывать наш код перед запуском в оперативной памяти:
Python:
def decrypt(enc: bytes, key: int) -> str:
buffer = ""
for index in enc:
buffer += chr(index - key)
return buffer
Теперь перейдем к генератору стаба, он должен создавать зашифрованный / запутанный сорц файл:
Python:
def gen_stub(enc: str, key: int) -> None:
with open("stub.py", "w") as create:
create.write("from obf import run_exec\n")
create.write(f"run_exec('{enc}', {key})")
create.close()
Генератор стаба импортирует функцию запуска зашифрованного / запутанного кода и исполняет её предварительно подставив параметры.
Теперь остаётся главная функция обфускатора - загрузчик.
Python:
def run_exec(enc: str, key: int):
src = decrypt(enc.encode(), key)
exec(compile(src, "test.py", "exec"))
Вот и вссе функции нашего обфускатора, призапуске обфускатора из:
test.py
Python:
from os import getlogin
print(getlogin())
Получается вот такой код:
stub.py
Python:
from obf import run_exec
run_exec('jvsq$sw$mqtsvx$kixpskmrtvmrx,kixpskmr,--', 4)
Теперь нужно этот код проверить, вот вывод при запуске этого кода:
Попробуем теперь компилировать этот же код и проверить его уже скомпилированным ( я буду использовать pyinstaller для этих целей ).
Из за того что петухон и pyinstaller вес вышел вот такой:
Можно воспользоваться nuitka тогда файл будет весить в разы меньше (проверенно).
Теперь самое время запустить и проверить уже скомпилированный и обфусцированный файл:
Как вы можете замететь обфусцированный файл работает отлично.
А вот полный код обфускатора:
Python:
def encrypt(src: bytes, key: int) -> str:
buffer = ""
for byte in src:
buffer += chr(byte + key)
return buffer
def decrypt(enc: bytes, key: int) -> str:
buffer = ""
for byte in enc:
buffer += chr(byte - key)
return buffer
def gen_stub(enc: str, key: int) -> None:
with open("stub.py", "w") as create:
create.write("from obf import run_exec\n")
create.write(f"run_exec('{enc}', {key})")
create.close()
def run_exec(enc: str, key: int):
src = decrypt(enc.encode(), key)
exec(compile(src, "test.py", "exec"))
if __name__ == "__main__":
Key = 4
FILENAME = "test.py"
enc = encrypt(open(FILENAME, "rb").read(), Key)
gen_stub(enc, Key)
Пишите свои идеи по поводу обфускации python кода, будет интересно послушать чьи то мнения по защите питухона от злых хацкерс