जावास्क्रिप्ट के अंतर्निहित तार क्या हैं?


147

यह प्रश्न एक प्रश्न शीर्षक में संक्षेप में प्रस्तुत करना कठिन है

अद्यतन मैंने एक JSField बनाया है जो इस प्रश्न से निकाले गए अक्षरों के आधार पर आपके इनपुट से एक अस्पष्ट स्ट्रिंग बनाता है: आप इसे यहाँ तक पहुँचा सकते हैं , या एक आसान तरीका होगा?

मैं हाल ही में इस प्रोफ़ाइल में obfuscated जावास्क्रिप्ट का एक मजेदार सा आया है जो इस तरह दिखता है:

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"

मैं "एन" और "[" के लिए एक प्रतिस्थापन खोजने में रुचि रखता था और इसके साथ आया:

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

जिसे मैं 1 और 0 का उपयोग करने की भावना में महसूस करता हूं, लेकिन मूल कोड के अधिक सुरुचिपूर्ण पहलुओं में से एक का उल्लंघन करता है जो कि तार के साथ कुछ भी नहीं करने की उपस्थिति है। क्या किसी और को इस बात का अंदाजा है कि "v" कैसे उत्पन्न होता है जो मूल ओफ़्फ़ुसेटेड कोड के साथ है?

यहां कुछ अतिरिक्त जानकारी दी गई है जो कई प्रतिभाशाली जावास्क्रिप्ट प्रोग्रामर को देखने के बाद मिली है

फ़ायरफ़ॉक्स रिटर्न "मैं तुम्हें अकेला" इस लाइन के कारण:

([]+/-/[(!!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]
}"

ऐसा लगता है कि हमारे पास हमारा "वी" हो सकता है !!!

Chrome "I love you" देता है, क्योंकि एक ही कोड इसे वापस करता है:

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

इससे पहले कि प्रश्न "वास्तविक प्रोग्रामिंग समस्या" के साथ संदिग्ध कनेक्शन के लिए बंद हो जाए, मैंने सोचा कि मैं एक सारांशित समाधान जोड़ूंगा जो @ Supr , @ Cory's और @ Alpha123's , निहारना पर बनाता है :

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])

कोड की जटिलता और यह उत्पन्न होने वाले संदेश को देखते हुए यह लगभग जावास्क्रिप्ट इंजन की तरह है जो आपको बता रहा है कि आप इसे कितना खास बनाते हैं :)


9
यह क्रोम कंसोल में "लव" कहता है। i.imgur.com/rVyKMoP.png
bfavaretto

2
क्या होगा अगर आप से गैर पत्र function test() { [native code] }
छीनते

4
गैर-मानक-परिभाषित स्ट्रिंग आउटपुट पर कोडिंग को ओफ़्फ़ुसेटेड कोड का उपयोग करके एक संदेश मुद्रित करने के लिए ... मैं इसे एक तरह से स्थानीयकृत भी कह रहा हूं ।

2
@ इयान, सच। अगर मेरे जीवन में जिन लोगों को मैं प्यार करता हूँ, वे वास्तव में मेरे बारे में परवाह करते हैं कि वे क्रोम का उपयोग करेंगे :)
जेसन स्पर्सके

4
इसके बारे में सबसे अच्छी बात यह है कि मेरा पाठ संपादक चेतावनी देता है: "कन्फ्यूज़िंग यूज़ ऑफ़ '!'"
जेक जॉनसन

जवाबों:


83

सबसे पहले, मैं उस मजेदार स्निपेट के साथ खेलने के लिए जेसन और सभी योगदानकर्ताओं को धन्यवाद देना चाहूंगा। मैंने 14 फरवरी को अपनी पत्नी को भेजने के लिए कोड के उस टुकड़े को केवल मज़े के लिए लिखा है :) लैपटॉप में केवल क्रोम स्थापित होने के कारण मेरे पास यह जाँचने का कोई विकल्प नहीं था कि यह फ़ायरफ़ॉक्स और IE में कैसे काम करता है। इसके अलावा, मुझे वास्तव में उम्मीद नहीं थी कि toString()बिल्ड-इन विधियों का प्रतिनिधित्व अन्य ब्राउज़रों में अलग तरह से दिखाई दे सकता है।

अब, वास्तविक समस्या पर चलते हुए, आइए कोड पर एक नजर डालते हैं। हाँ, "v"यहाँ असली "समस्या" थी। मुझे यह पत्र प्राप्त करने का कोई अन्य तरीका नहीं मिला [native code], सिवाय स्ट्रिंग के, जिसे किसी भी अंतर्निहित पद्धति से लिया जा सकता है। चूंकि मैंने खुद को सीमित नहीं किया था और 1उपयोग किए जाने के अलावा कोई संख्या नहीं थी, इसलिए मुझे कुछ ऐसी विधि का दोहन करने की आवश्यकता थी जो केवल इसके नाम पर उपलब्ध पात्रों के लिए है।

