Как работает этот знаменитый 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, которые я могу прочитать... это, никоим образом.
Ответы
Ответ 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