変更履歴
- 2019/09/28
Array
の取得方法が短くなりました。$__=$_[].=$_;
→$_.=[];
- 2019/09/28 かっこ多めの別解を追加しました。
はじめに
何ヶ月前でしょうか、私はjsfuckに夢中でした。jsfuckとは記号プログラミングの一種で、通常6種類の記号(!
, +
, [
, ]
, (
, )
)のみを使用してjavascriptのコードとして動作させようという試みです。へ、変態だ…。そして、ある日ふと思ったのです。jsfuckがあるならphpfuckだってあるだろ、と。
完成品
$_.=[];$__.=$$_[!_]=$_[!!_]&$_[-!!_];$__.=$_[!!_];$__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_];$$_[_]=$_[!!_]&~$_[!_]^_;$__.=++$$_[_];$__.=$$_[$_[!_]]=$_[!!_]^_^$_[-!!_];$__.=$$_[!_]^$$_[!!_]^_;$$__=$_[!_]^$_[-!!_]&~$_[!!_];$$__.=$$_[$_[!!_]]=$$_[!_]^$$_[$_[!_]]|$_[!_];$$__.=$$_[$_[-!!_]]=$_[!_]^$_[!!_]^_;$$__.=$$_[$_[-!!_]];$$__.=$$_[$$_[!_]]=$_[-!!_]^_^$$_[!!_];$$__.=$$_[!_]&~$$_[$_[!_]];$$_[$$_[!!_]]=$_[!!_]|$_[-!!_]^_;$$__.=++$$_[$$_[!!_]].$$_[$$_[!_]].$_[!!_].$$_[$_[-!!_]];$$__.=$$_[$_[!!_]]&$$_[$_[-!!_]];$__($$__);
解説
-
Array
という文字列を手に入れる。$Array .= []; // Array
-
Array
からA
,r
,y
を取り出す。リテラルをboolean型に変換するとfalse
になります。false
は整数値型に変換すると0
になります。true
なら1
です。配列の添字に使います。echo +!_; // 0 echo +!!_; // 1 $A = $Array[!_]; // A $r = $Array[!!_]; // r $y = $Array[-!!_]; // y
-
A
,r
,y
からp
,I
,n
,T
,f
を作り出す。$p = $r & $y; $I = $y & ~$r | $A; $m = $r & ~$A ^ _; $n = ++$m; $T = $r ^ _ ^ $y; $f = $p ^ $I ^ _;
-
A
,r
,y
,p
,I
,T
からH
,e
,l
,o
,w
,d
とスペースを作り出す。$H = $A ^ $y & ~$r; $e = $p ^ $T | $A; $l = $A ^ $r ^ _; $o = $y ^ _ ^ $I; $space = $p & ~$T; $v = $r | $y ^ _; $w = ++$v; $d = $e & $l;
-
実行
$printf = $p . $r . $I . $n . $T . $f; $helloworld = $H . $e . $l . $l . $o . $space . $w . $o . $r . $l . $d; $printf($helloworld);
-
すべて記号に置き換える。
-
$_
:Array
を退避 -
$$_
: 作り出した文字を退避 -
$__
: 作り出した文字を結合してprInTf
にする -
$$__
: 作り出した文字を結合してHello world
にする
$_.=[]; $__.=$$_[!_]=$_[!!_]&$_[-!!_]; // $$_[!_] <-- p $__.=$_[!!_]; // r $__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_]; // $$_[!!_] <-- I $$_[_]=$_[!!_]&~$_[!_]^_; // $$_[_] <-- m $__.=++$$_[_]; // n $__.=$$_[$_[!_]]=$_[!!_]^_^$_[-!!_]; // $$_[$_[!_]] <-- T $__.=$$_[!_]^$$_[!!_]^_; // f $$__=$_[!_]^$_[-!!_]&~$_[!!_]; // H $$__.=$$_[$_[!!_]]=$$_[!_]^$$_[$_[!_]]|$_[!_]; // $$_[$_[!!_]] <-- e $$__.=$$_[$_[-!!_]]=$_[!_]^$_[!!_]^_; // $$_[$_[-!!_]] <-- l $$__.=$$_[$_[-!!_]]; // l $$__.=$$_[$$_[!_]]=$_[-!!_]^_^$$_[!!_]; // $$_[$$_[!_]] <-- o $$__.=$$_[!_]&~$$_[$_[!_]]; // スペース $$_[$$_[!!_]]=$_[!!_]|$_[-!!_]^_; // $$_[$$_[!!_]] <-- v $$__.=++$$_[$$_[!!_]].$$_[$$_[!_]].$_[!!_].$$_[$_[-!!_]]; // worl $$__.=$$_[$_[!!_]]&$$_[$_[-!!_]]; // d $__($$__); // prInTf(Hello world)
-
-
一行にまとめれば完成
$_.=[];$__.=$$_[!_]=$_[!!_]&$_[-!!_];$__.=$_[!!_];$__.=$$_[!!_]=$_[-!!_]&~$_[!!_]|$_[!_];$$_[_]=$_[!!_]&~$_[!_]^_;$__.=++$$_[_];$__.=$$_[$_[!_]]=$_[!!_]^_^$_[-!!_];$__.=$$_[!_]^$$_[!!_]^_;$$__=$_[!_]^$_[-!!_]&~$_[!!_];$$__.=$$_[$_[!!_]]=$$_[!_]^$$_[$_[!_]]|$_[!_];$$__.=$$_[$_[-!!_]]=$_[!_]^$_[!!_]^_;$$__.=$$_[$_[-!!_]];$$__.=$$_[$$_[!_]]=$_[-!!_]^_^$$_[!!_];$$__.=$$_[!_]&~$$_[$_[!_]];$$_[$$_[!!_]]=$_[!!_]|$_[-!!_]^_;$$__.=++$$_[$$_[!!_]].$$_[$$_[!_]].$_[!!_].$$_[$_[-!!_]];$$__.=$$_[$_[!!_]]&$$_[$_[-!!_]];$__($$__);
別解
上記を応用すれば別解を生み出せます。
$_=$$__[_==[]]=([].[])[![]]&([].[])[-![]];$_.=([].[])[![]];$_.=$$__[[]==[]]=([].[])[-![]]&~([].[])[![]]|([].[])[!![]];$$__[_]=([].[])[![]]&~([].[])[!![]]^_;$_.=++$$__[_];$_.=$$__[([].[])[!![]]]=([].[])[![]]^_^([].[])[-![]];$_.=$$__[[]!=[]]^$$__[[]==[]]^_;$$_.=([].[])[!![]]^([].[])[-![]]&~([].[])[![]];$$_.=$$__[([].[])[![]]]=$$__[_==[]]^$$__[([].[])[!![]]]|([].[])[!![]];$$_.=$$__[([].[])[-![]]]=([].[])[!![]]^([].[])[![]]^_;$$_.=$$__[([].[])[-![]]];$$_.=$$__[$$__[!![]]]=([].[])[-![]]^_^$$__[[]==[]];$$_.=$$__[_==[]]&~$$__[([].[])[!![]]];$$__[$$_[![]]]=([].[])[![]]|([].[])[-![]]^_;$$_.=++$$__[$$_[![]]].$$__[$$__[!![]]].([].[])[![]].$$__[([].[])[-![]]];$$_.=$$__[([].[])[![]]]&$$__[([].[])[-![]]];$_($$_);
解説
-
はじめの文字列は
ArrayArray
でも構わない。[].[] // ArrayArray
-
添字に使用する
0
と1
はboolean
であれば良いので夢が広がる。echo !![]; // 0 echo ![]; // 1 echo _!=_; // 0 echo _==_; // 1 echo _==[]; // 0 echo []==[]; // 1
-
"ArrayArray"[0]
でA
が取り出せる。([].[])[!![]]; // A
おまけ
文字の作り方
$chr = ['A', 'r', 'y', '~A', '~r', '~y'];
$opr = ['^', '&', '|'];
for ($i=0; $i<count($chr); $i++) {
for ($j=0; $j<count($opr); $j++) {
for ($k=0; $k<count($chr); $k++) {
$str = $chr[$i] . $opr[$j] . $chr[$k];
$exec = 'echo ' . $str . ';';
eval($exec);
echo ' --> ' . $str . "\n";
}
}
}
参考
元ネタは下記。もっとマニアックなテクニックを知り、phpfuckを極めたい方はこちらを。