JavaScriptの難読化

この記事には、よく知られた方法と非常に歪んだ方法が含まれています。 Badass JavaScriptブログ投稿を最近読んだ後にこの記事を書くことにし、私の発見を補足することにしました。



最初の方法



JS Packer、JSmin、YUI Compressor、Closureコンパイラなどの最小化ツールによる難読化、または「JavaScript難読化ツール」をグーグルで検索するだけで、さらに100種類の難読化ツールがあります。

既存のコードを有効にします

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を削除してソースコードを取得したりするだけで、多くの損失が発生しますが、コードの意味を復元します。 さて、一見するとJavaScriptがあることがわかります。



これらはすべて、切り花の下にある難解な方法でした。



第二の方法



認識を超えてコードを変更すると、悲惨なスクリプトが変わります。

alert(0)







そのようなbraifuckのような外観では:

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







または、これでは(ハブパーサーが原因でコードが機能しない場合があります):

゚ω゚ノ= /`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゚]) (゚Θ゚)) ('_');







ここで初めて、JavaScriptが機能しているとは言えません。

タイプ1のコード、 タイプ2のコードを作成するタルサ Vladsonは別のjjencode ツールを見つけました



方法2のいくつかのポイントの説明


例:

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





乱雑なキャラクターがいくつかありますが、実際にはalert(1)



隠されていますが、結局のところ、単一の行も単一のキャラクターもありません。



私たちは理解します:

$=[]



は空の配列です

$=[$=[]]



は配列参照を持つ配列です

変数$は0になります。

これで0になり、参照できます。 __ = "false"



through (__ = !$ + $ )





_ = -~-~-~$





JavaScriptの〜演算子は-(N + 1)を意味する-~ = +1





$ = 0



場合$ = 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)







もちろん、これは人為的な例であり、難読化者は誰もそれを行うことができません。



第三の方法



最初の方法ではコードがJavaScriptのように見え、2番目の方法ではコードが完全に見えなくなり、3番目の方法ではコードが完全に見えなくなります。



既製のソリューションはありませんでした。これは、JSビデオ会議の1つから覗かれたコンセプトです。

コードは2つの部分で構成されます:目に見える名誉-上記の説明を使用して、コードと不可視の部分を難読化できます。

すべてが可視で明確な場合、秘密はここでは見えません。既存の「不正なコード」(それ以外の場合はそれを隠す理由)は、難読化ツールの消失を通過します。 タブ(ビット1)とスペース(ビット0)で構成される文字列に変換します。

その結果、以前の8倍のコードを取得できます。 可視部分は不可視部分をデコードして実行します。ビットを数値にデコードしString.fromCharCode()



数値をString.fromCharCode()



文字にString.fromCharCode()



からeval



最終的には、このようなものが得られます(非表示の部分は要素内で非表示にする必要はありません)

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

<div id="evilCode">



</div>







deex難読化者救助者を書いた



に基づく: badassjs.com/post/2929065287/obfuscation adamcecc.blogspot.com/2011/01/javascript.html



私はあなたの質問に答えて、あなたに知られている難読化の方法を見て喜んでいます。



PS Habraparser©、ツールへのリンクがあるため、提示されたコードが機能しない場合があります-その場合、独自のコードを作成します。



UPD pngの難読化の方法について何度か書いたコメントでmore



All Articles