Tutorial ini akan membahas cara men-deobfuscate script hypervoter. Script ini terdiri atas 2 bagian, yaitu bagian pertama berupa empat buah eval dan diikuti dengan data yang diencode menggunakan base64. Berikut ini adalah ke-4 eval yang terdapat pada script tersebut:

eval(base64_decode("JElsSTExMWwxMUk9ZmlsZShwcmVnX3JlcGxhY2UoIkBcKC4qXCguKiRAIiwiIixfX0ZJTEVfXykpOwppZihwcmVnX3JlcGxhY2UoIkBcKC4qXCguKiRAIiwiIixfX0ZJTEVfXyk9PV9fRklMRV9fIG9yCnByZWdfcmVwbGFjZSgiQFwoLipcKC4qJEAiLCIiLF9fTElORV9fKSAhPSAzKWRpZSgiPHR0PkVSUk9SIik7"));

eval(base64_decode("ZnVuY3Rpb24gT09PME9PTzAwTygkYSwkYil7JGM9YXJyYXkoOTMyLDM0MywzMiw0Mzk2NCk7JGs9Z3ppbmZsYXRlKGJhc2U2NF9kZWNvZGUoIkt5ck5UY29zS1FZQSIpKTskTzBPMD0ka1s2XS4ka1sxXS4ka1szXS4ka1s2XS4ka1s1XS4ka1swXTskTzA9IiRrWzVdJGtbMF0ka1s0XSRrWzJdIjtpZigkYj09MTQpeyRkPSRPME8wKCRhLCRjWzBdKyRjWzFdLCRjWzJdKTt9ZWxzZWlmKCRiPT00OCl7JGQ9JE8wTzAoJGEsJGNbMF0sJGNbMV0pO31lbHNlaWYoJGI9PTgzKXskZD0kTzAoJE8wTzAoJGEsJGNbMF0rJGNbMV0rJGNbMl0pKTt9cmV0dXJuJGQ7fQ=="));

eval(base64_decode(OOO0OOO00O($IlI111l11I[0],48)));
eval(O0OOOOOOOO(OOO0OOO00O($IlI111l11I[0],83),OOO0OOO00O($IlI111l11I[0],14),$IlI111l11I));

eval bagian pertama jika di-decode, maka hasilnya adalah sebagai berikut:

$IlI111l11I = file(preg_replace("@\(.*\(.*$@","",__FILE__));
if (preg_replace("@\(.*\(.*$@","",__FILE__) == __FILE__ or
preg_replace("@\(.*\(.*$@","",__LINE__) != 3) die ("<tt>ERROR");

eval bagian kedua jika di-decode menggunakan base64, maka hasilnya adalah sebagai berikut:

function OOO0OOO00O($a,$b)
{
    $c    = array(932,343,32,43964);
    $k    = gzinflate(base64_decode("KyrNTcosKQYA"));
    $O0O0 = $k[6].$k[1].$k[3].$k[6].$k[5].$k[0];
    $O0   = "$k[5]$k[0]$k[4]$k[2]";

    if ($b == 14)
    {
        $d = $O0O0($a, $c[0] + $c[1], $c[2]);
    }
    elseif ($b == 48)
    {
        $d = $O0O0($a, $c[0], $c[1]);
    }
    elseif ($b == 83)
    {
        $d = $O0($O0O0($a, $c[0] + $c[1] + $c[2]));
    }

    return $d;
}

Potongan kode di atas jika disederhanakan, maka hasilnya seperti ini:

function OOO0OOO00O($a,$b)
{
    if ($b == 14)
    {
        $d = substr($a, 1275, 32);
    }
    elseif ($b == 48)
    {
        $d = substr($a, 932, 343);
    }
    elseif ($b == 83)
    {
        $d = trim(substr($a, 1307));
    }

    return $d;
}

eval ke-3 jika disederhanakan, maka hasilnya akan seperti ini:

eval(base64_decode(substr($IlI111l11I[0], 932, 343)));

Dan hasilnya adalah fungsi berikut ini:

0OOOOOOOO($a,$b,$c)
{
    $d = implode($c);
    $d = preg_replace("/__halt_compiler.*/","",$d);

    if ($b == hash("md5","$d"))
    {
        return (gzinflate(base64_decode($a)));
    }
    else
    {
        die("<tt>md5 Code manipulation detected - OracleCode </tt>");
    }
}

Fungsi di atas (seharusnya) akan dipanggil pada eval ke-4, namun karena kesalahan pada script tersebut sehingga nama fungsinya berbeda, sehingga tidak dieksekusi. Fungsi tersebut akan melakukan pengecekan hash MD5 dari kode yang diencode menggunakan base64. Jika hashnya tidak sama dengan hash yang asli, maka script tersebut akan menghentikan eksekusi dan menampilkan pesan md5 Code manipulation detected - OracleCode. Sedangkan jika hashnya sesuai, maka kode tersebut akan didekode menggunakan base64 lalu didekompresi menggunakan fungsi gzinflate.

