Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12675[/thread]

Wie funktioniert diese JAPH-Obfuscation?

Leser: 1


<< >> 5 Einträge, 1 Seite
KeinGast
 2008-10-26 13:46
#115757 #115757
User since
2008-10-26
2 Artikel
BenutzerIn
[default_avatar]
Hallo,
gibt es irgendwo eine Seite, die die Erklärung zu folgendem, nur aus Sonderzeichen bestehenden Code liefert oder möchte sich jemand daran Versuchen eine Erklärung dafür zu schreiben?

Code (perl): (dl )
1
2
3
4
`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++;
$_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`


Ich habe ihn bei mir in vernünftige Zeilen gesetzt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
`$=`;
$_=\%!;
($_)=/(.)/;$==++$|;
($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;
$.++;
$.++;
$_++;
$_++;
($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++
;
$,++;
$^|=$";
`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`


Weiter bin ich nicht gekommen.. ich dachte, als ich Perl gelernt habe, dass das ja nicht so schwierig werden kann, weil ich ja schon jahrelange PHP-Erfahrung habe.. aber ich scheine mich in dem Umfang der Sprache getäuscht zu haben ;-)

Er läuft laut Wikipedia nur unter Unix-basierten Systemen und gibt "Just another Perl hacker." aus.
Zumindest bei mir..

Liebe Grüße
moritz
 2008-10-26 15:04
#115758 #115758
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
KeinGast+2008-10-26 12:46:41--
Code (perl): (dl )
`$=`;


$= ist eine spezielle Variable, die per Default den Wert 60 enthält. `$=` probiert also, das Kommando mit dem namen 60 ausführen. Was fehlschlägt. Also werden die Fehlervariablen $! und %! gesetzt. (Siehe perlvar).

Quote
Code (perl): (dl )
$_=\%!;


Der Variablen $_ wird eine Referenz auf %! zugewiesen.

Quote
Code (perl): (dl )
($_)=/(.)/;


Der Wert in $_ (dessen String-Representation mit HASH( anfängt) wird gegen die regex (.) gemacht, $1 wird in $_ gespeichert. Also enhält $_ jetzt den Wert "H".

Quote
Code (perl): (dl )
$==++$|;


$| wird um eins erhöht (auf 1), das Ergebnis in $= gespeichert.

Quote
Code (perl): (dl )
1
2
($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),


Hier werden alle möglichen Buchstaben der in $! gespeicherten Fehlermeldung extrahiert und in allen möglichen obskuren Variablen gespeichert. Wenn dich ihre genauen Werte interessieren, lass sie dir einfach ausgeben.

Quote
Code (perl): (dl )
1
2
3
4
5
$=++;
$.++;
$.++;
$_++;
$_++;


selbsterklärend, hoffe ich.

Quote
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);
# hier werden obskure Variablen zu verschiedenen Strings kombiniert
# und in $_, $\ und $, gespeichert.
$,++;
$,++;
$^|=$";
# $^ enthält per default STDOUT_TOP. das wird mit dem Wert von $" bit-wise
# per OR verknüpft.

`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`
# hier wird "echo Just another Perl hacker." ausgeführt


Mir ist das jetzt zu viel Arbeit, genau nachzuvollziehen welcher Wert in welcher obskuren Variable steht, aber die allgemeine Idee ist, sich aus der Fehlermeldung die nötigen Buchtstaben zu holen, sie in diversen Variablen abzuspeichern und wieder zu kombinieren.
KeinGast
 2008-10-26 19:46
#115767 #115767
User since
2008-10-26
2 Artikel
BenutzerIn
[default_avatar]
Hey, ich habs verstanden! :-)
Die Erklärung war absolut super, danke!

Diese gleichzeitige Zuweisung mehrerer Variablen kannte ich bisher noch nicht:
Code (perl): (dl )
($foo,$bar)=("eins","zwei");


Sehr interessant finde ich auch, dass der Perl-Syntaxhighlighter in gedit (und hier im Forum) das $# scheinbar nicht als Variable, sondern das # als start eines Kommentars versteht. Das hatte mich ziemlich verwirrt vorhin.

Auf jeden fall ist das Auslesen von Buchstaben aus einer Fehlermeldung eine sehr interessante Idee..

Danke nochmal an dich, moritz!
Dubu
 2008-10-27 07:30
#115770 #115770
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
KeinGast+2008-10-26 18:46:38--
Diese gleichzeitige Zuweisung mehrerer Variablen kannte ich bisher noch nicht:
Code (perl): (dl )
($foo,$bar)=("eins","zwei");


Sicher, dass du es noch nicht gesehen hast? ;-)
Der häufigste Fall, in dem man das braucht, ist wahrscheinlich die Zuweisung von Übergabeparametern in einer Sub:
Code (perl): (dl )
1
2
3
4
sub foo {
   my ($name, $value, $flags) = @_;
   ...
}


Aber in Perl lassen sich damit auch elegant Variableninhalte tauschen, ohne wie in vielen anderen Sprachen eine Zwischenvariable oder einen nicht ungefährlichen XOR-Hack zu benutzen:
Code (perl): (dl )
1
2
# tausche Inhalte von $x und $y
($x, $y) = ($y, $x);
murphy
 2008-10-27 15:25
#115777 #115777
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote="Dubu+2008-10-27 06:30:10--"]
KeinGast+2008-10-26 18:46:38--
[...] Aber in Perl lassen sich damit auch elegant Variableninhalte tauschen, ohne wie in vielen anderen Sprachen eine Zwischenvariable [...] zu benutzen:
Code (perl): (dl )
1
2
# tausche Inhalte von $x und $y
($x, $y) = ($y, $x);


Stimmt, in Perl alloziert man dafür durch ($y, $x) effektiv zwei temporäre Variablen auf dem Stack ;-P
When C++ is your hammer, every problem looks like your thumb.
<< >> 5 Einträge, 1 Seite



View all threads created 2008-10-26 13:46.