« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »

2024年1月25日 (木)

ソースコードという名前のエンジニア向け日本酒が発売、ラベルにコードが書いてある…のをBingのAIチャットに解読してもらった。基本、JavaScriptを難読化していて、+!![]は1、~~[]は0、joinで数字をまとめてfromCodePointでUnicode文字にして出力している。

エンジニア向け日本酒「ソースコード」発売 ラベルには“ソースコード”で隠しメッセージ

という記事を見た。なんだこのラベル…JavaScriptであるということだけはわかるが…

ということでBingのAIチャットに聞いてみた。

javasciriptのこのコードの解説をしてください。
console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))

こんにちは、これはCopilotです。JavaScriptのコードについてお尋ねですね。😊

このコードは、次のような処理を行っています。

  • !![]は、空の配列を論理否定演算子!で二回否定することで、trueに変換します。
  • trueは数値に変換すると1になります。したがって、!![]+!![]+!![]+!![]+!![]+!![]1+1+1+1+1+1と同じで、6になります。
  • 同様に、!![]+!![]+!![]+!![]+!![]+!![]+!![]1+1+1+1+1+1+1と同じで、7になります。
  • [!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],]は、[6,7]という配列を作ります。
  • .join("")は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[6,7].join("")"67"という文字列になります。
  • String.fromCodePointは、引数で指定したコードポイントに対応する文字列を返します。コードポイントとは、文字を表す数値のことです。例えば、String.fromCodePoint(65)"A"という文字列になります。
  • このコードでは、String.fromCodePoint("67")という引数を渡しています。この場合、"67"は数値に変換されて67になります。そして、コードポイント67に対応する文字は"C"です。
  • console.logは、引数で指定した値をコンソールに出力します。コンソールとは、ブラウザの開発者ツールにある画面のことです。
  • したがって、console.log(String.fromCodePoint([!![]+!![]+!![]+!![]+!![]+!![],!![]+!![]+!![]+!![]+!![]+!![]+!![],].join("")))は、"C"という文字列をコンソールに出力します。

このコードは、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。実際には、console.log("C")と書けば同じ結果になります。

Sourcecode01

ではこのコードを解説してください。
console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))

このコードも前のコードと同様に、JavaScriptの特徴を利用して、わざと分かりづらく書かれたものです。次のような処理を行っています。

  • +!![]は、空の配列を論理否定演算子!で二回否定することで、trueに変換し、さらに単項プラス演算子+で数値に変換します。したがって、+!![]1になります。
  • ~~[]は、空の配列をビット単位の否定演算子~で二回否定することで、0に変換します。ビット単位の否定演算子は、数値を32ビットの符号付き整数に変換してから、ビットを反転します。空の配列は数値に変換すると0になり、そのビットを反転しても0になります。
  • [+!![],+!![],~~[],]は、[1,1,0]という配列を作ります。
  • .join("")は、配列の要素を文字列に変換して、引数で指定した文字列(この場合は空文字列)で連結します。したがって、[1,1,0].join("")"110"という文字列になります。
  • String.fromCodePointは、引数で指定したコードポイントに対応する文字列を返します。このコードでは、String.fromCodePoint("110")という引数を渡しています。この場合、"110"は数値に変換されて110になります。そして、コードポイント110に対応する文字は"n"です。
  • console.logは、引数で指定した値をコンソールに出力します。
  • したがって、console.log(String.fromCodePoint([+!![],+!![],~~[],].join("")))は、"n"という文字列をコンソールに出力します。

このコードは、console.log("n")と書けば同じ結果になります。

Sourcecode02

なるほど…というかこれメッセージが現れるだけなのか?とりあえず最初の5文字だけは見えた。瓶がじゃまで…

Congr

Sourcecode03

追記:

Pythonでこの難読JavaScriptのコードを再現するコードを書いて(何をしていることやら)

Sourcecode05

ラベルと見比べた結果、

Sourcecode04

Congratulations!

を繰り返してるな…

…いや違う!

ネタバレは避けるがまだ先があった!

 

ヒントはこれ。

 

« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »

パソコン・インターネット」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 富の分布(最初に同じお金を持っていて、任意の2人でじゃんけんで勝った人が負けた人から1つもらうとだんだん指数分布になる)をPythonでGIFアニメにしてみた。 | トップページ | Pythonの高周波用ライブラリscikit-rfを含んだコードをPyinstallerでEXE化するときFileNotFoundError が出て動かない…が何とかなった。がファイルサイズがでかい…あとspecファイルにonefileしようとしてこれもハマる(option(s) not allowed)が、これは完全に勘違いしていた。 »

最近の記事

最近のコメント

2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
フォト
無料ブログはココログ