2 Stimmen

Können Sie erklären, wie dieser NoAlphanumeric JS-Code funktioniert?

Ich habe einen Javascript-Code im Internet gefunden (NoAlphanumeric JS genannt):

_=[]|[];$=_++;__=(_<<_);___=(_<<_)+_;____=__+__;_____=__+___;$$=({}+"")[_____]+({}+"")[_]+({}[$]+"")[_]+(($!=$)+"")[___]+(($==$)+"")[$]+(($==$)+"")[_]+(($==$)+"")[__]+({}+"")[_____]+(($==$)+"")[$]+({}+"")[_]+(($==$)+"")[_];$$$=(($!=$)+"")[_]+(($!=$)+"")[__]+(($==$)+"")[___]+(($==$)+"")[_]+(($==$)+"")[$];$_$=({}+"")[_____]+({}+"")[_]+({}+"")[_]+(($!=$)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+({}+"")[_]+({}[$]+"")[__]+(($==$)+"")[___]; ($)[$$][$$]($$$+"('"+$_$+"')")() 

Dieser Code öffnet einen "Alert" und druckt "cool code"...

Kann jemand erklären, wie dieser Code funktioniert?

2voto

dclowd9901 Punkte 6648

Soweit ich weiß, verwendet der Code Javascript-Fehler- und Typausgaben, um verschiedene Zeichen zusammenzustellen. Zum Beispiel wird eine Ausgabe von "NaN" die Zeichen "N" und "a" ergeben, und Sie können sie auswählen, wie Sie eine beliebige Zeichenkette in Javascript würde -- Das Äquivalent von v[0] Auswahl "N" und v[1] Auswahl "a".

Dies ist bestenfalls eine elementare Erklärung, aber angesichts einiger Kommentare zu dieser Frage vermute ich, dass es irgendwo anders auf Stack eine weitaus umfassendere Antwort gibt.

2voto

Fangen Sie selbst an, es in der Konsole aufzuschlüsseln...

_=[]|[];  // ===  _=0
$=_++;    // ===  $=0, _=1
__=(_<<_) // === __=2

...usw. Brechen Sie es einfach an den Semikolons auf und beginnen Sie zu testen :) Fragen Sie jeden spezifisch Fragen, die Sie stellen möchten, wie "Warum ist []|[] === 0 ?"

Danach, ich nehme an, dies nutzt JS-Fehlermeldungen, Vars, z.B. mit "undefined", "NaN", "true", "false" können Sie alles mit den Buchstaben in nur die tun...

2voto

Chris Punkte 26614

Ich werde nicht versuchen, für Sie zu übersetzen, denn wie @LightnessRacesinOrbit sagte, ist das eine große Aufgabe. Was ich vorschlagen würde, ist erstens, es in mehrere Zeilen aufzuteilen, indem man sie durch Semikolons trennt, und dann vielleicht die Variablen in etwas umzubenennen, das leichter zu unterscheiden ist.

Dieser Code wird als verschleierter Code bezeichnet und ist so konzipiert, dass er so unverständlich wie möglich ist. Die Verwendung verschiedener Variablen wie _ , __ , ___ usw. macht es einfach schwer, sich zu merken, was jeder einzelne enthält. Teilen Sie es auf und benennen Sie es um, und wenn nötig, fügen Sie einfach eine Warnung zwischen jede Anweisung ein, um zu sehen, was die letzte Operation getan hat (oder noch besser, führen Sie sie in einem Debugger usw. aus), dann können Sie sehen, wie es funktioniert.

E :

Eigentlich ist es nicht so schlimm, wie ich dachte...

Es richtet die folgenden Konstanten zunächst mit einigen einfachen mathematischen Sachen ein, sobald es die 0 von []|[] erhalten hat. Ich nehme an, es macht diese komplizierter, um die Verschleierung hinzuzufügen...

_ = 1
$ = 0
__ = 2
___ = 3
____ = 4
_____ = 5

Dann wird folgendes verwendet, um ein String/Zeichen-Array zu erhalten, aus dem einige Zeichen ausgelesen werden können:

({}+"") - [object Object]
({}[$]+"") undefined
(($!=$)+"") false
(($==$)+"") true

Die letzten Dinge sind dann nur noch die Verkettung dieser Zeichenketten, um zu erhalten:

$$ - constructor
$$$ - alert
$_$ - cool code

Die letzte Zeile verwendet dann irgendeine Magie, die mir nicht ganz klar ist, um dann die Alarmfunktion aufzurufen... Ich denke, dass sie möglicherweise den Konstruktor eines Objekts oder etwas Ähnliches umschreibt. Das ist das Einzige, bei dem ich nicht ganz sicher bin...

Endbearbeitung:

Ich habe den Zauber herausgefunden.

($)['constructor']['constructor'] scheint Function() zu sein, und wenn man sie mit einem String-Argument aufruft, scheint sie eine anonyme Methode zu erstellen, die auf diesem String basiert. Die abschließenden Klammern rufen dann das anonyme Mitglied auf, das, wenn Sie bis hierher gefolgt sind, den Alarm aufruft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X