उपलब्ध पात्रों शुरू से मौजूदा कीवर्ड और स्ट्रिंग अभ्यावेदन, यानी से प्राप्त किया जा सकता है कि हम था NaN, null, undefined, Infinity, true, false, और "[object Object]"। उनमें से कुछ आसानी से तार करने के लिए परिवर्तित किया जा सकता है, जैसे 1/!1+[]देता है "Infinity"

मैंने एरेज़ [], ऑब्जेक्ट्स {}, रेगुलर एक्सप्रेशंस /(?:)/, नंबर्स 1.1, स्ट्रिंग्स के लिए अलग-अलग बिल्ड-इन तरीकों का विश्लेषण किया है "1", और RegExpऑब्जेक्ट नामक एक सुंदर विधि की खोज की है test()। इसका नाम सभी उपलब्ध वर्णों, जैसे "t"और "e"से true, और "s"से इकट्ठा किया जा सकता है false। मैंने एक स्ट्रिंग बनाई है "test"और रेगेक्स शाब्दिक के लिए वर्ग कोष्ठक संकेतन का उपयोग करके इस विधि को संबोधित किया है /-/, इस पंक्ति में सही ढंग से पहचाना गया है:

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

जैसा कि पहले ही चर्चा की गई थी, इस कोड का मूल्यांकन क्रोम में किया जाता है:

function test() { [native code] }

के रूप में फ़ायरफ़ॉक्स में:

function test() {
    [native code]
}

और IE में इस प्रकार है:

 function test() {     [native code] }  

(बाद में कीवर्ड से पहले स्पेस पर विशेष ध्यान दें function)

इसलिए, जैसा कि आप स्पष्ट रूप से देखते हैं, मेरा कोड प्रस्तुत स्ट्रिंग से 24 वां वर्ण प्राप्त कर रहा था, जो कि क्रोम में था "v"(जैसा कि योजना बनाई गई थी), लेकिन दुर्भाग्य से फ़ायरफ़ॉक्स और आईई में - "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]

हालाँकि, पाठकों को साज़िश करने के लिए मैं उस के लिए एक समाधान प्रदान नहीं करेगा। मुझे विश्वास है कि आप आसानी से समझ जाएंगे कि यह कैसे काम करता है ... और कुछ अपने प्रिय को क्रॉस-ब्राउज़र तरीके से आश्चर्यचकित भी कर सकते हैं;)

पीएस फिर भी एक और पर्यवेक्षक

एक सार्वभौमिक ऑबफ्यूजिंग टूल बनाने के लिए जेसन के विचार से प्रेरित होकर, मैंने एक और लिखा है। आप इसे JSBin: http://jsbin.com/amecoq/2 पर पा सकते हैं । यह किसी भी पाठ को बाधित कर सकता है जिसमें संख्याएँ [0-9], छोटे लैटिन अक्षर [a-z]और रिक्त स्थान होते हैं। स्ट्रिंग की लंबाई ज्यादातर आपकी रैम के साथ सीमित है (कम से कम मेरे जवाब का शरीर सफलतापूर्वक बाधित हो गया था)। आउटपुट क्रोम, फ़ायरफ़ॉक्स और IE द्वारा समर्थित है।

संकेत: उपकरण ऊपर प्रस्तुत किए गए की तुलना में अलग-अलग आक्षेप का उपयोग करता है।


4
"कंस्ट्रक्टर" ... वाह जो अद्भुत है और आपने सही आयत को वैध पंक्ति विराम के साथ रखा। आप अच्छे हैं
जेसन स्पर्सके

1
मैंने एक Obfuscator बनाया जो आपकी शैली के नियमों को ध्यान में रखते हुए एक स्ट्रिंग बनाता है: jsfiddle.net/w9rFF/8
जेसन स्पर्सके

@JasonSperske यह एक अच्छी चाल थी! अच्छा कार्य! मैं इसमें योगदान करने की कोशिश करूंगा।
VisioN

26

native codeप्रश्न से बिट का उपयोग क्यों नहीं किया जा रहा है? यह 'v'क्रोम और फ़ायरफ़ॉक्स दोनों में एक देता है :

