ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の暗号化と復号化のための 7 つの方法の概要と分析_Hacker Nature

JavaScript の暗号化と復号化のための 7 つの方法の概要と分析_Hacker Nature

WBOY
WBOYオリジナル
2016-05-16 19:08:421222ブラウズ

この記事では、合計 7 つの JavaScript 暗号化方法を紹介します。

Web ページ (実際には Web トロイの木馬 (笑)) を作成するとき、最も厄介なことは、苦労して書いた JavaScript コードがクライアント IE で実行されてしまうことです。他人が簡単に真似するのは本当にちょっと不快です... ^*^

でも、それもしっかり認識しておかなければなりません。 javascript コードのせいで IE で説明され実装されているため、絶対的な機密性を維持することは不可能です。私たちがしなければならないことは、彼が撤退できるようにできるだけコピーの難易度を高めることです。過去数年間の私自身の実践と個人的な研究経験に基づいて、Web ページ内の JavaScript コードの暗号化および復号化テクノロジについて説明します。

次の暗号化された JavaScript コードを例に挙げます。




1: 最も単純な暗号化と復号化

JavaScript は誰もがよく知っています。関数エスケープ() unescape() に精通している必要があります (多くの Web ページでは、それらはそれぞれ文字列のエンコードとデコードに使用されます)。たとえば、サンプル コードは、escape() 関数で暗号化され、次の形式になります。

alert(" %u9ED1%u5BA2%u9632%u7EBF");

どのように?まだわかりますか?もちろん、ASCII 文字「alert」は暗号化されません。必要に応じて、次のように再暗号化する JavaScript コードを作成できます:

alert("%u9ED1%u5BA2%u9632%u7EBF") ;

はは!どうやって?今回は完全暗号化です!

もちろん、暗号化されたコードを直接実行することはできません。幸いなことに、この関数の機能は、JavaScript コードをチェックして実行することです。有効な JavaScript コードに文字列値を加え、上記の unescape() をデコードすると、暗号化された結果は次のようになります:



非常に単純ではないでしょうか。満足しないでください。復号化も同様に簡単で、復号化コードは他の人 (unescape()) に任せられます。笑

2: エスケープ文字 "" の素晴らしい使い方

エスケープ文字 "" には馴染みがないかもしれませんが、JavaScript には次のような特殊文字が用意されています。 n (改行) 、r(エンター)、'(シングルクォーテーション)など、皆さんも馴染みがあるのではないでしょうか?実際、「」の後に 8 進数または 16 進数を続けることもできます。たとえば、文字「a」は「141」または「x61」と表現できます (小文字の「x」であることに注意してください)。漢字「黒」などの 2 バイト文字は、16 進数で「u9ED1」(小文字の「u」に注意) としてのみ表現できます。この原則によれば、文字「u」は 2 バイト文字を表します。コード例は次のように表現できます:

8 進数のエスケープ文字列は次のとおりです:




16 進数のエスケープ文字列は次のとおりです:




JavaScript は実行時に自動的に変換されるため、今回はデコード関数はありません。




Aダイアログボックスが表示され、復号化された結果が表示されます。

3: エンコードには Microsoft 製のスクリプト エンコーダー Script Encoder を使用します

ツールの使用方法についてはあまり紹介しません。 JavaScript を直接使用して Scripting.Encoder コントロールを呼び出し、エンコードを完了しました。コードは次のとおりです:

';
var Encode=Senc.EncodeScriptFile(".htm",code,0,""); >


エンコードされた結果は次のとおりです:




醜くて理解できないでしょう?しかし、対応する復号化ツールはすでにリリースされており、復号化 Web ページもあります。 Web ページを解読するにはコードが多すぎるため、これ以上は言いません。以下に、私のオリジナルの復号コードを紹介します。




どうでしょうか?十分シンプルですよね?原則として、IE はエンコードされたコードを実行する前にデコードします。まず暗号化されたコードを上記の decode() などのカスタム関数に入れてから、カスタム関数の decode メソッドで toString() を呼び出すと、結果は次のようになります。デコードされたコード!

このようにエンコードされたコードの LANGUAGE 属性が人に見破られやすい JScript.Encode だと思ったら、window オブジェクトのほとんど知られていないメソッド execScript() も存在します。元の形式は次のとおりです:

