Decode PHP DENGAN XDEBUG

Tutorial Lengkap Xdebug untuk Decode / Deobfuscate Script PHP

Tutorial Lengkap Menggunakan Xdebug untuk Decode / Deobfuscate Script PHP

Jika kamu sering menemui script PHP yang terproteksi dengan eval() atau di-obfuscate sehingga sulit dibaca, kamu bisa memanfaatkan Xdebug untuk melakukan debug dan menangkap isi kode sebelum dieksekusi. Artikel ini akan membahas langkah demi langkah: mulai dari install Xdebug, mengatur konfigurasi, menjalankan trace untuk melihat isi eval(), hingga merapikan hasil decode dengan script beautify.php.


1. Apa itu Xdebug dan Mengapa Berguna untuk Deobfuscate?

Xdebug adalah ekstensi PHP yang biasa dipakai untuk debugging, profiling, dan tracing eksekusi kode. Fitur function trace Xdebug memungkinkan kita merekam semua pemanggilan fungsi, termasuk kode yang dikirim ke eval(). Dengan ini, script PHP yang sebelumnya tidak terbaca bisa diambil sebelum dijalankan.


2. Instalasi Xdebug di VPS atau Server Linux

2.1 Update dan Install PHP + Xdebug

sudo apt update
sudo apt install php php-cli php-curl php-xml php-mbstring php-zip php-gd php-xdebug -y

Pastikan versi PHP terbaru. Setelah install, cek apakah Xdebug sudah aktif:

php -v

Output akan menampilkan sesuatu seperti:

PHP 8.3.6 (cli) (built: Jul 14 2025)
Zend Engine v4.3.6
    with Zend OPcache v8.3.6
    with Xdebug v3.2.0

2.2 Konfigurasi Xdebug

Edit file konfigurasi php.ini atau file /etc/php/8.x/cli/conf.d/20-xdebug.ini:

zend_extension = xdebug.so
xdebug.mode = debug,develop,trace
xdebug.start_with_request = yes
xdebug.trace_format = 1
xdebug.trace_output_dir = /root/decode
xdebug.trace_output_name = bot_trace

Pastikan folder /root/decode ada dan bisa ditulis:

mkdir -p /root/decode

3. Menjalankan Trace untuk Menangkap Kode Eval

Setelah konfigurasi selesai, jalankan script PHP yang ingin didecode dengan mode trace:

XDEBUG_MODE=debug,trace \
php -d xdebug.mode=debug,trace \
    -d xdebug.start_with_request=yes \
    -d xdebug.trace_format=1 \
    -d xdebug.trace_output_dir=/root/decode \
    -d xdebug.trace_output_name=bot4_trace \
    bot4.php

File trace akan muncul di folder /root/decode dengan nama bot4_trace.xt. Karena kita pakai xdebug.trace_format=1, file ini akan dalam format teks dan bisa dibaca dengan perintah:

nano /root/decode/bot4_trace.xt

Gunakan pencarian di dalam nano dengan menekan Ctrl+W lalu ketik ARG 1 untuk menemukan string yang dikirim ke eval().


4. Ekstrak Otomatis Semua Kode Eval dengan Script

Daripada menyalin manual dari trace yang panjang, kita bisa gunakan script kecil untuk mengambil semua argumen eval() sekaligus.

<?php
$trace = file_get_contents('bot4_trace.xt');
if(!$trace){ die("Trace file tidak ditemukan\n"); }

$matches = [];
if (preg_match_all('/ARG 1:\s+"(.*?)"/s', $trace, $matches)) {
    $i = 1;
    foreach ($matches[1] as $raw) {
        $clean = stripcslashes($raw);
        $file = "layer_$i.php";
        file_put_contents($file, "<?php\n".$clean);
        echo "[+] Layer $i disimpan ke $file\n";
        $i++;
    }
    echo "[✓] Total layer yang diambil: ".count($matches[1])."\n";
} else {
    echo "[!] Tidak ditemukan ARG 1 di trace.\n";
}
?>

Jalankan script ini:

php extract_eval.php

Semua kode yang dieksekusi oleh eval() akan otomatis keluar menjadi file layer_1.php, layer_2.php, dan seterusnya.


5. Merapikan Hasil Decode dengan Beautify.php

Hasil decode biasanya masih berantakan (tanpa indentasi atau penuh karakter escape). Gunakan script beautify.php untuk merapikan:

<?php
if ($argc < 2) {
    echo "Usage: php beautify.php <file_input> [file_output]\n";
    exit(1);
}
$input  = $argv[1];
$output = $argv[2] ?? (pathinfo($input, PATHINFO_FILENAME) . "_beautified.php");
if (!file_exists($input)) { echo "File $input tidak ditemukan!\n"; exit(1); }

$code = file_get_contents($input);
$code = stripcslashes($code);
if (strpos($code, '<?php') === false) $code = "<?php\n".$code;

$tokens = token_get_all($code);
$formatted = "";
$indent = 0; $newline = true;
foreach ($tokens as $token) {
    if (is_array($token)) {
        $text = $token[1];
        switch ($token[0]) {
            case T_WHITESPACE: if (!$newline) $formatted .= " "; break;
            case T_OPEN_TAG: $formatted .= $text."\n"; $newline=true; break;
            case T_CLOSE_TAG: $formatted .= "\n".$text; $newline=true; break;
            default:
                if ($newline) $formatted .= str_repeat("    ", $indent);
                $formatted .= $text; $newline=false;
        }
    } else {
        if ($token === '{'){ $formatted .= " {\n"; $indent++; $newline=true; continue;}
        if ($token === '}'){ $indent=max(0,$indent-1); $formatted.="\n".str_repeat("    ",$indent)."}\n"; $newline=true; continue;}
        if ($token === ';'){ $formatted.=";\n"; $newline=true; continue;}
        $formatted .= $token;
    }
}
file_put_contents($output, $formatted);
echo "[✓] File berhasil dirapikan ke: $output\n";
?>

Gunakan seperti ini:

php beautify.php layer_1.php

Hasilnya akan membuat file layer_1_beautified.php yang sudah rapi dan mudah dibaca.


6. Tips Tambahan

  • Gunakan composer global require friendsofphp/php-cs-fixer untuk merapikan kode sesuai standar PSR2.
  • Jika ingin menghapus proteksi atau cek tertentu (misalnya referral), cukup cari fungsinya di file yang sudah rapi dan modifikasi.
  • Hati-hati saat menjalankan script yang tidak dikenal — pastikan di server terisolasi agar aman.

Kesimpulan

Dengan Xdebug kita bisa decode / deobfuscate script PHP yang rumit karena dapat merekam seluruh pemanggilan eval(). Hasil trace kemudian diekstrak otomatis dan dirapikan menggunakan beautify.php. Metode ini sangat membantu programmer yang ingin menganalisis script PHP yang dilindungi atau dipersingkat oleh obfuscator.

Semoga panduan ini membantu! Jangan lupa share jika bermanfaat dan gunakan Xdebug secara etis hanya untuk pembelajaran dan debugging script sendiri.

Previous Post
No Comment
Add Comment
comment url