最初の方法
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