EBCDIC文字コードで記号プログラムを難読化する

takesako
2010-12-18

3回連続で執筆を担当しているid:TAKESAKOです。

ASCIIと非互換な文字コードとして古くからEBCDICが知られています。
今日は記号プログラミングでわかりにくくしたJavaScriptプログラムをASCII非互換の文字コードEBCDICでさらに難読化してみようと思います。

EBCDICとは

1964年にIBMによって作られた汎用大型コンピュータ用の文字コードがEBCDICです。
EBCDICは「Extended Binary Coded Decimal Interchange Code」の略で「エビシディック」と発音します。COBOLなどの古代言語で使用された二進化十進数(BCD)を拡張する形で文字コードが定義されています。メインフレームやホストコンピュータなどで現在も使用されている現役バリバリの文字コードです。

cp500(International EBCDIC)

EBCDICには、いくつかのコードページがあるのですが、記号プログラムの難読化に一番使えそうなcp500を考えてみます。

cp819(ISO-8859-1)

これをISO-8859-1のコードページcp819と比較すると以下になります。

ASCIIと非互換なEBCDIC

cp500で読み込むと、以下の記号は次の表で置き換えられてしまいます。

Hex ASCII cp500
0x5b [ $
0x5c \
0x5e ^ ;
0x60 ` -
0x7e ~ =
0x7d } '

これを利用して記号のみで書かれたJavaScriptプログラムを難読化してみましょう。

ebcdic.js

以下のファイルをASCIIで1行書いてみます(ただし改行は除く)。

[~}}^[``^[`~``[\``[`[^

このファイルをcp500のEBCDIC文字コードで読み直すと以下になります。

$='';$--;$-=--$*--$-$;

変数$に-10を代入していることになります。

ebcdic.html

以下のHTMLを作成し、cp500のEBCDIC文字コードでさきほどのJavaScriptファイルを読み込んで実行してみましょう。

<!DOCTYPE html>
<meta charset="cp819"/>
<script charset="cp500" src="ebcdic.js"></script>
<script>
''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')
[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')
[_]][_](_[_][_]((_=-~-~''+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')
[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',~_^~_*_+_,_*_+_-~_,_<<_-~_,~_*~_|_,~_*
_^~_*_+_,_<<_-~_,_*_+_-~_,-_*~_+_,_<<_-~_|_,~(_*-_+_),(_-~_+_|_)+'("',(_+_)
*_,(_-~_+_|_)-~_,_/_|_*_+_,-~(_*_<<_*_),_-~_+_-~_,_*_+_-~_,~_*_^~_*_+_,(_<<
_-~_)+'.',_*_+_,(_-~_+_|_)-~_,(_+_)*_,(_-~_|_<<_-~_|_)+'.',~(~_-_+_),~_*_^~
_*_+_,~_*_^~_*_+_,_*_+_-~_,-_*~_+_,_|_<<_,_+_*_,_/_+_-~_,(~-_+_|_)+'=',''+_
%_+_*_,~(_*-_+_),_<<_-~_,(_*_+_-~_)+'()",-$*$*$)'][(_+{})[_*_]+(_+{})[_]+(_
+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())()
</script>

さて、どうなったでしょうか?

動作ブラウザ

Windows上のIEやSafariのブラウザではそのままOSの提供するEBCDICの文字コード変換エンジンが利用できます。驚くべき事に最新のWindowsでもEBCDICのサポートは続けられているのです。

さらに詳しく

IBMのコードページ500(EBCDIC)を利用したハックはgihyo.jpのエイプリルフール記事として掲載させていただきましたので、もしも興味のある方はご覧になってください。