Diese Frage ist schwer in einem Fragentitel zusammenzufassen
UPDATE Ich habe eine JSFiddle , die eine verschleierte Zeichenfolge aus Ihrer Eingabe baut auf der Grundlage der Briefe aus dieser Frage extrahiert: Sie können darauf zugreifen hier , oder wäre ein Kern einfacher sein?
Ich bin kürzlich auf ein lustiges Stück verschleiertes JavaScript in diesem Profil gestoßen , das so aussieht:
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]
Es tut mir leid, die Überraschung zu ruinieren, aber wenn dies ausgewertet wird, wird Folgendes zurückgegeben:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Die Art und Weise, wie dies funktioniert, wenn es ausgebrochen ist, besteht darin, eine Reihe von Nachrichten zu generieren und Buchstaben wie folgt daraus herauszuziehen (am Beispiel des "Ich"):
[]+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"
Andere Zeichenfolgen, die generiert werden, sind:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
Ich war daran interessiert, einen Ersatz für "n" und "[" zu finden, und fand Folgendes:
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Was ich im Geiste der Verwendung von Einsen und Nullen empfinde, aber gegen einen der eleganteren Aspekte des ursprünglichen Codes verstößt, nämlich den Anschein, überhaupt nichts mit Zeichenfolgen zu tun zu haben. Hat jemand eine Idee, wie ein "v" generiert werden kann, das dem ursprünglichen verschleierten Code entspricht?
Hier sind einige zusätzliche Informationen, die gefunden wurden, nachdem viele talentierte JavaScript-Programmierer dies genauer untersucht hatten
Firefox gibt "Ich habe dich allein" zurück. Wegen dieser Zeile:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
schneidet einen bestimmten Charakter daraus ab:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Was dazu führt:
"function test() {
[native code]
}"
Was so aussieht, als hätten wir unser "V" !!!
Chrome gibt "Ich liebe dich" zurück, da derselbe Code dies zurückgibt:
"function test() { [native code] }"
Bevor die Frage wegen fragwürdiger Verbindung mit "einem echten Programmierproblem" geschlossen wird, dachte ich, ich würde eine zusammengefasste Lösung hinzufügen, die auf @ Supr's , @ Cory's und @ alpha123's aufbaut , sehen:
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])
Angesichts der Komplexität des Codes und der von ihm erzeugten Nachricht ist es fast so, als würde die JavaScript-Engine sagen, wie besonders Sie sich fühlen :)
quelle
function test() { [native code] }
Antworten:
Zunächst möchte ich Jason und allen Mitwirkenden dafür danken, dass sie mit diesem lustigen Ausschnitt gespielt haben. Ich habe diesen Code nur zum Spaß geschrieben, um ihn am 14. Februar an meine Frau zu senden :) Da nur Chrome auf dem Laptop installiert war, hatte ich keine Möglichkeit zu überprüfen, wie er in Firefox und IE funktioniert. Außerdem habe ich nicht wirklich erwartet, dass die
toString()
Darstellung von integrierten Methoden in anderen Browsern anders aussehen könnte.Kommen wir nun zum eigentlichen Problem und schauen wir uns den Code genau an. Ja,
"v"
war das eigentliche "Problem" hier. Ich habe keine andere Möglichkeit gefunden, diesen Buchstaben zu erhalten[native code]
, als die Zeichenfolge zu analysieren , die von jeder integrierten Methode übernommen werden kann. Da habe ich mich darauf beschränkt, keine Strings und keine Zahlen außer zu haben1
verwendet zu haben, musste ich eine Methode ausnutzen, deren Name nur Zeichen enthält.Verfügbare Zeichen können aus vorhandenen Keywords und String - Darstellungen, dh vom Start erhalten werden , die wir hatten
NaN
,null
,undefined
,Infinity
,true
,false
, und"[object Object]"
. Einige von ihnen können leicht in Zeichenfolgen umgewandelt werden, z . B.1/!1+[]
gibt"Infinity"
.Ich habe verschiedene eingebaute Methoden für Arrays
[]
, Objekte{}
, reguläre Ausdrücke/(?:)/
, Zahlen1.1
, Zeichenfolgen analysiert"1"
und eine schöneRegExp
Objektmethode namens entdeckttest()
. Sein Name kann aus allen verfügbaren Zeichen zusammengestellt werden, z. B."t"
und"e"
vontrue
und"s"
vonfalse
. Ich habe eine Zeichenfolge erstellt"test"
und diese Methode in eckigen Klammern für das Regex-Literal behandelt/-/
, das in dieser Zeile korrekt angegeben ist:Wie bereits erwähnt, wird dieser Code in Chrome wie folgt ausgewertet:
in Firefox als:
und im IE als:
(in letzterem achten Sie besonders auf das Leerzeichen vor dem
function
Schlüsselwort)Wie Sie deutlich sehen, erhielt mein Code das 24. Zeichen aus der dargestellten Zeichenfolge, die in Chrome
"v"
(wie geplant) vorhanden war, aber leider in Firefox und IE -"n"
und"["
sind.Um in allen Browsern die gleiche Ausgabe zu erzielen, habe ich einen anderen Ansatz gewählt als in den anderen Antworten dargestellt. Jetzt sieht die modifizierte Version so aus:
Um die Leser zu faszinieren, werde ich jedoch keine Lösung dafür anbieten. Ich glaube ehrlich, dass Sie leicht verstehen werden, wie es funktioniert ... und einige können sogar ihre Geliebte browserübergreifend überraschen;)
PS Noch ein Obfuscator
Inspiriert von Jasons Idee, ein universelles Verschleierungswerkzeug zu schaffen, habe ich noch eines geschrieben. Sie finden es unter JSBin: http://jsbin.com/amecoq/2 . Es kann jeden Text verschleiern, der Zahlen
[0-9]
, kleine lateinische Buchstaben[a-z]
und Leerzeichen enthält. Die Stringlänge ist meistens mit Ihrem RAM begrenzt (zumindest der Text meiner Antwort wurde erfolgreich verschleiert). Die Ausgabe wird von Chrome, Firefox und IE unterstützt.Hinweis: Das Tool verwendet einen anderen Verschleierungsansatz als oben dargestellt.
quelle
Warum wird das
native code
Bit aus der Frage nicht verwendet? Dieser gibt eine'v'
in Chrome und Firefox:Bearbeiten Sie, um IE zu unterstützen, und verzichten Sie auf den ternären Operator: Dieser funktioniert in Chrome, IE und FF. Erstellt ein Array und
==
bestimmt den Browser.Lesbar:
quelle
n
undv
und nur wählen je nachdem , was am größten ist :str[23]>str[27]?str[23]:str[27]
. Mit anderen Worten, der Tertiäroperator ist der Trick. Könnte erweitert werden, um auch IE zu unterstützen:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)]
Dies ist ungefähr so nah wie möglich, leider verstößt es gegen die Konvention der ursprünglichen Verschleierung, indem es anruft
unescape()
:Niederreissen:
Andere Ideen:
unescape("\x76")
118
ohne anzurufenString.fromCharCode()
Aktualisierung:
Ich habe angefangen, Code Golf zu spielen und habe es kürzer gemacht, Teile durch mehr
1
s usw. ersetzt.quelle
'%'
mit(/%/+[[]+1/!1])[1]
keinen Anführungszeichen zu entfernen. Ich habe auch diel=unescape;
Verwendung von Kleinbuchstaben hinzugefügtL
, um den Verweis auf auszublendenunescape
. Das hat Spaß gemacht :)(/%/+[])[1]
$1
;Hier ist der Teil, der die n / v generiert:
In Firefox wird
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
ausgewertetwährend in Chrome ist es
1^11<<1
gleich 23. Aufgrund des zusätzlichen Leerzeichens von Firefox reicht dies nicht aus, um zum 'v' zu gelangen, sondern ist stattdessen 'n'.Aus diesem Grund sollten Sie sich nicht auf das Verhalten von Function # toString verlassen. ;)
EDIT: Endlich habe ich eine einigermaßen verschleierte Cross-Browser-Version gefunden:
Dies ersetzt den n / v-Abschnitt durch:
Dies nutzt Unterschiede in parseInt aus (anscheinend analysiert Firefox Zahlen, die mit 0 als Oktal beginnen, während Chrome dies nicht tut), um in Firefox 'Fall 4 hinzuzufügen, wodurch in beiden Fällen' v 'von' native 'erhalten wird (ich kann kein anderes' v finden ': P).
Das parseInt sieht ein wenig fehl am Platz aus, aber das ist das Beste, was ich jetzt tun kann.
quelle
Does anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
Für den General Anwendungsfall neige ich möglicherweise dazu, ein wenig zu schummeln, wenn die Groß- und Kleinschreibung von Charakteren kein großes Problem darstellt.
Erstellen Sie die Funktion "c", die aus einer Zahl 0 .. 25 ein Zeichen macht.
Speichern Sie die Buchstaben aus Leistungsgründen vorab, wenn Sie möchten.
In der Chrome-Konsole sieht das resultierende Array folgendermaßen aus:
Also ... dein v könnte sein
l[10+10+1]
.Alternativ eine allgemeine Lösung wie diese:
Oder für dieses spezielle Problem vielleicht nur:
quelle
Dies gibt av in Chrome:
Und das macht es in Firefox:
Sie ziehen es beide heraus
Object.prototype.preventExtensions()
, sodass Sie wahrscheinlich einen browserübergreifenden Weg finden könnten, um auf diese Methode zu verweisen. (Es ist der einzige 17-stellige Name in Object.Prototype für den Anfang.)Fühlen Sie sich frei, eine verschleierte Version davon zu erstellen und alle Ehre für sich selbst zu nehmen, ich habe keine Zeit mehr;)
quelle
In Chrom, die Expression
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
zu auswertet"function test() { [native code] }"
, die[1^11<<1]
auswertet bis 23 (Bitoperatoren Ursache der Variablen auf 32 Bits abgeschnitten werden)quelle
Does anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?