熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

JAVASCRIPT加密解密終級指南

2013-11-23 17:54:43  來源: Javascript 

  信息來源《黑客防線》

  本文一共介紹了七種方法
最簡單的加密解密
轉義字符\的妙用
使用Microsoft出品的腳本編碼器Script Encoder來進行編碼 (自創簡單解碼)
任意添加NUL空字符(十六進制H) (自創)
無用內容混亂以及換行空格TAB大法
自寫解密函數法
錯誤的利用 (自創)

  在做網頁時(其實是網頁木馬呵呵)最讓人煩惱的是自己辛辛苦苦寫出來的客戶端IE運行的JAVASCRIPT代碼常常被別人輕易的拷貝實在讓自己的心裡有點不是滋味要知道自己寫點東西也挺累的^*^

  但我們也應該清楚地認識到因為JAVASCRIPT代碼是在IE中解釋執行要想絕對的保密是不可能的我們要做的就是盡可能的增大拷貝者復制的難度讓他知難而退(但願~!~)下面我結合自己這幾年來的實踐及個人研究的心得和大家一起來探討一下網頁中JAVASCRIPT代碼的加密解密技術

  以加密下面的JAVASCRIPT代碼為例
<SCRIPT LANGUAGE=JavaScript>
alert(《黑客防線》);
</SCRIPT>

  一最簡單的加密解密

  大家對於JAVASCRIPT函數escape()和unescape()想必是比較了解啦(很多網頁加密在用它們)分別是編碼和解碼字符串比如例子代碼用escape()函數加密後變為如下格式
alert%%%uED%uBA%u%uEBF%%%B
 

  如何?還看的懂嗎?當然其中的ASCII字符alert並沒有被加密如果願意我們可以寫點JAVASCRIPT代碼重新把它加密如下
%%C%%%%%%uED%uBA%u%uEBF%%%B
 

  呵呵!如何?這次是完全都加密了!

  當然這樣加密後的代碼是不能直接運行的幸好還有eval(codeString)可用這個函數的作用就是檢查JavaScript代碼並執行必選項 codeString 參數是包含有效 JavaScript 代碼的字符串值加上上面的解碼unescape()加密後的結果如下
