Merhaba TurkHackTeam ailesi,
Kendimi Python ve kod yapısı optimizasyonları konusunda geliştirmek amacıyla bir süredir üzerinde çalıştığım Python Runtime & Bytecode Optimizer projemin ilk sürümünü (V1.0) sizlerle paylaşmak istedim.
Bu projeyi yapmamdaki temel amaç; yazdığımız .py scriptlerinin kaynak kodlarını doğrudan düz metin olarak paylaşmak istemediğimiz durumlarda, amatör gözlerin kurcalamasını biraz zorlaştırmak ve bunu yaparken de profesyonel araçların çalışma mantığını anlamaktı.
Projede klasik Base64 gibi çok bariz siber güvenlik şablonları yerine, siber güvenlik dünyasında sıkça gördüğüm Hexadecimal Byte String yapısını kullandım.
Requirements (Gerekli Kütüphaneler):
Aracın çalışması için gerekli tek kütüphane terminali renklendiren colorama modülüdür.
Proje Kodları:
Çıktı Dosyasının Görünümü:
Herhangi bir dosyayı bu araçla şifrelediğinizde oluşan çıktı dosyası şu şekilde sade ve tek satırlık bir yapıda görünüyor:
Geliştirmek adına "Şu kütüphaneyi kullansan daha iyi olurdu" ya da "Şu mantık açığa çıkıyor, şöyle kapatabilirsin" tarzı teknik fikirlerinizi konunun altına bekliyorum. Teşekkürler!
Kendimi Python ve kod yapısı optimizasyonları konusunda geliştirmek amacıyla bir süredir üzerinde çalıştığım Python Runtime & Bytecode Optimizer projemin ilk sürümünü (V1.0) sizlerle paylaşmak istedim.
Bu projeyi yapmamdaki temel amaç; yazdığımız .py scriptlerinin kaynak kodlarını doğrudan düz metin olarak paylaşmak istemediğimiz durumlarda, amatör gözlerin kurcalamasını biraz zorlaştırmak ve bunu yaparken de profesyonel araçların çalışma mantığını anlamaktı.
Projede klasik Base64 gibi çok bariz siber güvenlik şablonları yerine, siber güvenlik dünyasında sıkça gördüğüm Hexadecimal Byte String yapısını kullandım.
V1.0 Özellikleri ve Mantığı:
- Hex-Byte Görünümü: Çıktı dosyası tamamen \x78\x9c... şeklinde ham bayt (shellcode benzeri) bir görüntüye sahip oluyor. Değişken isimlerini de sisteme uygun seçtim ki çok fazla şüphe çekmesin.
- In-Memory (RAM) Çalışma: Kod çalıştırıldığında diske herhangi bir geçici dosya çıkartmıyor. Çözme işleminin hepsi geçici bellekte (RAM) gerçekleşiyor ve exec() ile doğrudan bellek üzerinden yürütülüyor.
- Dinamik Çoklu XOR: Kod tek bir sayı yerine, rastgele üretilen 4 farklı sayıdan oluşan bir anahtar akışı (Key Stream) ile şifreleniyor.
- Anti-Tamper & Anti-Trace: exec kelimesini düz metin editöründe print ile değiştirmeye çalışan uyanıklar olursa veya bir debugger ile adım adım izleniyorsa kod kendini kapatmaya çalışıyor.
Requirements (Gerekli Kütüphaneler):
Aracın çalışması için gerekli tek kütüphane terminali renklendiren colorama modülüdür.
Proje Kodları:
Python:
import marshal
import zlib
import os
import time
import sys
import random
from colorama import init, Fore, Style
init(autoreset=True)
logo = f"""
{Fore.CYAN}████████╗██╗ ██╗████████╗ ██████╗ ██████╗ ███████╗██╗ ██╗███████╗ ██████╗ █████╗ ████████╗ ██████╗ ██████╗
{Fore.CYAN}╚══██╔══╝██║ ██║╚══██╔══╝ ██╔═══██╗██╔══██╗██╔════╝██║ ██║██╔════╝██╔════╝██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗
{Fore.LIGHTCYAN_EX} ██║ ███████║ ██║ ██║ ██║██████╔╝█████╗ ██║ ██║███████╗██║ ███████║ ██║ ██║ ██║██████╔╝
{Fore.LIGHTCYAN_EX} ██║ ██╔══██║ ██║ ██║ ██║██╔══██╗██╔══╝ ██║ ██║╚════██║██║ ██╔══██║ ██║ ██║ ██║██╔══██╗
{Fore.BLUE} ██║ ██║ ██║ ██║ ╚██████╔╝██████╔╝██║ ╚██████╔╝███████║╚██████╗██║ ██║ ██║ ╚██████╔╝██║ ██║
{Fore.BLUE} ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
{Fore.LIGHTBLACK_EX}Custom Python Obfuscator v1.0 | TurkHackTeam{Style.RESET_ALL}
"""
os.system('cls' if os.name == 'nt' else 'clear')
print(logo)
print(f"{Fore.LIGHTBLACK_EX}="*118 + "\n")
hedef_dosya = input(f"{Fore.GREEN}[>]{Fore.WHITE} Şifrelenecek .py dosyasının adını/yolunu girin: ")
print()
if not os.path.exists(hedef_dosya):
print(f"\n{Fore.RED}[-] Hata: Girdiğin dosya yok")
sys.exit()
with open(hedef_dosya, "r", encoding="utf-8") as f:
ham_kod = f.read()
adim = 100
genislik = 50
for i in range(adim + 1):
dolgu = int(round(genislik * i / float(adim)))
cubuk = '━' * dolgu + '─' * (genislik - dolgu)
sys.stdout.write(f"\r{Fore.GREEN}⁝ {Fore.BLUE}Overall Progress {Fore.LIGHTBLACK_EX}{cubuk} {Fore.MAGENTA}{i}%")
sys.stdout.flush()
time.sleep(0.01)
print("\n")
_key_stream = [random.randint(15, 240) for _ in range(4)]
_compiled = compile(ham_kod, '<string>', 'exec')
_marshalled = marshal.dumps(_compiled)
_compressed = zlib.compress(_marshalled)
_encrypted = bytearray()
for _idx, _byte in enumerate(_compressed):
_encrypted.append(_byte ^ _key_stream[_idx % len(_key_stream)])
_hex_payload = "".join(f"\\x{b:02x}" for b in _encrypted)
_inner_template = f"""# Runtime system buffer assembly optimization
import marshal, zlib, sys
if sys.gettrace() is not None: sys.exit()
try:
with open(__file__, "rb") as _file:
_chunk = _file.read()
if b"print" in _chunk or b"dis" in _chunk or b"write" in _chunk: sys.exit()
except: sys.exit()
_keys = {_key_stream}
_stream = b"{_hex_payload}"
_buffer = bytearray()
for _i, _b in enumerate(_stream):
_buffer.append(_b ^ _keys[_i % len(_keys)])
exec(marshal.loads(zlib.decompress(bytes(_buffer))))
"""
_outer_compiled = compile(_inner_template, '<string>', 'exec')
_outer_marshalled = marshal.dumps(_outer_compiled)
_outer_compressed = zlib.compress(_outer_marshalled)
_outer_hex = "".join(f"\\x{b:02x}" for b in _outer_compressed)
final_kod = f"""# Optimized by SystemRuntime Environment
import marshal, zlib
_runtime_block = b"{_outer_hex}"
exec(marshal.loads(zlib.decompress(_runtime_block)))
"""
su_anki_dizin = os.getcwd()
yeni_isim = "sifreli_" + os.path.basename(hedef_dosya)
tam_kayit_yolu = os.path.join(su_anki_dizin, yeni_isim)
with open(tam_kayit_yolu, "w", encoding="utf-8") as f:
f.write(final_kod)
print(f"{Fore.GREEN}[SUCCESS]{Fore.WHITE} İşlem Başarıyla Tamamlandı!")
print(f"{Fore.LIGHTCYAN_EX}[*]{Fore.WHITE} Şifrelenmiş Dosya: {Fore.YELLOW}{tam_kayit_yolu}")
print(f"\n{Fore.LIGHTBLACK_EX}="*118)
input(f"\n{Fore.LIGHTBLACK_EX}Kapatmak için Enter'a basabilirsin...")
Çıktı Dosyasının Görünümü:
Herhangi bir dosyayı bu araçla şifrelediğinizde oluşan çıktı dosyası şu şekilde sade ve tek satırlık bir yapıda görünüyor:
Geliştirmek adına "Şu kütüphaneyi kullansan daha iyi olurdu" ya da "Şu mantık açığa çıkıyor, şöyle kapatabilirsin" tarzı teknik fikirlerinizi konunun altına bekliyorum. Teşekkürler!