Kembali pada eval ke-2, perhatikan bagian ini:

$c    = array(932,343,32,43964);

Nilai 43964 adalah ukuran script asli yang kita butuhkan untuk didekode menggunakan base64 lalu didekompresi. Caranya adalah dengan mengambil dari bagian paling akhir script, lalu memotong script tersebut sebanyak 43964 byte. Berikut ada script php yang dapat kita gunakan untuk membaca script tersebut dan melakukan decode secara otomatis:

<?php
$file = "hypervoter.php";
$size = 43964;
echo gzinflate(base64_decode(file_get_contents($file, FALSE, NULL, filesize($file) - $size, $size)));
?>

Jika script tersebut dijalankan, maka hasilnya adalah script yang telah didekode, namun ternyata masih dalam format deobfuscated. Berarti script tersebut dilindungi menggunakan beberapa lapis obfuscation. Berikut adalah potongan hasil dari script di atas:

<?php
@ini_set('memory_limit','-1');@ini_set('max_execution_time',0);@set_time_limit(0);eval(str_rot13(gzuncompress(base64_decode("eNpVjj0LgzAURecW/ ... v379///AH8IiUM=")));
?>

Dari sini, kita dapat menggunakan evalhook untuk melakukan evaluasi dan menemukan script aslinya. Setelah beberapa kali menekan tombol y pada keyboard, kita dapat menemukan script asli hypervoter berikut ini:

<?php
require(__DIR__ . "\x2f\166\x65\156\x64\157\x72\57\x61\165\x74\157\x6c\157\x61\144\x2e\160\x68\160");
$ig = new \InstagramAPI\Instagram();
$climate = new \League\CLImate\CLImate();
$climate->green()->bold("
  _    ___     _______  ______ _______      ______ _______ ______ _____
 | |  | \ \   / /  __ \|  ____|  __ \ \    / / __ \__   __|  ____|  __ \
 | |__| |\ \_/ /| |__) | |__  | |__) \ \  / / |  | | | |  | |__  | |__) |
 |  __  | \   / |  ___/|  __| |  _  / \ \/ /| |  | | | |  |  __| |  _  /
 | |  | |  | |  | |    | |____| | \ \  \  / | |__| | | |  | |____| | \ \
 |_|  |_|  |_|  |_|    |______|_|  \_\  \/   \____/  |_|  |______|_|  \_\

");
$climate->out("");
$climate->green()->bold("\x48\171\x70\145\x72\166\x6f\164\x65\162\x20\124\x65\162\x6d\151\x6e\141\x6c");
$climate->green()->bold("\x76\61\x2e\65\x2e\61");
$climate->out("");
$climate->green("\x44\145\x76\145\x6c\157\x70\145\x64\40\x62\171\x20\117\x72\141\x63\154\x65\103\x6f\144\x65\40\x28\150\x74\164\x70\163\x3a\57\x2f\157\x72\141\x63\154\x65\143\x6f\144\x65\56\x63\157\x6d\51");
$climate->out("");
$option = getopt("\x67\72\x3a");
if (isset($option["g"]) )
{
    generator($ig, $climate);
}
else
{
    run($ig, $climate);
}
...

String pada script tersebut tampaknya sengaja diobfuscate menggunakan ASCII escape dan dapat dengan mudah untuk kita kembalikan menjadi string yang dapat dibaca seperti ini:

<?php
require(__DIR__ . "/vendor/autoload.php");
$ig = new \InstagramAPI\Instagram();
$climate = new \League\CLImate\CLImate();
$climate->green()->bold("
  _    ___     _______  ______ _______      ______ _______ ______ _____
 | |  | \ \   / /  __ \|  ____|  __ \ \    / / __ \__   __|  ____|  __ \
 | |__| |\ \_/ /| |__) | |__  | |__) \ \  / / |  | | | |  | |__  | |__) |
 |  __  | \   / |  ___/|  __| |  _  / \ \/ /| |  | | | |  |  __| |  _  /
 | |  | |  | |  | |    | |____| | \ \  \  / | |__| | | |  | |____| | \ \
 |_|  |_|  |_|  |_|    |______|_|  \_\  \/   \____/  |_|  |______|_|  \_\

");
$climate->out("");
$climate->green()->bold("Hypervoter Terminal");
$climate->green()->bold("v1.5.1");
$climate->out("");
$climate->green("Developed by OracleCode (https://oraclecode.com)");
$climate->out("");
$option = getopt("g::");
if (isset($option["g"]))
{
    generator($ig, $climate);
}
else
{
    run($ig, $climate);
}
...

Sekian tutorial singkat kali ini, semoga bermanfaat. Terima kasih kepada Allah SWT, dan Anda yang telah membaca tutorial ini.