"програмная строка" - средство мгновенного программирования в php

Discussion in 'ПО для Web разработчика' started by ckpunmkug, 10 May 2017.

  1. ckpunmkug

    ckpunmkug Member

    Joined:
    20 Mar 2017
    Messages:
    63
    Likes Received:
    65
    Reputations:
    10
    Архиполезная фигня для одноразового программирования и программирования в реальном времени.
    Сама строка является примером так называемого настоящего хака ( true hack ).
    Можете сами попробовать решить такую задачу средствами php:
    С помощью readline получить строку добавить её в readline history и исполнить её в eval, при этом нельзя использовать переменные.
    Code:
    <?php
    while(true)
        eval
            (
            call_user_func
                (
                function()
                    {
                    readline_add_history(func_get_arg(0));
                    return(func_get_arg(0));
                    },
                readline("<?php ")
                )
            );
    

    Иногда при использовании строки она завершается с ерором, чаще всего это происходит тогда когда ошибаешся с синтаксимом или напишешь неправильно имя функции. Для сохранения переменных и истории заделана функция которая всё сохраняет на выходе. Здесь тоже всё без переменных. И учтите если скрипт не нашел историю и переменные он вам об этом не скажет, но ругнётся на выходе если не сможет сохранить их.

    Code:
    <?php
    register_shutdown_function
        (
        create_function
            (
             ""
            ,<<< 'src'
    readline_write_history( $_SERVER['HOME'].'/.cmpoka/history' );
    file_put_contents( $_SERVER['HOME'].'/.cmpoka/GLOBALS', "<?php\n" );
    
    reset( $GLOBALS );
    while( key( $GLOBALS ) !== NULL
        && current( $GLOBALS ) !== false )
        {
        if
            (
               !in_array
                   (
                    key( $GLOBALS )
                   ,array
                       (
                        'GLOBALS'
                       ,'_SERVER'
                       ,'_GET'
                       ,'_POST'
                       ,'_FILES'
                       ,'_REQUEST'
                       ,'_SESSION'
                       ,'_ENV'
                       ,'_COOKIE'
                       ,'php_errormsg'
                       ,'HTTP_RAW_POST_DATA'
                       ,'http_response_header'
                       ,'argc'
                       ,'argv'
                       )
                   )
             && in_array
                    (
                 gettype( current( $GLOBALS ) )
                ,array
                        (
                         'boolean'
                          ,'integer'
                          ,'double'
                          ,'float'
                          ,'string'
                          ,'array'
                          ,'NULL'
                          )
                    )
            )
            {
            file_put_contents
                (
                 $_SERVER['HOME'].'/.cmpoka/GLOBALS'
                , '$'.key( $GLOBALS )
                 . '='
                 . var_export( current( $GLOBALS ) ,true )
                 . ";\n"
                ,FILE_APPEND
                );
            }
        next( $GLOBALS );
        }
    src
    ));
    
    if( file_exists( $_SERVER['HOME'].'/.cmpoka/history' )
    && is_file( $_SERVER['HOME'].'/.cmpoka/history' ) )
         {
        readline_read_history( $_SERVER['HOME'].'/.cmpoka/history' );
        }
    
    if( file_exists( $_SERVER['HOME'].'/.cmpoka/GLOBALS' )
    && is_file( $_SERVER['HOME'].'/.cmpoka/GLOBALS' ) )
         {
        include( $_SERVER['HOME'].'/.cmpoka/GLOBALS' );
        }
    
    Так же пригодится функция для отображения списка переменных.

    Code:
    <?php
    function print_vars()
        {
        reset($GLOBALS);
        while(key($GLOBALS)!==NULL && current($GLOBALS)!==false)
            {
            if(
            !in_array
                (
                key($GLOBALS),
                array
                    (
                    'GLOBALS',
                    '_SERVER',
                    '_GET',
                    '_POST',
                    '_FILES',
                    '_REQUEST',
                    '_SESSION',
                    '_ENV',
                    '_COOKIE',
                    'php_errormsg',
                    'HTTP_RAW_POST_DATA',
                    'http_response_header',
                    'argc','argv'
                    )
                )
            &&
            in_array
                (
                gettype(current($GLOBALS)),
                array
                    (
                    'boolean',
                    'integer',
                    'double',
                    'float',
                    'string',
                    'array',
                    'NULL'
                    )
                )
            )
                {
                echo('$'.key($GLOBALS).' - '.gettype(current($GLOBALS))."\n" );
                }
            next($GLOBALS);
            }
        }
    
    И парочка функция для более удобной отгрузки загрузки переменных.

    Code:
    <?php
    function export( $file_name, $variable )
        {
        file_put_contents( $file_name, serialize($variable) );
        }
    function import( $file_name )
        {
        return( unserialize( file_get_contents( $file_name ) ) );
        }
    function load_list( $file_name )
        {
        return( file( $file_name, FILE_IGNORE_NEW_LINES ) );
        }
    function save_list( $file_name, $array )
        {
        if( is_array( $array ) )
            {
            $text .= '';
            foreach( $array as $string )
                {
                if( is_string( $string ) )
                    {
                    $text .= $string."\n";
                    }
                }
            return( file_put_contents( $file_name, $text ) );
            }
        else
            {
            return( false );
            }
        }
    function unset_all()
        {
        $names = array(  );
        reset($GLOBALS);
        while(key($GLOBALS)!==NULL && current($GLOBALS)!==false)
            {
            if(
            !in_array
                (
                key($GLOBALS),
                array
                    (
                    'GLOBALS',
                    '_SERVER',
                    '_GET',
                    '_POST',
                    '_FILES',
                    '_REQUEST',
                    '_SESSION',
                    '_ENV',
                    '_COOKIE',
                    'php_errormsg',
                    'HTTP_RAW_POST_DATA',
                    'http_response_header',
                    'argc','argv'
                    )
                )
            &&
            in_array
                (
                gettype(current($GLOBALS)),
                array
                    (
                    'boolean',
                    'integer',
                    'double',
                    'float',
                    'string',
                    'array',
                    'NULL'
                    )
                )
            )
                {
                array_push( $names, key($GLOBALS) );
                }
            next($GLOBALS);
            }
        foreach( $names as $name )
            {
            unset( $GLOBALS[ $name ] );
            }
        }
    
    Вообще я пользуюсь данным инструментом для создания одноразовых программ. Выглядит это примерно так: Загрузил один список, фильтранул, загрузил второй, фильтранул, склеил вместе, посмотрел результат, отгрузил array, отгрузил список.

    Удобно пользоваться комбинацией кода из редактора и из строки.
    Например в редакторе пишем такой код

    Code:
    if( false )
        {
        // Здесь уже ненужный код
        }
    
    if( true )
        {
        // Здесь что-то исполняется изменяются переменные
        }
    
    Затем делаем include файла из редактора в строке, смотрим результаты, подправляем переменные. В общем корректируем результаты исполнения куска кода.

    В целом эта штука довольно сильный инструмент. Например: однажды, буквально за 20 минут и только им, я распаковал dle.
     
    #1 ckpunmkug, 10 May 2017
    Last edited: 14 May 2017
  2. Тот_самый_Щуп

    Тот_самый_Щуп Reservists Of Antichat

    Joined:
    23 Mar 2017
    Messages:
    265
    Likes Received:
    173
    Reputations:
    119
    за 20 минут распаковал DLE, это сильно...
    Пользуйся unzip -C /whost/dle.zip это ещё быстрее
     
  3. ckpunmkug

    ckpunmkug Member

    Joined:
    20 Mar 2017
    Messages:
    63
    Likes Received:
    65
    Reputations:
    10
    Если не знаешь, сиди молча ( pa3BeJLocb nu3ga6oJLoB ). Имелась в виду вот эта упаковка.
    Code:
    <?php
    /*
    =====================================================
    DataLife Engine - by SoftNews Media Group
    -----------------------------------------------------
    http://dle-news.ru/
    -----------------------------------------------------
    Copyright (c) 2004,2016 SoftNews Media Group
    =====================================================
    */
    ?><?php $_F=__FILE__;$_X='Pzc5PzRCNA1zRyoNc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
    QUFBQUFBQUFBDXMxdHZNdkxoU2wxPmtwaGtsMS0xS3oxCk9TTVpsclUxSGxpaHYxNj1PUDQNcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS
    0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDXMxQk1NNDpHR2ljbC1rbHJVST1QRw1zLS0tLS0tLS0tLS0tLS0tLS0tLS0t
    LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NczFYTzR6PWhwQk0xKH0pMU53d2EtTndWbjEKT1NNWmxyVTFIbGlodjE2PU
    9QNA1zQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUENczHE4O3t++kx6u7kMefg+ej5
    5e0x4OLy7vDx6ujs6DHv8ODi4OzoDXNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ
    1zMdTg6es6MWhraWxvSTRCNA1zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NczHN
    4Oft4Pfl7ejlOjHD6+Di7eD/MfHy8ODt6PbgDXNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU
    FBQUFBQQ1zKkcNcw1zQE9LX1VNdj1NMSgpOw1zQE9LX2hmNGNofWhNX1NjUFVCMSgxdzEpOw1zDXNoUygxIWlsU2hrbGkoMSc+X3Q+
    L3E+WFlKPnQnMSkxKTFqDXMNcwlAbD09Tz1fPWw0Tz1NaGtwMSgxPl9ZTEwxXjE+X2JZcVpXWjYxXjE+X1pESldYPjEpOw1zCUBoa2
    hfVWxNMSgxJ2w9PU89Xz1sNE89TWhrcCcsMT5fWUxMMV4xPl9iWXFaV1o2MV4xPl9aREpXWD4xKTsNcw1zdTFsY1VsMWoNcw1zCUBs
    PT1PPV89bDRPPU1oa3AxKDE+X1lMTDFeMT5fYllxWldaNjFeMT5fdD4vcT5YWUo+dDFeMT5fWkRKV1g+MSk7DXMJQGhraF9VbE0xKD
    EnbD09Tz1fPWw0Tz1NaGtwJywxPl9ZTEwxXjE+X2JZcVpXWjYxXjE+X3Q+L3E+WFlKPnQxXjE+X1pESldYPjEpOw1zDXN1DXMNc0Bo
    a2hfVWxNMSgxJ2loVTRjdnpfbD09Tz1VJywxTT1QbDEpOw1zQGhraF9VbE0xKDEnQk1mY19sPT1PPVUnLDFTdmNVbDEpOw1zDXNpbF
    Noa2wxKDEndFlKWUxXWz4+WjZXWj4nLDFNPVBsMSk7DXNpbFNoa2wxKDEncURESl90V3EnLDFpaD1rdmZsMSgxX19bV0w+X18xKTEp
    Ow1zaWxTaGtsMSgxJz5aNldaPl90V3EnLDFxRERKX3RXcTFJMSdHbGtwaGtsJzEpOw1zDXM9bC5QaD1sX09rfWwxcURESl90V3ExST
    EnR2xrcGhrbEdoa2hNSTRCNCc7DXMNcz83';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9Y
    KTskX1g9c3RydHIoJF9YLCd9ZE94dGlBcnU4L2NHNDJOd2pdU002Q1QuRgpZc21bSEVETG8zeWZiPDBCV1puVXFLSlJwPmthaFhsIF
    FnejV7PVZQdjk3ZUkxJywnY2tvekRkPXd9SlBsL3A4MjB7N2Z0R0hZcVFTQQpbRk01T0x4OV1tV1ZCaElONnNSYlQzZ0VuNGlDZVh2
    anlaVXIxdWE8PksuICcpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOy
    RfWD0wOw=='));?>
    
     
  4. ckpunmkug

    ckpunmkug Member

    Joined:
    20 Mar 2017
    Messages:
    63
    Likes Received:
    65
    Reputations:
    10
    Оказалось что не 20 минут, а пара часов. Вникайте кому интересно.
    Code:
        // Найдём все файлы
    $dn='/tmp/dle/upload'; $FN=array($dn); for($i=0; $i<count($FN); $i++){ if(is_dir($FN[$i])) foreach(scandir($FN[$i]) as $fn) if($fn!='..' && $fn!='.') array_push($FN, "{$FN[$i]}/{$fn}"); }
    $all_FN=$FN;
        // Оставим файлы без ошибок синтаксиса
    $c=0; $a=array(); foreach($FN as $fn){ echo("\r".$c++); if(is_file($fn)){ $o=array(); $r=0; exec(PHP_BINARY.' -l '.$fn, $o, $r); if($r==0) array_push($a,$fn); } }
    $FN=$a;
        // Оставим файлы в которых есть php открывашка
    $a=array(); foreach($FN as $fn){ $TKN=token_get_all(file_get_contents($fn)); foreach($TKN as $tkn) if(is_array($tkn) && ($tkn[0]==T_OPEN_TAG || $tkn[0]==T_OPEN_TAG_WITH_ECHO)){ array_push($a, $fn); break; } }
    $FN=$a; $src_FN=$a;
        // Посмотрим где сколько токенов
    foreach($FN as $fn){ $TKN=token_get_all(file_get_contents($fn)); echo(count($TKN)."\t{$fn}\n");
        // Оставим тех, у кого 29 токенов
    $a=array(); foreach($FN as $fn){ $TKN=token_get_all(file_get_contents($fn)); if(count($TKN)==29) array_push($a,$fn);
    $FN=$a; $packed_FN=$a;
        // Посмотрим токены упаковки
    $fn=$FN[0]; $TKN=token_get_all(file_get_contents($fn)); print_r($TKN);
        // Подмечаем
        // X 11,1;
        // D base64_decode и параметр 24,1
    echo( base64_decode( $TKN[24][1] ) );
    $TKN=token_get_all( '<?'.base64_decode( $TKN[24][1] ) ); print_r( $TKN );
        // Поглядев внимательно становится ясно как это работает
        // пробуем для одного
    $fn=$FN[0]; $TKN=token_get_all(file_get_contents($fn)); $src=base64_decode($TKN[11][1]); $TKN=token_get_all( '<?'.base64_decode( $TKN[24][1] ) ); $src=strtr($src, $TKN[14][1], $TKN[16][1]); echo($src);
        // Оформим в функцию
    $unpack = function($fn){ $TKN=token_get_all(file_get_contents($fn)); $src=base64_decode($TKN[11][1]); $TKN=token_get_all( '<?'.base64_decode( $TKN[24][1] ) ); $src=strtr($src, $TKN[14][1], $TKN[16][1]); return( $src ); };
        // Поглядим на все файлы
    foreach($FN as $fn){ echo($unpack($fn)."\nHa]I[Mu Enter"); fgets(STDIN); }
    
    А теперь загадка: "HaxpeHa MeHRJLu __FILE__"
    потому что в eval отсутствует волшебная константа __FILE__