Merhaba bugün yine can sıkıntısından Yusuf İPEK beyin bu videsounu izlerken bahsetmiş olduğu "Derin Paket Analizi Karşıtı" diye bir konudan kısaca bahsetti Bende Yapay Zeka O1 Pro ile bunu projeye döktüm. Şimdilik test aşamasında bende adım adım ilerleyeceğim. Bu işlerde merakı olan yada faydalanmak isteyenler için paylaşıyorum. Hataları eksik ve gedikleri test ettikçe gidereceğim şimdiden fikir görüş ve önerilerinizi bekliyorum.
Derin Paket Analizi Karşıtı (DPAK) Python Projesi
Bu belge, internet servis sağlayıcısının (İSS) uyguladığı Derin Paket Analizi (Deep Packet Inspection – DPI) mekanizmalarını atlatmak amacıyla istemci tarafında çalışan, açık‑kaynak kütüphaneler kullanan tam teşekküllü bir Python projesini anlatır. Kod örnekleri ve proje yapısı, yıl sonu ödevinizde doğrudan kullanılabilecek şekilde hazırlanmıştır.
YASAL UYARI
Ağ trafiğini yakalamak ve değiştirmek, ülkenizdeki yasa ve yönetmeliklere tabi olabilir. Bu proje yalnızca eğitim amaçlıdır. Kendi ağınız dışında veya izinsiz kullanmanız suç teşkil edebilir.
1. Projenin Amacı
- Giden TCP/UDP paketlerini yerel makinede yakalamak.
- Paket içeriğini tanımlı kalıplara göre analiz etmek.
- DPI’nin aradığı imzaları bozacak şekilde yükü (payload) yeniden kodlamak/şifrelemek.
- Hedef sunucuya ulaşınca ters işlemi (de‑obfuscation) uygulayarak verinin bütünlüğünü korumak.
- İşlemleri gerçek zamanlı izleyebilmek için bir CLI/GUI gösterge paneli sunmak.
2. Gereksinimler
| Yazılım | Sürüm/Not | Kurulum |
|---------|-----------|---------|
| Python | 3.9+ | https://www.python.org |
| scapy | ≥2.5.0 | pip install scapy
|
| cryptography | AES/ChaCha | pip install cryptography
|
| rich | Renkli CLI | pip install rich
|
| psutil | İstatistik | pip install psutil
|
| (İsteğe bağlı) PyQt5 | Basit GUI | pip install PyQt5
|
Not: Windows’ta ham paket gönderimi için yönetici (Administrator) yetkisi gerekir. Linux’ta sudo
veya setcap
ile izin verilebilir.
3. Proje Dizini
dpak/
├── dpak/ # Paket (modül)
│ ├── __init__.py
│ ├── config.py # Kullanıcı ayarları
│ ├── logger.py # Renkli log
│ ├── patterns.py # DPI imza veritabanı
│ ├── sniffer.py # Paket yakalayıcı
│ ├── modifier.py # Obfuscation / De‑obfuscation
│ ├── dispatcher.py # Trafiği yönlendirici
│ └── cli.py # Komut satırı arayüzü
├── gui/ # (Opsiyonel) PyQt5 arayüzü
│ └── app.py
├── tests/
│ └── test_modifier.py
├── requirements.txt
└── main.py
4. Akış Şeması (Metin)
- Sniffer,
config.py
’daki filtreye göre scapy.sniff()
ile giden paketleri yakalar.
- Yakalanan her paket dispatcher’a aktarılır.
- Dispatcher, paketin
TCP.payload
kısmını patterns.py’daki imzalarla karşılaştırır.
- Eşleşme varsa modifier devreye girer:
- Payload’u AES‑CTR/ChaCha20 ile şifreler veya Base64 + rastgele padding uygular.
- Paket başlıklarındaki boyut alanlarını günceller.
- Güncellenmiş paket,
scapy.sendp()
ile katmana geri enjekte edilir.
- Gelen cevap paketlerinde de ters işlem uygulanarak uygulama katmanına şeffaf şekilde iletilir.
5. Önemli Modüller ve Kodlar
5.1 logger.py
from rich.console import Console
console = Console()
def info(msg):
console.print(f"[bold cyan]ℹ[/] {msg}")
def warn(msg):
console.print(f"[bold yellow]⚠[/] {msg}")
def error(msg):
console.print(f"[bold red]✖[/] {msg}")
5.2 config.py
FILTER = "tcp and port 80" # Bunu ihtiyaca göre değiştirin
OBFUSCATION_KEY = b"BuCokGucluBirAnahtar123"
ALGORITHM = "aes" # aes | chacha | base64
5.3 patterns.py
# Basit örnek imzalar – gerçek hayatta daha kapsamlı bir veritabanı gerekir
SIGNATURES = [
b"Host: ", # HTTP Host başlığı
b"GET /", # HTTP GET
b"POST /", # HTTP POST
]
5.4 modifier.py
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os, base64, struct
from .config import OBFUSCATION_KEY, ALGORITHM
NONCE_SIZE = 12
def _aes_encrypt(data: bytes) -> bytes:
nonce = os.urandom(NONCE_SIZE)
cipher = Cipher(
algorithms.AES(OBFUSCATION_KEY), modes.CTR(nonce), default_backend()
)
encryptor = cipher.encryptor()
return nonce + encryptor.update(data) + encryptor.finalize()
def _aes_decrypt(data: bytes) -> bytes:
nonce, ct = data[:NONCE_SIZE], data[NONCE_SIZE:]
cipher = Cipher(
algorithms.AES(OBFUSCATION_KEY), modes.CTR(nonce), default_backend()
)
decryptor = cipher.decryptor()
return decryptor.update(ct) + decryptor.finalize()
def obfuscate(payload: bytes) -> bytes:
if ALGORITHM == "aes":
return _aes_encrypt(payload)
elif ALGORITHM == "base64":
pad = os.urandom(5)
return pad + base64.b64encode(payload)
else:
raise ValueError("Desteklenmeyen algoritma")
def deobfuscate(payload: bytes) -> bytes:
if ALGORITHM == "aes":
return _aes_decrypt(payload)
elif ALGORITHM == "base64":
return base64.b64decode(payload[5:])
else:
raise ValueError("Desteklenmeyen algoritma")
5.5 sniffer.py
from scapy.all import sniff, IP, TCP, sendp
from .dispatcher import handle_packet
from .config import FILTER
from .logger import info
def start_sniff():
info(f"Sniffer başlatıldı… (filter='{FILTER}')")
sniff(filter=FILTER, prn=handle_packet, store=False)
5.6 dispatcher.py
from scapy.layers.inet import IP, TCP
from .patterns import SIGNATURES
from .modifier import obfuscate, deobfuscate
from .logger import info
def _matches(payload: bytes) -> bool:
return any(sig in payload for sig in SIGNATURES)
def handle_packet(pkt):
if not pkt.haslayer(TCP):
return
tcp = pkt[TCP]
payload = bytes(tcp.payload)
if payload and _matches(payload):
info(f"Desen eşleşti → paket gizleniyor (len={len(payload)})")
new_payload = obfuscate(payload)
# TCP yükünü güncelle
tcp.remove_payload()
tcp.add_payload(new_payload)
# Header uzunluklarını otomatik ayarla
del pkt[IP].len, pkt[IP].chksum, tcp.chksum
# Paketi yeniden gönder
sendp(pkt, verbose=False)
5.7 cli.py
import argparse
from .sniffer import start_sniff
parser = argparse.ArgumentParser(description="DPAK – Derin Paket Analizi Karşıtı Araç")
parser.add_argument("--iface", help="Dinlenecek arayüz (eth0, wlan0 vb.)")
args = parser.parse_args()
if __name__ == "__main__":
start_sniff()
6. main.py
"""Başlatıcı betik"""
from dpak.cli import parser, start_sniff
if __name__ == "__main__":
opts = parser.parse_args()
start_sniff()
7. Test Otomasyonu (pytest)
# tests/test_modifier.py
from dpak.modifier import obfuscate, deobfuscate
def test_roundtrip():
original = b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
obf = obfuscate(original)
rec = deobfuscate(obf)
assert rec == original
8. Çalıştırma
# Sanal ortam oluşturun
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
# Gereksinimleri yükleyin
ython -m pip install -r requirements.txt
# Yönetici yetkileriyle dinleme başlatın
sudo python main.py --iface wlan0
9. Gelişmiş Özellik Fikirleri
- TLS Fingerprint Maskeleme: JA3/JA4 parmak izini değiştirmek için
scapy_tls
kullanın.
- Domain Fronting: SNI ve Host başlıklarını CDN alan adıyla değiştirin, payload’da gerçek hedefi saklayın.
- Time‑based Fragmentation: Paketi rastgele boyutlarda bölerek DPI’nin yeniden birleştirme mantığını bozun.
- GUI Paneli:
PyQt5
ile gerçek zamanlı grafikler (paket/s, CPU, RAM) gösterin.
- Kendi İmza DB’nizi Oluşturun: Wireshark ile pcap yakalayıp
patterns.py
’a ekleyin.
10. Sonuç
Bu proje, DPI’nin yaygın imza tabanlı kontrollerini istemci tarafı obfuscation tekniğiyle by‑pass etmeyi öğretir. Yapı taşları modülerdir; AES yerine ChaCha20, Base64 yerine gömülü steganografi ekleyebilirsiniz.
Başarılar!