2010-02-23 14 views
7

Come funziona questo codice?Come funziona questo codice Perl offuscato?

#!/usr/bin/perl 

$i=4;$|[email protected]=map{("!"x$i++)."K$_^\x{0e}"} 
"BQI!\\","BQI\\","BQI","BQ","B","";push 
@f,[email protected][1..5];@f=map{join"",undef, 
map{chr(ord()-1)}split""}@f;{;[email protected] 
f;print$f;[email protected],$f;select undef,undef, 
undef,.25;redo;last;exit;print or die;} 
+2

qual è il problema, ad eccezione di estrema bruttezza? – anthares

+0

Rumore di linea eseguibile :-D – Krab

+0

Le magiche fate Perl rendono tutto possibile. – Ether

risposta

8

Qui non c'è magia, solo offuscamento. Diamo una visione di alto livello. La prima cosa da notare è che in seguito, ogni personaggio stringhe viene interpretato come se fosse il carattere precedente:

[1] map{chr(ord()-1)} ... 

Così, una stringa come "6qD" si tradurrà in "5rC" (i caratteri prima ' 6 ',' q 'e' D ', rispettivamente). Il punto principale di interesse è l'array di stringhe vicino l'inizio:

[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">","" 

Questo definisce una sequenza di "maschere" che sostituirà in seguito, in questa stringa:

[3] "9$_*\x{0e}" 

Faranno inserire nel punto $_. La stringa \x{0e} rappresenta un carattere di controllo esadecimale; notare che \x{0d}, il carattere immediatamente precedente, è un ritorno a capo. Questo è ciò che verrà sostituito in [3] quando facciamo [1].

Prima che la stringa [3] sia assemblata, viene anteposto un numero di ! uguale a i a ciascun elemento in [2]. Ogni elemento successivo ottiene un altro ! rispetto all'elemento precedente. Si noti che il carattere il cui valore è appena prima dello ! è uno spazio .

Il resto dei itera di script su ciascuno degli elementi dell'array assemblati, che ora assomigliano più a questo:

[4] "!!!!!9>>>E!)\x{0e}", ---> "  8===D (" 
    "!!!!!!9>>>E)\x{0e}", ---> "  8===D(" 
    "!!!!!!!9>>>E\x{0e}", ---> "  8===D" 
    "!!!!!!!!9>>>\x{0e}", ---> "  8===" 
    "!!!!!!!!!9>>\x{0e}", ---> "   8==" 
    "!!!!!!!!!!9>\x{0e}", ---> "   8=" 
    "!!!!!!!!!!!9\x{0e}", ---> "   8" 

Poi l'operazione reverse aggiunge i medesimi elementi in senso inverso, creando un ciclo.

A questo punto si dovrebbe essere in grado di vedere il modello emerge che produce l'animazione. Ora è solo questione di passare attraverso ogni fase dell'animazione e viceversa, cosa che viene compiuta dal resto dello script. Il ritardo passo temporale di ogni fase è regolata dalla dichiarazione prescelta:

[5] select undef, undef, undef, 0.25 

che ci dice di aspettare 250 millisecondi tra ogni iterazione. Puoi cambiarlo se vuoi vederlo accelerare o rallentare.

+0

Ho sostituito la fonte originale con un codice approssimativamente equivalente, che è sicuro per il lavoro. Ti faccio sapere solo se potresti voler modificare la tua risposta. –

16

Lets prima mettere questo attraverso perltidy

$i = 5; 
$| = @f = map { ("!" x $i++) . "9$_*\x{0e}" } ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", ""; 
push @f, reverse @f[ 1..5 ]; 
@f = map { 
    join "", 
     map { chr(ord() - 1) } 
     split // 
} @f; 
{ 
    $f = shift @f; 
    print $f; 
    push @f, $f; 
    select undef, undef, undef, .25; 
    redo; 
    last; 
    exit; 
    print or die; 
} 

La prima linea è evidente.

La seconda riga crea un elenco ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "" e li spazia tutti ugualmente lunghi e aggiunge un asterisco e un 'Shift Out' (il carattere dopo un ritorno a capo).

La terza riga aggiunge gli articoli da 5 a 1 (in questo ordine) a tale elenco, quindi sarà ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", ">", ">>", ">>>", ">>>E".

La mappa decrementa i tutti i caratteri da uno, creando elementi come 8===D().

Il secondo ciclo stampa semplicemente gli elementi della lista in un ciclo ogni 0,25 secondi. Il ritorno a capo fa sì che si sovrascrivano l'un l'altro, in modo che venga visualizzata un'animazione.L'ultimo paio di linee non vengono mai raggiunte e quindi false.

+0

Ho sostituito la fonte originale con un codice approssimativamente equivalente, che è sicuro per il lavoro. Ti faccio sapere solo se potresti voler modificare la tua risposta. –

14

I dati del file vengono caricati in un programma chiamato interprete Perl. L'interprete analizza il codice e lo converte in una serie di "opcodes", un linguaggio bytecode che è a metà strada tra il codice Perl e il linguaggio macchina su cui è in esecuzione il codice. Se non ci sono stati errori nel processo di conversione (chiamato "compilazione"), il codice viene eseguito da un'altra parte dell'interprete Perl. Durante l'esecuzione, il programma può cambiare vari stati della macchina, come allocare, deallocare, leggere e scrivere in memoria, o usare l'input/output e altre caratteristiche del sistema.

(CW - gli hacker più hardcore di quanto io sono invitati a correggere eventuali errori o fraintendimenti e per aggiungere ulteriori informazioni)

+3

LOL. È passato molto tempo da quando ho visto una risposta abigail-letteralmente penosamente letterale. –

+2

+1 La risposta più grande su Stack Overflow eva! – Sampson

Problemi correlati