Подтвердить что ты не робот

Как работает этот знаменитый JAPH?

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, это печатает "просто еще один взломщик хакеров". Но я хотел бы полу-подробное раскрытие того, какое поведение этот конкретный JAPH использует для работы - я не гожусь на Perl, но некоторые JAPH, которые я могу прочитать... это, никоим образом.

4b9b3361

Ответ 1

Это действительно не так сложно, как только вы поняли основы. Вот несколько советов, которые помогут вам начать:

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, u, s, t.:)

Просто для удовольствия, я написал расширение этого знаменитого japhs лет назад:

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

печать реальной строки "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

Ответ 2

Первое появление этого JAPH похоже на http://www.perlmonks.org/?node_id=290607

Как сказано в потоке PerlMonks, теперь есть автоматический инструмент, который делает этот вид обфускации: http://namazu.org/~takesako/ppencode/

Вы можете прочитать исходный код, но обратное проектирование настолько смешнее:)

Например, здесь код для печати пробела:

[email protected]:~$ perl -e 'length q chmod lc and print chr ord q q eq'
 [email protected]:~$ 

Является ли это единственным способом печати символа? На самом деле, нет, освежает:

[email protected]:~$ perl -e 'oct oct hex ord q else and print chr ord q q q'
 [email protected]:~$ 

Прохладный, оба варианта заканчиваются на одном и том же and print chr ord q q .... Таким образом, все, что до этого должно оценивать до истинной ценности, и есть только пыль наших глаз.

Тогда print chr ord можно упростить до простого print в этом контексте, поскольку chr(ord($str)) выбирает только первый символ из $str. Так оно сводится к:

[email protected]:~$ perl -e 'print q q eq'
 [email protected]:~$ 

q q eq является необычным представлением кавычки q, его легче распознать как q ( e). Эта же логика работает для оригинального, еще более запутанного JAPH: print chr ord for qw y ... y будет выбирать все между символами y и разделяться пробелами как массив.


Существует связанная с этим тема, которая касается кода Perl в виде искусства ASCII. Для этого также есть модуль CPAN: Acme::EyeDrops