जावास्क्रिप्ट ओफ़्फ़सकेशन

लेख में जाने-माने तरीके और बेहद विकृत तरीके हैं। मैंने हाल ही में बदमाश जावास्क्रिप्ट ब्लॉग पोस्ट को पढ़ने के बाद इस लेख को लिखने का फैसला किया और अपने निष्कर्षों के साथ इसे पूरक करने का फैसला किया।



पहला तरीका



यह हर किसी के लिए जाना जाता है - जेएस पैकर, जेएसमिन, वाईयूआई कंप्रेसर, क्लोजर कंपाइलर जैसे मिनिममाइज़र द्वारा आपत्ति करना या आप बस "जावास्क्रिप्ट ओब्फ्यूसेटर" को Google कर सकते हैं और सौ से अधिक अलग-अलग ऑबफ्यूकेटर्स हैं।

वे मौजूदा कोड को चालू करते हैं

function MyClass(){ this.foo = function(argument1, argument2){ var addedArgs = parseInt(argument1)+parseInt(argument2); return addedArgs; } var anonymousInnerFunction = function(){ // do stuff here! } }
      
      





किसी तरह के रूप में:

 function MyClass(){this.foo=function(c,b){var d=parseInt(c)+parseInt(b);return d};var a=function(){}};
      
      





या ऐसे:

 var _0xd799=["\x66\x6F\x6F"];function MyClass(){this[_0xd799[0]]=function (_0xefcax2,_0xefcax3){var _0xefcax4=parseInt(_0xefcax2)+parseInt(_0xefcax3);return _0xefcax4;} ;var _0xefcax5=function (){} ;} ;
      
      





या इस तरह:

 eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4 0="3 5!";9 2(1){6(1+"\\7"+0)}2("8");',10,10,'a|msg|MsgBox|Hello|var|World|alert|n|OK|function'.split('|'),0,{}))
      
      





लेकिन यह jsbeautifier.org का उपयोग करके इसे पुनर्स्थापित करने के लिए कुछ भी खर्च नहीं करता है या बस eval को हटा दें और स्रोत कोड प्राप्त करें, हम बहुत कुछ खो देंगे, लेकिन हम कोड के अर्थ को पुनर्स्थापित करेंगे। ठीक है, पहली नज़र में हम देखते हैं कि हमारे पास जावास्क्रिप्ट है।



ये सभी कटे हुए फूल थे, जो कि सख्त होने के तरीके थे।



दूसरा तरीका



मान्यता से परे कोड बदलना, जो हमारी दयनीय स्क्रिप्ट को बदल देगा:

alert(0)







इस तरह के एक ब्रिफक-लुक में:

([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]])(+[])







या इस एक में (कोड काम नहीं कर सकता क्योंकि हबपर):

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚゚) ['c'] = ((゚゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚゚) ['o'] = ((゚゚)+'_') [゚Θ゚];(゚o゚)=(゚゚) ['c']+(゚゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚゚) ['c']+((゚゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚゚) .゚゚ノ+((゚゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚゚)[゚ε゚]='\\'; (゚゚).゚Θ゚ノ=(゚゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚゚) [゚o゚]='\"';(゚゚) ['_'] ( (゚゚) ['_'] (゚ε゚+(゚゚)[゚o゚]+ (゚゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚゚)[゚o゚]) (゚Θ゚)) ('_');







यहां पहली बार और आप यह नहीं कह सकते कि हमारे पास जावास्क्रिप्ट काम कर रहा है।

तुलसा एक प्रकार का कोड बनाता है, एक प्रकार का कोड दो। व्लाडसन को एक और जेंज़कोड उपकरण मिला



विधि दो के कुछ बिंदुओं की व्याख्या


एक उदाहरण:

 ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ [_+~$]+$_[_]+$$](_/_)
      
      





हमारे पास कुछ गंदे चरित्र हैं, लेकिन वास्तव में alert(1)



इसमें छिपा हुआ है, लेकिन आखिर एक भी रेखा नहीं है और एक भी वर्ण नहीं है, यह कहां से आता है?



हम समझेंगे:

$=[]



एक खाली सरणी है

$=[$=[]]



एक सरणी है जिसमें एक सरणी संदर्भ है

चर $ होगा।

अब हमारे पास 0 है और हम संदर्भ दे सकते हैं। हम __ = "false"



माध्यम से (__ = !$ + $ )





अगला _ = -~-~-~$





जावास्क्रिप्ट में ~ ऑपरेटर का मतलब है - (एन + 1) इसलिए -~ = +1





यदि $ = 0



तो -~-~-~$ = 3





हमें मिलता है: _ = 3







इस प्रकार _/_ = 3/3 = 1







(__ = !$ + $ )[ _ = -~-~-~$]

("false")[_]

("false")[3]

"false"[3] = s








({} + $)[_/_]

(" object")[_/_]

(" object")[1]

" object"[1] = o








$$ = ( $_ = !'' + $)[_/_]

$$ = ( "true")[1]

"true"[1] = r






$_[+$] = "true"[0] = t







$_ = "true"null

$$ = rt








($$ = ( $_ = !'' + $)[_/_] + $_[+$] ))







!'' = "true"

$_ = (true)

$_[1] = r

$_[0] = t

$$ = rt








इस प्रकार पहली पंक्ति बन जाएगी ($ = [] ["s" + "o"+ "r"+ "t" ] )()





($=[]["sort"])()







चलो चलते हैं

[__[_/_]+__[_+~$]+$_[_]+$$](_/_)







$ = 0

_ = 3

__ = "false"

$_ = "true"

$$ = "rt"








स्ट्रिंग बदल रहा है ...

[__[_/_]+__[_+~$]+$_[_]+$$](_/_)







टर्निंग ...

[__[1] + __[3 + -1] + $_[3] + $$)(1);







टर्निंग ...

["false"[1] + "false"[3 + -1 ] + "true"[3] + "rt"] (1)







में बदल जाता है

[ "a" + "l" + "e" + "r" + "t" ](1)







अंत में हमें मिलता है ($=[]["sort"])()["alert"](1)







हम भागों में टूटेंगे

a = [] //

b = a["sort"] // sort

c = b() // window

d = c["alert"] // window.alert

d(1) // window.alert 1








परिणाम: window["alert"](1)







यह, निश्चित रूप से, एक कृत्रिम उदाहरण है और कोई भी पर्यवेक्षक ऐसा नहीं कर सकता है।



तीसरा तरीका



पहला तरीका कोड को जावास्क्रिप्ट की तरह बनाता है, दूसरा पूरी तरह से अलग है, और तीसरा कोड पूरी तरह से अदृश्य बना देगा।



मैंने कोई भी तैयार समाधान नहीं देखा, एक अवधारणा जेएस वीडियो कॉन्फ्रेंस में से एक से झांकती है।

कोड दो भागों से मिलकर बनेगा: दृश्यमान सम्मान - आप ऊपर वर्णित कुछ चीज़ों का उपयोग करके इसे और अदृश्य भाग को बाधित कर सकते हैं।

यदि दृश्य के साथ सब कुछ स्पष्ट है, तो यहां रहस्य अदृश्य है: मौजूदा "बुरा कोड" (अन्यथा इसे क्यों छिपाएं) हम अपने पर्यवेक्षक-गायब होने से गुजरते हैं, जो दृश्य स्क्रिप्ट को अदृश्य में बदल देता है। टैब (बिट 1) और रिक्त स्थान (बिट 0) से मिलकर एक स्ट्रिंग में।

नतीजतन, हमें अपने से 8 गुना अधिक कोड मिलता है। दृश्य भाग अदृश्य भाग को डिकोड करेगा और उस पर अमल करेगा: बिट्स को एक संख्या में डिकोड करता है, और संख्या को String.fromCharCode()



वर्ण में String.fromCharCode()



और फिर eval करता है



अंत में, आपको कुछ ऐसा मिलता है (अदृश्य भाग को तत्व में छिपाना नहीं पड़ता है)

decodeAndEval(document.getElementById("evilCode").innerHTML);

<div id="evilCode">



</div>







डेक्स ने ओफसुसेटर - रेसक्युर लिखा



इसके आधार पर: badassjs.com/post/2929065287/obfuscation adamcecc.blogspot.com/2011/01/javascript.html



मुझे आपके सवालों का जवाब देने और आपके द्वारा ज्ञात मोटापे के तरीकों को देखने में खुशी होगी।



PS प्रस्तुत कोड काम नहीं कर सकता है, क्योंकि Habraparser ©, टूल के लिंक हैं - जिस स्थिति में, अपना कोड बनाएं।



UPD टिप्पणियों में कई बार png में स्थगन की विधि के बारे में अधिक लिखा जाता है



All Articles