#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <fichier_kernel_n0120>"
    exit 1
fi

TARGET_FILE="$1"

# 1. Sauvegarde de sécurité
cp "$TARGET_FILE" "${TARGET_FILE}.bak"
echo "[*] Sauvegarde créée : ${TARGET_FILE}.bak"

# 2. Exécution des 3 patchs du Kernel N0120
echo "[*] Application des patchs Kernel N0120..."
python3 -c "
import sys

file_path = sys.argv[1]
with open(file_path, 'rb') as f:
    data = bytearray(f.read())

any_patched = False

# ==============================================================================
# PATCH 1 : Neutralisation du premier pattern (20 62 ...)
# ==============================================================================
# Pattern : 20 62 00 21 E2 6B 07 20
pattern_k1 = b'\x20\x62\x00\x21\xE2\x6B\x07\x20'
offset_k1 = data.find(pattern_k1)

if offset_k1 != -1:
    # Écriture de 00 BF (NOP) à l'offset
    data[offset_k1:offset_k1+2] = b'\x00\xBF'
    
    # Écriture de 00 BF (NOP) à l'offset + 12
    if offset_k1 + 14 <= len(data):
        data[offset_k1+12:offset_k1+14] = b'\x00\xBF'
        print(f'[+] [Patch 1] Appliqué (NOPs en 0x{offset_k1:X} et 0x{offset_k1+12:X}).')
        any_patched = True
    else:
        print('[-] [Patch 1] Erreur : offset+12 hors limites.')

# ==============================================================================
# PATCH 2 : Neutralisation de l'instruction BL (4F F0 ...)
# ==============================================================================
# Pattern : 4F F0 00 60 05 F1 00 65
pattern_k2 = b'\x4F\xF0\x00\x60\x05\xF1\x00\x65'
offset_k2 = data.find(pattern_k2)

if offset_k2 != -1:
    patch_addr_k2 = offset_k2 + 8
    if patch_addr_k2 + 4 <= len(data):
        # Remplacement de l'instruction BL (4 octets) par 2 NOPs
        data[patch_addr_k2:patch_addr_k2+4] = b'\x00\xBF\x00\xBF'
        print(f'[+] [Patch 2] BL neutralisé (2 NOPs insérés à l\'offset 0x{patch_addr_k2:X}).')
        any_patched = True
    else:
        print('[-] [Patch 2] Erreur : offset+8 hors limites.')

# ==============================================================================
# PATCH 3 : Modification de la constante (C4 F8 ...)
# ==============================================================================
# Pattern : C4 F8 98 0D 4F F0 10 50
pattern_k3 = b'\xC4\xF8\x98\x0D\x4F\xF0\x10\x50'
offset_k3 = data.find(pattern_k3)

if offset_k3 != -1:
    patch_addr_k3 = offset_k3 + 6
    if patch_addr_k3 < len(data):
        # On remplace l'octet 0x10 par 0x00
        data[patch_addr_k3] = 0x00
        data[patch_addr_k3+10] = 0x1c
        print(f'[+] [Patch 3] Constante modifiée (0x10 -> 0x00 à l\'offset 0x{patch_addr_k3:X}).')
        any_patched = True
    else:
        print('[-] [Patch 3] Erreur : offset+6 hors limites.')

# Sauvegarde finale si des modifications ont eu lieu
if any_patched:
    with open(file_path, 'wb') as f:
        f.write(data)
    print('[+] Kernel patché et enregistré avec succès.')
else:
    print('[-] Aucun pattern du Kernel N0120 n\'a été trouvé. Le fichier est inchangé.')
" "$TARGET_FILE"

echo "[+] Terminé !"