([]+/-/[(!!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^11<<1]:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]

IE का समर्थन करने के लिए संपादित करें और इसे टर्नरी ऑपरेटर के बिना करें: यह क्रोम, IE और FF में काम करता है। एक सरणी बनाता है और ==ब्राउज़र को निर्धारित करने के लिए उपयोग करता है।

[([]+/-/[(!!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)]

पठनीय:

[
    //ie
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],
    //ch
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],
    //ff
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]
]
[
    //ch?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+
    //ff?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)
]

यह दिलचस्प है। मूल रूप से यह खारिज कर दिया गया है कि "देशी कोड" शब्दों का प्लेसमेंट फ़ायरफ़ॉक्स और क्रोम के बीच अप्रत्याशित था। यह हल करता है लेकिन IE10 में काम नहीं करता है (जहां यह "i" लौटाता है)। फिर भी मुझे आश्चर्य है कि अगर यह विकल्प कुछ नए विचारों की पेशकश कर सकता है
जेसन स्पर्सके

विचार बस का चयन करने के लिए दोनों है nऔर vऔर बस लेने से जो भी सबसे बड़ा है: str[23]>str[27]?str[23]:str[27]। दूसरे शब्दों में, तृतीयक ऑपरेटर चाल है। IE का समर्थन करने के लिए बढ़ाया जा सकता है:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)]
22

1
आपका उत्तर पहले (मूल कोड के निर्माता से आगे) था, लेकिन मुझे लगा कि उनका जवाब तार्किक रूप से सही माना जा सकता है। अभी भी महान काम (और एक अच्छी तरह से 13 वोटों के हकदार हैं)
जेसन स्पर्सके

1
माइनर नाइटपिक: तृतीयक ऑपरेटर प्राथमिक और माध्यमिक के बाद तीसरा सबसे महत्वपूर्ण ऑपरेटर है। एक ऑपरेटर जो तीन ऑपरेंड लेता है वह टर्नरी है।
एरिक लिपर्ट

1
@ EricLippert, gah, मैंने यह सुनिश्चित करने के लिए इसे सही समझा कि मैं सही शब्द का उपयोग कर रहा था, फिर भी मैं गलत के साथ समाप्त हो गया! धन्यवाद, सही किया।
सुपर

8

यह लगभग उतना ही है जितना मुझे मिल सकता है, दुर्भाग्य से यह एक कॉल करके मूल आक्षेप के सम्मेलन का उल्लंघन करता है unescape():

unescape((/%/+[])[1]+(/1/[1]+[])[1%1]+(+!1)+(+!1)+(1e1+(11*(1-~1)<<1)))

चीथड़े कर दो:

(/%/+[])[1]          => "%"
(/1/[1]+[])[1%1]     => "u"
(+!1)                => "0"
(+!1)                => "0"
(1e1+(11*(1-~1)<<1)) => "76"
===========================
unescape("%u0076")   => "v"

अन्य विचार:

  1. किसी तरह से मिलता है unescape("\x76")
  2. किसी तरह 118बिना बुलाए कन्वर्ट हो गयाString.fromCharCode()
  3. इसमें "अमान्य" शब्द के साथ एक अपवाद से पाठ प्राप्त करें

अपडेट:

मैंने कोड गोल्फ खेलना शुरू कर दिया है और इसे छोटा बना रहा है, और अधिक 1एस आदि के साथ भागों को बदल रहा है ।


मुझे भी यह पसंद है। मैं चयनित "सही" उत्तर में थोड़ा सा फटा हुआ हूं, जैसा कि आपका और @ अल्फाज़ा दोनों ही बहुत ही मोटे और चतुराई से मूल इरादे को छिपाते हैं।
जेसन स्पर्सके

और IE10 समर्थन सौदे को सील करता है (उत्कृष्ट जवाब के लिए ईमानदार माफी @ अल्फाजा के साथ)
जेसन स्पर्सके

आप किसी भी उद्धरण को हटाने के '%'साथ बदल सकते हैं (/%/+[[]+1/!1])[1]। मैंने संदर्भ को छिपाने के लिए l=unescape;लोअरकेस Lका उपयोग करके भी जोड़ा है unescape। यह मजेदार रहा है :)
जेसन स्पर्सके

@ जैसनस्पर्सके: और भी छोटा:(/%/+[])[1]
C

1
या आप अपने चर का नाम दे सकते हैं $1;
22

4

यहाँ वह भाग है जो n / v उत्पन्न करता है:

([]+/-/[(!!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]])मूल्यांकन करता है

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

जबकि क्रोम में यह है

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

1^11<<1 23 के बराबर है। इसलिए फ़ायरफ़ॉक्स के अतिरिक्त व्हाट्सएप के कारण, यह 'v' को प्राप्त करने के लिए पर्याप्त नहीं है, और इसके बजाय 'n' है।

