JavaScript の組み込み文字列とは何ですか? 質問する

JavaScript の組み込み文字列とは何ですか? 質問する

この質問を質問タイトルで要約するのは難しい

アップデートこの質問から抽出した文字に基づいて入力から難読化された文字列を構築するJSFiddleを作成しました。アクセスできます。ここ、または要旨もっと簡単になりますか?

私は最近、難読化されたJavaScriptの面白い部分を見つけました。このプロフィールそれは次のようになります:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

驚きを台無しにして申し訳ありませんが、これを評価すると、次の結果が返されます。

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10

これを分解すると、一連のメッセージを生成し、次のようにそこから文字を取り出すことになります (例として「I」を使用)。

[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"

生成されるその他の文字列は次のとおりです。

({}+[])       -> "[object Object]" (where the space comes from)
([]+!!-[])    -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[])  -> "undefined"

私は「n」と「[」の代わりのものを見つけることに興味があり、これを思いつきました:

String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))

これは 1 と 0 を使用するという精神に合っていると思いますが、文字列とはまったく関係がないように見えるという、元のコードのよりエレガントな側面の 1 つに違反しています。元の難読化されたコードと一致する「v」を生成する方法について、他にアイデアをお持ちの方はいらっしゃいますか?

これは、多くの優秀なJavaScriptプログラマーがこれを詳しく調べた結果見つかった追加情報です。

Firefox は、次の行のせいで「I lone you」を返します:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+

[1^11<<1]これから特定の文字をトリミングします:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])

これは次のように評価されます:

"function test() {
    [native code]
}"

どうやら私たちは「V」を獲得したようです!!!

Chrome は「I love you」を返します。同じコードが以下を返すためです。

"function test() { [native code] }"

「実際のプログラミングの問題」との疑わしい関連性のために質問が閉じられる前に、私は要約した解決策を追加しようと思いました。@Suprの@コリーのそして@alpha123 の見よ:

alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])

コードの複雑さとそれが生成するメッセージを考えると、JavaScript エンジンが、あなたがそれをどれだけ特別なものにしているかを伝えているようです :)

ベストアンサー1

まず最初に、この面白いスニペットを遊んでくれたジェイソンとすべての貢献者に感謝したいと思います。私はそのコードを書いたのですがただ楽しむため2 月 14 日に妻に送るためです :) ラップトップには Chrome しかインストールされていないため、Firefox や IE での動作を確認するオプションがありませんでした。さらに、toString()組み込みメソッドの表現が他のブラウザーでは異なる可能性があることをあまり予想していませんでした。

今、本当の問題に移るでは、コードを正確に見てみましょう。そう、これ"v"が本当の「問題」でした。[native code]組み込みメソッドから取得できる文字列を解析する以外に、この文字を取得する方法は見つかりませんでした。文字列と数値は使用されていないという制限があったため1、名前に使用可能な文字のみを含むメソッドを活用する必要がありました。

使用可能な文字は、既存のキーワードと文字列表現から取得できます。つまり、最初からNaN、、、、、、、およびがありました。そのうちのいくつかは簡単に文字列に変換できます。たとえば、はnullになります。undefinedInfinitytruefalse"[object Object]"1/!1+[]"Infinity"

[]私は配列、オブジェクト{}、正規表現/(?:)/、数値1.1、文字列のさまざまな組み込みメソッドを分析し、オブジェクト"1"の美しいメソッドを発見しました。RegExptest()その名前は、使用可能なすべての文字から組み立てることができます。たとえば、"t""e"は からtrue、 と"s"から組み立てられますfalse。私は文字列を作成し"test"、正規表現リテラル の角括弧表記を使用してこのメ​​ソッドに対処しました/-/。これは、次の行で正しく識別されます。

/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]]

すでに説明したように、このコードは Chrome では次のように評価されます。

function test() { [native code] }

Firefoxでは次のように表示されます:

function test() {
    [native code]
}

IE では次のようになります:

 function test() {     [native code] }  

(後者の給与では特別キーワードの前のスペースに注意してくださいfunction

したがって、明らかにわかるように、私のコードは提示された文字列から 24 番目の文字を取得していましたが、これは Chrome では"v"(計画どおり) 実現されましたが、残念ながら Firefox と IE ではそれぞれ実現されませんでし"n""["

すべてのブラウザで同じ出力を得るために、私は異なるアプローチ他の回答で示されているものよりも。修正版は次のようになります。

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+/\[[^1]+\]/[([]+![])[1<<1<<
1]+(/|/[(1+{})[1+11>>>1]+[[]+{}][+!1][1]+([]+1/[])[1<<1>>1]
+([1<1]+[])[1+11>>>1+1]+[[!!1]+1][+[]][1-1]+([]+!!/!/)[1|1]
+(/1/[1]+[])[!1%1]+(-{}+{})[-1+1e1-1]+(1+[!!1])[1]+([]+1+{}
)[1<<1]+[!!/!!/+[]][+[]][1&1]]+/=/)[1e1+(1<<1|1)+(([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[1^1]==+!1)]+(!![]+{})[1|1<<1]+[1+{}+1][!1+!1][(11>>1)+1
]](([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+
(!!1+[])[1^1]]))[1&.1][11>>>1]+([,][~1]+[])[1-~1]+[[]+{}][!
1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[]
,[]+{}][1<<1>>>1][1||1]+(/[<+>]/[1&1|1]+[1.1])[1/11.1&1.11]

しかし、読者の興味を引くために、その解決策は提供しません。仕組みは簡単に理解できると心から信じています...そして、クロスブラウザ方式で愛する人を驚かせる人もいるかもしれません;)

追伸もう一つの難読化装置

ジェイソンのユニバーサルな難読化ツールを作成するというアイデアに触発されて、私はもう1つツールを作成しました。JSBin:http://jsbin.com/amecoq/2[0-9]数字、小さなラテン文字、スペースを含むテキストを難読化できます[a-z]。文字列の長さは主に RAM によって制限されます (少なくとも私の回答の本文は難読化に成功しました)。出力は Chrome、Firefox、IE でサポートされています。

ヒント:このツールは、上で紹介したものとは異なる難読化アプローチを使用します。

おすすめ記事