window.execScript( sExpression, sLanguage ) <script> <BR>alert("《我爱一起》"); <BR></script><script> <BR>var code=unescape("%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B"); <BR>eval(code) <BR></script> パラメータ: <script> <BR>eval("1411541451621645042u9ED1u5BA2u9632u7EBF425173") <BR></script><script> <BR>eval("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B") <BR></script>sExpression: 必須。弦。実行されるコード。 <script> <BR>alert("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B") <BR></script><script> <BR>var Senc=new ActiveXObject("Scripting.Encoder"); <BR>var code='<SCRIPT LANGUAGE="javascript">rnalert("《我爱一起》");rn</script>sLanguage: 必須。弦。実行されるコードの言語を指定します。默认值为 Microsoft JScript

使用时,前面的"window"可以省略不写!

  利用它我们可以很好的运行编码后的javascript代码,如下:

<script> <BR>execScript("#@~^FgAAAA==@#@&lsDD`J我爱一起r#p@#@&FgMAAA==^#~@","JScript.Encode") <BR></script>

  你可以利用方法二对其中的""号内的字符串再进行编码,使得"JScript.Encode"以及编码特征码"#@~^"不出现,效果会更好!

  四:任意添加NUL空字符(十六进制00H)

  一次偶然的实验,使我发现在HTML网页中任意位置添加任意个数的"空字符",IE照样会正常显示其中的内容,并正常执行其中的javascript 代码,而添加的"空字符"我们在用一般的编辑器查看时,会显示形如空格或黑块,使得原码很难看懂,如用记事本查看则"空字符"会变成"空格",利用这个原理加密结果如下:(其中显示的"空格"代表"空字符")

 
a l er t (" 我 爱 一 起") ; 


  如何?是不是显得乱七八糟的?如果不知道方法的人很难想到要去掉里面的"空字符"(00H)的!

  五:无用内容混乱以及换行空格TAB大法

  在javascript代码中我们可以加入大量的无用字符串或数字,以及无用代码和注释内容等等,使真正的有用代码埋没在其中,并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB,并可以把正常的字符串用""来进行换行,这样就会使得代码难以看懂!如我加密后的形式如下:

<script> <BR>"xajgxsadffgds";1234567890 <BR>625623216;var $=0;alert//@$%%&*()(&(^%^ <BR>//cctv function// <BR>(//hhsaasajx xc <BR>/* <BR>asjgdsgu*/ <BR>"我爱一起"//ashjgfgf <BR>/* <BR>@#%$^&%$96667r45fggbhytjty <BR>*/ <BR>//window <BR>) <BR>;"#@$#%@#432hu";212351436 <BR></script>

  至少如果我看到这样的代码是不会有心思去分析它的,你哪?

  六:自写解密函数法

  这个方法和一、二差不多,只不过是自己写个函数对代码进行解密,很多VBS病毒使用这种方法对自身进行加密,来防止特征码扫描!下面是我写的一个简单的加密解密函数,加密代码如下(详细参照文件"加密.htm"):

<script> <BR>function compile(code) <BR>{ <BR>var c=String.fromCharCode(code.charCodeAt(0)+code.length); <BR>for(var i=1;i<code.length;i++) <BR>alert(escape(c)); <BR>} <BR>compile('alert("《我爱一起》");') <BR></script>

  运行得到加密结果为:

o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd

  相应的加密后解密的代码如下:

<script> <BR>function uncompile(code) <BR>{ <BR>code=unescape(code); <BR>var c=String.fromCharCode(code.charCodeAt(0)-code.length); <BR>for(var i=1;i<code.length;i++) <BR>return c; <BR>} <BR>eval(uncompile("o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd")); <BR></script>

  七:错误的利用

  利用try{}catch(e){}结构对代码进行测试解密,虽然这个想法很好(呵呵,夸夸自己),因为实用性不大,我仅给个例子

<script> <BR>var a='alert("《我爱一起》");'; <BR>var c=""; <BR>for(var i=0;i<a.length;i++) <BR>alert(c); <BR>//上面的是加密代码,当然如果真正使用这个方法时,不会把加密写上的 <BR>//现在变量c就是加密后的代码 <BR>//下面的函数t()先假设初始密码为0,解密执行, <BR>//遇到错误则把密码加1,然后接着解密执行,直到正确运行 <BR>var d=c; //保存加密后的代码 <BR>var b=0; //假定初始密码为0 <BR>t(); <BR>function t()catch(e){ <BR>c=""; <BR>for(var i=0;i<d.length;i++) <BR>b+=1; <BR>t(); <BR>//setTimeout("t()",0); <BR>} <BR>} <BR></script>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。