और यही कारण है कि आपको फ़ंक्शन #String व्यवहार पर भरोसा नहीं करना चाहिए। ;)

संपादित करें: अंत में मुझे एक यथोचित रूप से क्रॉस-ब्राउज़र संस्करण मिला:

[[]+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)+(parseInt("010")<10?(1+1+1+1):0)]+([,][~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]

इसके साथ n / v अनुभाग बदलता है:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)+(parseInt("010")<10?(1+1+1+1):0)]

जो parseInt में अंतर का शोषण करता है (जाहिरा तौर पर फ़ायरफ़ॉक्स 0 से शुरू होता है जहाँ ओक्टल के रूप में नंबर मिलते हैं, जबकि क्रोम फ़ायरफ़ॉक्स के मामले में 4 को जोड़ने के लिए नहीं है, इस प्रकार दोनों मामलों में 'मूल' से 'v' प्राप्त होता है (मुझे एक और 'v नहीं मिल सकता है) ': पी)।
ParseInt जगह से थोड़ा बाहर दिखता है, लेकिन मैं अभी के लिए सबसे अच्छा कर सकता हूं।


1
सवाल हैDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
इयान

धन्यवाद। अब मैं इसे करने के लिए एक क्रॉस-ब्राउज़र तरीके का पता लगाने की कोशिश कर रहा हूं ... 'V' एक आश्चर्यजनक रूप से असामान्य पत्र है ....
पीटर C

@ इयान - तो फिर संभवतः, (१ ^ ११ << १) + १ + १ + १ + १] क्या करेंगे?
enhzflep

@JDDvorak - मेरे पास इस समय FF नहीं है। इसका क्या मूल्यांकन करता है? अगर मैं पूछने के लिए इतना अनुमान लगाया जा सकता है, कि है।
enhzflep

@enhzflep माफ करना, मेरा मतलब था "जो क्रोम में काम नहीं करेगा, दूसरी तरफ"
जॉन ड्वोरक

4

के लिए सामान्य यूज-केस, अगर चरित्र आवरण एक बड़ी चिंता का विषय नहीं है, मैं एक छोटे से धोखा देने के लिए इच्छुक हो सकती है।

फ़ंक्शन "c" बनाएं जो एक वर्ण में संख्या 0 .. 25 को बदलता है।

c=function(v){for(var i in window){for(var ci in i){if(parseInt(i[ci],(10+11+11)+(1<<1)+(1<<1))==(v+10)){return i[ci]}}}};

यदि आप चाहें तो प्रदर्शन कारणों के लिए, अक्षरों को प्री-कैश कर दें।

l=[];for(var i=0; i<(11+11)+(1<<1)+(1<<1);i++){l[i]=c(i);}

Chrome कंसोल में, परिणामी सरणी इस तरह दिखती है:

> l;
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "K", "l", "m", "n", "o", "p", "q", "r", "S", "t", "u", "v", "w", "x", "y", "Z"]

तो ... आपका वी हो सकता है l[10+10+1]

वैकल्पिक रूप से, इस तरह एक सामान्य समाधान:

p=(function(){10%11}+[])[1+11+(1<<1)]; // "%"
u=(function(){club=1}+[])[1+11+(1<<1)]; // "u"
vc=p+u+(0+[])+(0+[])+((111>>1)+11+10+[]); // "%u0076"
unescape(vc);

या, इस विशिष्ट समस्या के लिए, शायद:

(function(){v=1}+[])[10+(1<<1)]; // "v"

3

यह Chrome में av देता है:

Object.getOwnPropertyNames(Object)[17][3];

और यह फ़ायरफ़ॉक्स में करता है:

Object.getOwnPropertyNames(Object)[9][3]

वे दोनों इसे बाहर खींचते हैं Object.prototype.preventExtensions(), इसलिए आप शायद उस विधि को संदर्भित करने के लिए एक क्रॉस-ब्राउज़र तरीका पा सकते हैं। (यह शुरुआत के लिए Object.Prototype में केवल 17-वर्ण का नाम है।)

इस के एक अधिक-विकसित संस्करण बनाने के लिए स्वतंत्र महसूस करें और अपने लिए सभी क्रेडिट लें, मैं समय से बाहर हूं;)


2

क्रोम में, अभिव्यक्ति का ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])मूल्यांकन करने के लिए "function test() { [native code] }", [1^11<<1]23 का मूल्यांकन करता है (बिटवाइज ऑपरेटर 32 बिट्स के लिए चर को काट दिया जाता है)


सवाल हैDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
इयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.