21
not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split

他の JAPH と同様に、これは "just another perl hacker" を出力します。しかし、この特定の JAPH が機能するためにどのような動作を利用しているかについて、ある程度詳細に分析したいと思います。

4

2 に答える 2

17

基本を理解すれば、それほど難しくはありません。始めるためのヒントを次に示します。

not exp log srand
        # srand = 1, exp o log = id, not 1 = 0

        # $_ = undef
xor s// /x                      
        # $_ = ' '
xor s/ / length uc ord and print chr ord for qw q join use sub tied q/
        # $_ = ' length uc ord and print chr ord for qw q join use sub tied q'

xor eval

chr ord文字列の最初の文字が返され、join use sub tied最後に最初の文字j、、、、が含まれることに注意してください。:)ust

楽しみのために、私は何年も前にこの有名なジャフの拡張を書きました:

not srand xor s qq qx xor s x x length uc
ord and print uc chr ord for qw q join qx
xor eval xor lc eval qq x abs cos ord and
print chr ord for qw q use substr tied qx
xor print qq q q xor int eval lc qq m cos
and print chr ord for qw y abs ne or tied
hex exp ref y m xor scalar srand print qq
q q xor sin abs eval q x log srand ord or
printf uc chr ord foreach qw q package qx
xor sqrt eval lc qq y sqrt cos and printf
chr ord for qw x each return local x y or
print qq s s and uc exp eval q s undef or
oct xor time xor ref print chr int ord lc
for qw y hex alarm chdir kill exec return
y s xor log exp eval q x print chr length
join qw y length for map substr chr shift
y x or sqrt abs ord lc and eval print q q
q and s q q lcfirst chr eval log shift qx

実際の™</sup>文字列を印刷します"Just another Perl hacker,\n"

そして、これはドイツのクリスマスの挨拶を含む小さなバージョンです:

not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q find redo ord helpme
eval scalar qx xor eval xor print
q q q xor int eval lc q m cos and
print chr ord for qw y flock each
s tell y m gt sin ref study split
于 2013-01-21T14:30:45.687 に答える
12

この JAPH の最初の出現は、http://www.perlmonks.org/? node_id=290607 にあるようです。

PerlMonks スレッドが述べているように、現在、この種の難読化を行う自動ツールがあります: http://namazu.org/~takesako/ppencode/

ソースコードを読むことはできますが、リバースエンジニアリングはもっと面白いです:)

たとえば、空白を出力するコードは次のとおりです。

stas@bp0907:~$ perl -e 'length q chmod lc and print chr ord q q eq'
 stas@bp0907:~$ 

これが ' ' 文字を印刷する唯一の方法ですか? 実際には、いいえ、さわやかに次のものが生成されます。

stas@bp0907:~$ perl -e 'oct oct hex ord q else and print chr ord q q q'
 stas@bp0907:~$ 

クール、両方のバリアントが同じand print chr ord q q .... したがって、それより前のすべては真の価値を評価する必要があり、私たちの目をほこりにするだけです.

次に、から最初の文字のみを選択するため、そのコンテキストでprint chr ord単純化できます。つまり、要約すると次のようになります。printchr(ord($str))$str

stas@bp0907:~$ perl -e 'print q q eq'
 stas@bp0907:~$ 

q q eqq引用の珍しい表現であり、より簡単に として認識されq ( e)ます。同じロジックが元の、さらに難読化された JAPH に対しても機能します。つまり、文字間および空白で区切られたprint chr ord for qw y ... yすべてを配列として選択します。y


ASCII アートとして形成された Perl コードに関する関連トピックがあります。そのための CPAN モジュールもあります: Acme::EyeDrops

于 2013-01-21T14:56:39.823 に答える