<SCRIPT LANGUAGE=JavaScript>
var code=unescape(%%C%%%%%%uED%uBA%u%uEBF%%%B);
eval(code)
</SCRIPT>
 

  是不是很簡單?不要高興解密也就同樣的簡單解密代碼都擺給別人啦(unescape())!呵呵

  二轉義字符\的妙用

  大家可能對轉義字符\不太熟悉但對於JavaScript提供了一些特殊字符如\n (換行) \r (回車)\ (單引號 )等應該是有所了解的吧?其實\後面還可以跟八進制或十六進制的數字如字符a則可以表示為\\x(注意是小寫字符x至於雙字節字符如漢字則僅能用十六進制表示為\uED(注意是小寫字符u其中字符u表示是雙字節字符根據這個原理例子代碼則可以表示為

  八進制轉義字符串如下:
<SCRIPT LANGUAGE=JavaScript>
eval(\\\\\\\\uED\uBA\u\uEBF\\\)
</SCRIPT>
 

  十六進制轉義字符串如下:
<SCRIPT LANGUAGE=JavaScript>
eval(\x\xC\x\x\x\x\x\uED\uBA\u\uEBF\x\x\xB)
</SCRIPT>
 

  這次沒有了解碼函數因為JavaScript執行時會自行轉換同樣解碼也是很簡單如下
<SCRIPT LANGUAGE=JavaScript>
alert(\x\xC\x\x\x\x\x\uED\uBA\u\uEBF\x\x\xB)
</SCRIPT>
 

  就會彈出對話框告訴你解密後的結果!

  三使用Microsoft出品的腳本編碼器Script Encoder來進行編碼

  工具的使用就不多介紹啦!我是直接使用JavaScript調用控件ScriptingEncoder完成的編碼!代碼如下
<SCRIPT LANGUAGE=JavaScript>
var Senc=new ActiveXObject(ScriptingEncoder);
var code=<SCRIPT LANGUAGE=JavaScript>\r\nalert(《黑客防線》);\r\n<\/SCRIPT>;
var Encode=SencEncodeScriptFile(code);
alert(Encode);
</SCRIPT>
 

  編碼後的結果如下
<SCRIPT LANGUAGE=JScriptEncode>#@~^FgAAAA==@#@&lsDD`J黑客防線r#p@#@&FgMAAA==^#~@</SCRIPT>
 

  夠難看懂得吧?但相應的解密工具早已出來而且連解密網頁都有!因為其解密網頁代碼過多我就不多說拉!給大家介紹一下我獨創的解密代碼如下
<SCRIPT LANGUAGE=JScriptEncode>
function decode(){
#@~^FgAAAA==@#@&lsDD`J黑客防線r#p@#@&FgMAAA==^#~@
}
alert(decodetoString());
</SCRIPT>
 

  咋樣?夠簡單吧?它是原理是編碼後的代碼運行前IE會先對其進行解碼如果我們先把加密的代碼放入一個自定義函數如上面的decode()中然後對自定義函數decode調用toString()方法得到的將是解碼後的代碼!

  如果你覺得這樣編碼得到的代碼LANGUAGE屬性是JScriptEncode很容易讓人識破那麼還有一個幾乎不為人知的window對象的方法execScript()其原形為
windowexecScript( sExpression sLanguage )
 

  參數
sExpression: 必選項字符串(String)要被執行的代碼
sLanguage : 必選項字符串(String)指定執行的代碼的語言默認值為 Microsoft JScript

  使用時前面的window可以省略不寫!

  利用它我們可以很好的運行編碼後的JavaScript代碼如下
<SCRIPT LANGUAGE=JavaScript>
execScript(#@~^FgAAAA==@#@&lsDD`J黑客防線r#p@#@&FgMAAA==^#~@JScriptEncode)
</SCRIPT>
 

  你可以利用方法二對其中的號內的字符串再進行編碼使得JScriptEncode以及編碼特征碼#@~^不出現效果會更好!

  四任意添加NUL空字符(十六進制H)

  一次偶然的實驗使我發現在HTML網頁中任意位置添加任意個數的空字符IE照樣會正常顯示其中的內容並正常執行其中的JavaScript 代碼而添加的空字符我們在用一般的編輯器查看時會顯示形如空格或黑塊使得原碼很難看懂如用記事本查看則空字符會變成空格利用這個原理加密結果如下(其中顯示的空格代表空字符
<S C RI P T L ANG U A G E = J a v a S c r i p t >

  a l er t ( 黑 客 防 線) ;

  < / SC R I P T>
 

  如何?是不是顯得亂七八糟的?如果不知道方法的人很難想到要去掉裡面的空字符H)的!

  五無用內容混亂以及換行空格TAB大法

  在JAVASCRIPT代碼中我們可以加入大量的無用字符串或數字以及無用代碼和注釋內容等等使真正的有用代碼埋沒在其中並把有用的代碼中能加入換行空格TAB的地方加入大量換行空格TAB並可以把正常的字符串用\來進行換行這樣就會使得代碼難以看懂!如我加密後的形式如下
<SCRIPT LANGUAGE=JavaScript>
xajgxsadffgds;
;var $=;alert//@$%%&*()(&(^%^
//cctv function//
(//hhsaasajx xc
/*
asjgdsgu*/
黑\
\
客\
防線//ashjgfgf
/*
@#%$^&%$rfggbhytjty
*/
//window
)
;#@$#%@#hu;
</SCRIPT>
 

  至少如果我看到這樣的代碼是不會有心思去分析它的你哪?

  六自寫解密函數法

  這個方法和一二差不多只不過是自己寫個函數對代碼進行解密很多VBS病毒使用這種方法對自身進行加密來防止特征碼掃描!下面是我寫的一個簡單的加密解密函數

  加密代碼如下(詳細參照文件
<SCRIPT LANGUAGE=JavaScript>
function compile(code)
{
var c=StringfromCharCode(codecharCodeAt()+codelength);
for(var i=;i<codelength;i++){
c+=StringfromCharCode(codecharCodeAt(i)+codecharCodeAt(i));
}
alert(escape(c));
}
compile(alert(《黑客防線》);)
</SCRIPT>
 

  運行得到加密結果為
o%CD%D%D%E%CJ%uEF%uFA%uFD%uF%uEEKd
 

  相應的加密後解密的代碼如下
<SCRIPT LANGUAGE=JavaScript>
function uncompile(code)
{
code=unescape(code);
var c=StringfromCharCode(codecharCodeAt()codelength);
for(var i=;i<codelength;i++){
c+=StringfromCharCode(codecharCodeAt(i)ccharCodeAt(i));
}
return c;
}
eval(uncompile(o%CD%D%D%E%CJ%uEF%uFA%uFD%uF%uEEKd));
</SCRIPT>
 

  七錯誤的利用

  利用try{}catch(e){}結構對代碼進行測試解密雖然這個想法很好(呵呵誇誇自己)因為實用性不大我僅給個例子
<SCRIPT LANGUAGE=JavaScript>

  var a=alert(《黑客防線》);;
var c=;
for(var i=;i<alength;i++){
c+=StringfromCharCode(acharCodeAt(i)^);}

  alert(c);

  //上面的是加密代碼當然如果真正使用這個方法時不會把加密寫上的
//現在變量c就是加密後的代碼

  //下面的函數t()先假設初始密碼為0解密執行
//遇到錯誤則把密碼加1然後接著解密執行直到正確運行

  var d=c; //保存加密後的代碼
var b=; //假定初始密碼為
t();

  function t(){
try{eval(c);}catch(e){
c=;
for(var i=;i<dlength;i++){
c+=StringfromCharCode(dcharCodeAt(i)^b);}
b+=;
t();
//setTimeout(t());
}
}
</SCRIPT>


From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25332.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.