Avatar billede FrederikLive Nybegynder
05. november 2012 - 00:41 Der er 9 kommentarer og
1 løsning

Mærkelig kode i PHP

Hej alle
Jeg har købt et script hvor flere filer er skrevet med en mærkelig form for karakterer. Jeg går ud fra dette er en speciel Character Encoding (Men ikke i selve .php filen) Den kan dog sagtens læses af PHP og jeg undre mig virkeligt over dette.

Eksempel Kode:
$x22="e\162\x65gi"; $x23="\150ea\x64e\x72"; $x24="\x6d\1445";

Er der nogle der kender til dette og eventuelt ved hvordan jeg kan afkode det til noget mere læsbart?

Tak på forhånd :)
Avatar billede lclemens Nybegynder
05. november 2012 - 02:33 #1
// udskriver x22 til x24

for($i=22; $i <= 24; $i++){

    echo htmlentities(${"x$i"}).'<br>';

}
Avatar billede FrederikLive Nybegynder
05. november 2012 - 02:42 #2
Jeg ligger lige hele koden her så der er en bedre forståelse af dette:

(code)
<?



$x22="e\162\x65gi"; $x23="\150ea\x64e\x72"; $x24="\x6d\1445"; $x25="\155\171\163q\154\137\145rr\x6fr"; $x26="\155\x79\163\x71l\x5f\x66\x65t\143h\137\141rr\141\171"; $x27="m\x79\x73\x71\x6c\x5fq\165\x65r\171"; $x28="m\171s\x71\x6c\x5f\156u\x6d\137\162o\x77s"; $x29="\x70\x72\145\x67\137\155\141\164\143\150"; $x2a="\163t\x72\151\x70\137\x74\141\147s"; $x2b="\163t\x72\x6cen"; $x2c="s\x75\142\163\164\162"; $x2d="\x74r\151\155";
include"\x6d\141s\x74\x65\162\x5f\151\x6ec.php";include "inc\154\x75\x64\145\057mc\x70\x2e\151\156\143\056p\150\160";$x0b = $x2a($x2c($_POST['lastname'],0,32));$x0c = $x2a($x2c($_POST['firstname'],0,32));$x0d = $x2a($x2c($_POST['phone'],0,32));$x0e=$_REQUEST['password_hint']; $x0f = $x2a($x2c($_POST['username'],0,32));if($x2d($x0f)!=='' || $x2b($x2d($x0f)) >= 4){ $x10="\x53\x45\x4c\x45\x43\124\x20\x2a\040\106\122\x4f\x4d\040u\163\145r\163\x20\127\x48\x45R\x45 \165\163\145\162\156\x61\x6d\x65='$x0f'";$x11=$x27($x10);$x12=$x28($x11);if($x12>0){$x13 = 104;}}else{$x14 = 104;} $x15 = $_REQUEST['email'];if($x22("\x5e[_a-\x7a\x30\055\071\055\135\x2b\050\.[\137\x61-z0\0559\x2d]\053)*@\050[a-\172\x30\0559\x2d\x5d{\062,\x33\175)\053\050\.[\x61-\x7a\x30\0559\x2d]+\x29*\050\.\133\x61-\172\135\x7b2\0543}\051$", $x15)){ $x16 = $x15;}else{$x17=104;} $x10="\x53\x45L\x45\x43\x54 \x2a\040\x46RO\x4d \165s\145\x72s\x20\x57HE\x52\105 e\155ail\075'$x16'";$x11=$x27($x10);$x12=$x28($x11);if($x12>0){$x18=104;} $x19 = $x2a($x2c($_POST['password'],0,32));if ($x29("\x2f\133\101-\x5a]+\x5b\x61\055\x7a\x5d\053\1330-\071\135/", $x19, $x1a)) {}else{$x1b = 104;}if($x13==104 OR $x18==104 OR $x1b==104 OR $x17==104 OR $x14==104){$x23("l\x6f\x63a\x74\x69\x6fn\072\x75\163e\x72\137\x61\x64\144\x5fe\x72\x72or\x73.\160hp\077p\x77_i\156\x73\145c\x75\x72e\075$x1b\046\145\x6d\141i\154\137\141\x6c\x72e\x61dy\137i\x6e\x5f\165s\x65=$x18\x26use\162\156\x61me\137\x61\154\x72ea\144\171_i\x6e_\x75\x73e\075$x13&\142a\x64\x5f\145\155ai\154\x3d$x17\x26\x75\x73e\162\x6e\141\x6de\137\164o\x6f\137\163h\157\x72t\075$x14");die();} $x1c = $x24($x19);$x1d = "\111\116\123E\122\124 \x49\116\124\117 `\165se\x72\163\140\x20\050\140u\163\x65rn\141\155\145\140\x2c
\012\x60\160a\x73\163w\157\x72\x64\140\x2c\x0d\x0a\140\x6ca\x73\x74\x6e\141m\145`\x2c\x0d
\x60\146\151\162s\x74name\140\x2c\015\x0a`\145\155\141\151\x6c\x60\x2c\x0d\x0a\x60p\x68o\156\x65\x60\x2c\x0d
\140\x70a\163\x73\167o\162\144\137\x68\151\x6e\164`)\x0d\x0a\126\x41\114\x55E\x53\x0d\012\x28
'$x0f'\x2c\015\012'$x1c'\x2c\015\x0a'$x0b'\x2c
'$x0c'\054
'$x16'\x2c\015\x0a'$x0d'\054\015\012'$x0e'\051"; $x1e = $x27( $x1d ); if( $x1e ){echo( "\x3c\146\x6f\156\164\x20\163i\x7a\145='2' f\141\143e\x3d'V\x65r\x64\141\156\141\054 A\162\151\x61\x6c\054 \110e\x6cv\145t\151c\141\054\x20\163\141\x6es\x2d\x73\145\x72i\146'\076\131\x6fur c\150a\x6e\x67\x65s \x68\141\166\x65\040\142\145e\156\040\155\141de \x73\x75\x63es\163fu\x6c\x6cy\056 <\x62\162\x3e\x3cb\162>\074a\040\x68\x72ef='l\157\x67\151\156\x2eph\160'>\102\x61\143\153\040\x74\x6f\040login\074\x2fa><\x2ffont>\040" );}else{die( "Tr\157\x75\142l\x65\x20\x73a\166\151\156\x67\x20in\146\157\x72mat\151o\x6e\040to\040\164\150\x65\x20\x64\x61ta\142\141\x73\x65\072 " . $x25() );} $x10="\x53\105\x4c\x45\103\124 \x2a\040\x46\122\x4f\115\040u\163e\162\x73";$x11=$x27($x10);$x12=$x28($x11);if($x12==1){$x1d = "\x55\120D\x41TE \140\x75\163er\163` \123\105T\x20`\160\145\x72\155\151\163\x73\151o\156s\x60\x3d'\x35' \x57H\105\122\105\040`\145\x6d\141\151l`\x3d'$x16'"; $x1e = $x27( $x1d ); if( $x1e ){ echo( "\x3c\146ont \163\151\172\145\075'\x32' \146\141\143\x65\075'Ve\162\144a\156a\x2c\040A\162ia\x6c\054 \x48el\x76\145\x74\x69\143\x61,\040san\163-\x73\145r\151\x66'\x3e\x3cb\162\076\074br>Si\156c\x65\040\164\x68\x69\x73 is\x20\x74h\x65\040\x66\151\x72s\x74\040us\145r i\x6e\x20\164\x68e\040\144at\x61\142\141se\x20\167\x65\040\150\141\166\145\x20c\x6f\x6e\146\x69\x67\x75r\145\x64\x20t\150\145 \x61\x63\143\157\165\x6e\x74 w\x69\x74\150\040\141\144mi\156\151\163\x74\162\141\164i\x76\145 \160\x72\x69\x76i\x6c\145g\x65s\056\040S\165\142\163e\161\x75\x65\156\164\040\143h\x61\156\x67e\163\040\x74o\040\x70\145\162m\x69\x73\163\x69\x6f\156 \x6c\145\x76els \143\x61\156\040\142\145\040\155ad\145\040i\156 t\150\145\040da\x74\141\x62\x61s\x65\x2e\x20\x54\x68an\153\040y\157\165\056\x3c\x62\162\076<\x2f\146\157n\x74\x3e " );}else{die( "\074\x66\157\x6e\x74\040\x73i\172\145\075'\x32'\x20\146\x61\x63e\x3d'\x56\x65\162\x64\141\x6e\141\x2c\040\101\162\x69al\x2c\x20\110\145l\166et\x69\x63\141,\x20s\141\156s\055s\145\x72\x69\146'\x3e\124roub\x6ce\x20\163\x61\166in\x67\040\151\x6efo\162\155a\x74\151\157n\x20t\157 \x74h\x65\040\x64at\x61b\x61\163e\x3a\x3c\057f\x6f\x6et\076\040" . $x25() );}}$x1f="$x0b\x20$x0c";$x1d="\x69\156s\145\x72\164\x20i\x6et\x6f\040\157\143\141\x72\164\137m\x61\x6e\165\x66\x61\x63\164\x75\162\x65\x72\040\x28n\x61m\x65\x29 \x76a\x6c\x75\145\163\050'$x1f'\051";$x11 = $x27($x1d) or die('Query failed: ' . $x25());$x1d = "\x73e\x6c\x65\143\x74\040\052 \x66\162\x6f\155\040 oc\141\x72\x74\137\155\141\x6e\165\x66\141\x63t\165\x72\x65\x72\040\x77\x68e\162e\x20\x6e\141m\145\x3d'$x1f'";$x11 = $x27($x1d) or die('Query failed: ' . $x25());while ($x20 = $x26($x11, MYSQL_NUM)) { $x21=$x20[0]; }$x1d="\x69n\163\145r\164 int\x6f\040\x6fcar\164\137\x6d\x61\x6e\x75\146a\143\164\x75r\145r_t\157_stor\145\040\166\141\154\x75e\x73\x20('$x21'\x2c'\x30')";$x11 = $x27($x1d) or die('Query failed: ' . $x25());$x1d="\x75\x70\x64\141te \165\x73\145r\163\040set oc\x61\162t\x5f\151d='$x21'\x2c\x20\x6c\141ng\165\x61ge\075'\061'\x20\167\150\145\x72\145\040\x75\x73\145\x72n\x61me\075'$x0f'";$x11 = $x27($x1d) or die('Query failed: ' . $x25());?>
(/code)
Avatar billede lclemens Nybegynder
05. november 2012 - 02:41 #3
Man kan evt. rette echo-linjen lidt til:

echo "\$x$i=\"".htmlentities(${"x$i"}).'";<br>';
Avatar billede lclemens Nybegynder
05. november 2012 - 05:19 #4
Programmøren har kørt kildekoden gennem en såkaldt "php obfuscator". Det gør den knap så let at læse og ændre i.

Man kan godt skrive et script, som gør lidt af skaden god igen, så den bliver nemmere at læse.
Avatar billede FrederikLive Nybegynder
05. november 2012 - 10:38 #5
lclemens skriv som svar så lukker jeg den.. Tak.
Avatar billede lclemens Nybegynder
05. november 2012 - 11:21 #6
Jeg legede lige lidt med det. Følgende kode kan gøre det mere læsbart, men garanterer ikke at kildekoden er intakt, så den originale kildekode kan ikke umiddelbart erstattes med resultatet.

<?php
$s = file_get_contents('myscript.php'); // dit script

if($s === FALSE){
    die('kunne ikke indlæse fil');
}

fix_characters();
fix_function_names();
fix_indentation();

echo '<pre>';
echo htmlentities($s);
echo '</pre>';

// =================================================

function fix_indentation(){
    global $s;

    $s = str_replace(' $x', '$x', $s);
    $s = str_replace(' if(', 'if(', $s);
    $s = str_replace(';', ";\r\n", $s);

    $indentlevel = 0;
    $parenteselevel = 0;
    $len = strlen($s);
   
    for($pos=0; $pos<$len; $pos++){
   
        switch($s[$pos]){
            case '(':
                $parenteselevel++;
                break;
            case ')':
                $parenteselevel--;
                break;
            case'{':
                if($parenteselevel > 0) break;
                $indentlevel++;
                $s = substr_replace($s, "\r\n", $pos+1, 0);
                $pos += 1;
                $len += 2;
                break;
            case '}':
                if($parenteselevel > 0) break;
                $indentlevel--;
                $s = substr_replace($s, "\r\n", $pos+1, 0);
                $pos += 1;
                $len += 2;
                break;
            case "\n":
                if($indentlevel == 0) break;
               
                $k = 0;           
                if(!($pos+1 < $len && $s[$pos+1] != '}')) $k++;
               
                $fill = str_repeat(" ", ($indentlevel -$k) * 4);
               
                $s = substr_replace($s, "$fill", $pos+1, 0);
                $pos += $fill;
                $len += $fill;
               
                break;
        }
    }
}


function fix_function_names(){
/*
$x22="eregi";
$x23="header";
$x24="md5";

if($x22(...
*/
    global $s;

    // find første ordinal

    if(preg_match('/\$x([\da-fA-F]+)\s*=/', $s, $m)){
        $ordinal = hexdec($m[1]);
    }else{
        //echo '<hr>intet ændret i fix_function_names<hr>';
        return;
    }

    // fix
   
    while(preg_match('/\$x'.dechex($ordinal).'\s*="(.*?)"/', $s, $m)){

        $obscured_name = "\$x".dechex($ordinal);
        $real_name = $m[1];
        $s = str_replace($obscured_name.'(', $real_name.'(', $s);

        $ordinal++;
    }
}

function replace_chars($m){
    $m0 = $m[0];
   
    if($m0[1] == 'x'){
        // hex
        $s = hexdec(substr($m0, 2));
    }else{
        // octal
        $s = octdec(substr($m0, 1));
    }
   
    return chr($s);
}

function fix_characters(){
/*
http://php.net/manual/en/language.types.string.php

\[0-7]{1,3}        the sequence of characters matching the regular expression is a character in octal notation
\x[0-9A-Fa-f]{1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation
*/
    global $s;
    $s = preg_replace_callback('/\\\[0-7]{1,3}|\\\x[0-9A-Fa-f]{1,2}/', "replace_chars", $s);
}
?>
Avatar billede FrederikLive Nybegynder
05. november 2012 - 13:17 #7
Har du mulighed for at fortælle hvilken decoder du brugte? Gerne link dertil..
Avatar billede FrederikLive Nybegynder
05. november 2012 - 13:19 #8
Jeg var lige hurtig nok :) Kan nu se det var en fil til at aflæse... Sry. Igen skriv en løsning så jeg kan lukke tråden og mange tak!
Avatar billede lclemens Nybegynder
05. november 2012 - 16:17 #9
okay :)
Avatar billede olebole Juniormester
05. november 2012 - 18:16 #10
<ole>

Der er næppe mange professionelle udviklere, der vil finde det hensigtsmæssigt at spilde de nødvendige serverressourcer til at udrede en obfuskering.

På den anden side er de fleste noobs igennem en periode med 'misundelse' over ikke at (kunne) skrive et kompileret sprog og forsøger derfor at gøre deres kode ulæselig. De fleste finder dog efter nogle år i branchen ud af, at man kun gør sig selv til grin - og at det ikke afholder andre fra at læse koden. Det bliver bare lidt mere besværligt.

Jeg ønsker ikke specielt at latterliggøre forfatteren af scriptet. Jeg mindes blot i skuldertrækkende overbærenhed min egen fase med denne vildfarelse - samt et utal af tråde om emnet ... både her og i andre fora ... både om PHP og JavaScript  =)

Da der ikke er tale om egentlig kryptering, gør det ikke megen gavn - om nogen, overhovedet. Det gør blot udviklerens arbejde mere besværligt. Det ved 'rigtige' udviklere, så man får ofte andre 'uventede gaver' med, når man køber/bruger sådanne scripts  :o|

/mvh
</bole>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester