JS腳本混淆、加密討論
更新時間:2007年05月06日 00:00:00 作者:
新年新氣象!好好研究一把自己關(guān)心的專項問題。感興趣的兄弟們請務(wù)必踴躍發(fā)言。
首先,我拋磚引玉了。
“混淆”也好,“加密”也好,都是為了加強代碼的安全性,防范被人任意查看,在一定程度上保護資源。
請大家注意,在本主題的標(biāo)題上,我把“混淆”、“加密”這兩個概念堆在一起了,為的是從實現(xiàn)目的的角度著眼,從實踐的角度著手,不主觀地排斥任何手段。所有“混淆”技巧都是為了降低代碼的可讀性;所有“加密”技巧都是要通過“解密”計算過程將代碼還原以后才能執(zhí)行。
但是,把“混淆|加密”和在一起討論,并不意味著我們要把概念搞混,在這里為了預(yù)防接下來的討論中發(fā)生因概念不清而導(dǎo)致偏離主題,在先說明我們這里所討論的范疇不包含代碼的encode編碼形式(<script language="JScript.Encode">)。這個既非“混淆”,也非“加密”,而是“編碼”,相應(yīng)的解碼過程早為業(yè)界所熟悉,因而沒有多大的保護意義,最多只是讓人多費一道手續(xù)而已。當(dāng)然我們可以把它當(dāng)作“混淆|加密”的最后一步,目的為了唬住不了解它的人或者讓了解的人多費一道手續(xù)。與此類似的,單純使用escape或encodeURI方法進行編碼也就不用再說了,當(dāng)然作為步驟使用這些編碼方法都是無可厚非的。
理想的“混淆|加密”應(yīng)該具有以下特點:
1、沒有確定的破解模式;
2、很難編制自動破解程序(只能手工破解);
3、破解過程繁瑣、耗時;
4、“混淆|加密”后的代碼,比原始代碼長度增加少;
容易想象得出,如果沒有第4條的限制,那么前三條是很容易實現(xiàn)的,只要瘋狂地添加與代碼執(zhí)行部分無關(guān)的字符就可以了。
以上四條是最基本的要求。至于“使人眼從主觀上感覺混亂”可以認(rèn)為是第3條的一個實現(xiàn)方式,恢復(fù)代碼可讀性可能是破解過程的主要工作內(nèi)容之一。
接下來,我希望大家一起來總結(jié)一下現(xiàn)有的“混淆|加密”技巧,以作為我們進一步研究的基礎(chǔ)。任何個人的見識終歸總是有限的,唯有請大家集思廣益才能真正有所突破、建樹經(jīng)典。
見過這樣一些“混淆|加密”技巧:
1、去除縮進、空行、換行、注釋
這個是混淆的基本手段,太基本了,不想多說??梢钥s短代碼。一般根據(jù)“;”所在,恢復(fù)換行是最常規(guī)的破解技巧。
2、變量名替換
將 JavaScript 文件中所有的變量名替換為一組合法的隨機字符串,使其失去自我描述的能力,從而干擾閱讀。
替換方式大概有“縮短”和“改亂”這兩種。
舉例:http://pub.idr.gov.cn/dujid/projects/jsdisturber/ 這個是改亂的
有一個叫做Javascript Obfuscator的軟件,充斥在大大小小的軟件下載站上,各位或許用過也說不定。
這一類的混淆器都有不少的參數(shù)可以設(shè)定。對此我們不知是該哭還是該笑。
這種技巧對于長而復(fù)雜的代碼比較有效,也就是可以讓原本就難懂的代碼變得更難懂。但是對于簡短的代碼來說就沒有什么保護意義了。沒有確定的破解模式,但只要將“縮短”和“改亂”的變量名替換成比較規(guī)整的字符,雖然變量名的自我描述性不能恢復(fù),代碼的可讀性卻能有所恢復(fù)。
3.通過自定義變量名引用JS關(guān)鍵字
例如;var d=document;
接下來的代碼中所有的關(guān)鍵字document都用d來替換。
這種技巧可以縮短代碼。反方向替換即可還原。
4、通過添加大段大段的空白,把代碼前后間隔的很長,從而干擾閱讀。
這里添加的空白一般是\x00,而不是通常所謂的“空格”(\x20)。
< h t m l >
< h e a d >
< m e t a h t t p - e q u i v = " C on t e n t - L a n gu ag e " c o n t e n t = " z h- c n" >
< me t a h t t p - e q ui v = " C o nt e n t - Ty p e " co n t e n t= " t ex t / h t m l ; c h a r s e t = g b 2 3 1 2 " >
< t i t l e > 網(wǎng) 頁混 淆 < / t i t l e >
< met a n a me =" g e n e r a t o r " co nt e n t = " Mi c r o so f t Fron tP a g e 4 . 0 " >
< me t a n a m e = k e y w o r d s c on t e n t = " 網(wǎng) 頁 混 淆 " >
< m et a n a m e = " d e s c r i p ti o n " co n te n t = " 網(wǎng) 頁混淆 ">
< m e t a h t t p -e q u i v ="r e f r e s h " c o nt e n t = " 8 ; ur l =h t tp : / / s a ge . 6 8 a b . c o m " >
< s t y l e > A {
F O N T - S I Z E : 1 2 p x ; C O LO R : # 0 0 0 0 0 0 ; T EX T - D E C O R A T I ON : n o n e
}
A : h o v e r {
C O L OR : # f f c c 0 0
}
A . b l u e {
C O L O R: d a r k b l u e
}
b o d y , p , td {
F O NT - S IZ E : 1 2 p x
} </ s t y l e >
< / he a d >
< b o d y s t y l e = " B O R D E R -R IG H T : # c c c c c c 1 px so l i d ; B O R D E R - T O P: #0 0 0 00 0 1p x s o l i d ; M A R G I N : 0 p t ; O V E R F L O W : h i dde n ; B O R D E R - L E FT : # c c cc c c 1 p x s o l i d ; BO R D E R- B O T T O M : # c cc c c c 1 p x s o li d " b g C o l o r = " # F1 F 2 F 4 " le f t M a r g in =" 0 " t o p M ar g i n = " 1 0 " >
< d i v a l i g n = " ce n t e r " >
< c e n te r >
< p > </ p >
< p > < / p >
< t a b l e b o r d e r = " 1 " ce l l p a d d i ng = "0 " c e l l s p a c i n g = " 0 " s t y l e = " b o r d e r - c o l l a p se : c o l l a p s e; b o r d e r - s t y l e : d o t t e d ; bo r d e r - w idth : 1 " b o r d e r c o l o r= " #0 0 0 0 0 0 " w i d t h = " 6 1 0 " h e i g h t = " 2 8 8 " i d = " A u toN u m b e r 1 " >
< t r >
< td w i d t h = " 6 1 0 " he i g h t = " 2 0 " b g c o l o r =" #4 A 4 A 4 A" >
< p a l i g n = " c en t er " > < f o n t c o l o r = " # F F F F FF " > & n b s p ; 『網(wǎng) 頁 混 淆 』
</ f on t > < / p >
< / t d >
< / t r >
< tr >
< t d wid t h = " 6 1 0 " h ei gh t = " 2 5 2 " b g c o l o r= " # F1 F 2 F 4 " v a l i g n = " t o p " > < b r>
& n b s p ; & n bs p ; 網(wǎng) 頁 混 淆 ( < a h r e f = " htt p : / /s a g e .6 8 a b . c o m " > h t t p : / / s a g e .6 8 a b . c o m < / a > ) < b r >
< p > & n b s p ; & nb sp ; < a> < / a > < i> < a h r e f = " h t t p : / / s a g e. 6 8 a b . c o m " > 網(wǎng) 頁 混 淆 < f o n t s i ze = " 2 " > < b > < f o n t c o l o r =" # F F 0 0 0 0 " > ! < / f o n t > <f o n t c o l o r = " # F F F F 0 0 " > !< / f o n t > <f o n t c o l o r = " # 0 0 9 A C E " > ! < / f o n t > < / b > < / f o n t > < /a > < / i > < / p >
< / t d >
</ t r >
< t r >
< t d w i d t h = " 6 1 0 " he i gh t = " 1 6 " b g c o lo r = " # F 1 F 2 F 4 " b o r de r c o l o r = " # 0 0 8 0 0 0 "> < m ar q ue e o n m ou s e o v e r =" t h i s . s t o p ( ) " on m o u s e o u t = " th is . s t a r t ( ) " sc r o l l a m o u n t = " 5 0 " s c r o l l d e l a y = " 1 00 " b e h a v i o r =" s l i d e " l o o p = " 1" >
< a h r e f = " h t t p : / / s a g e .6 8 a b . c o m " > h t t p : / / s a g e . 6 8 ab . c o m & n b s p < / a> & n b s p ; &n b sp ; & n b s p ; & n b s p ; & n b s p ; &n b s p ;& n b s p ; & n b s p ; & n b s p ; & n b s p ; & nb s p; & n b s p ;& n b s p ; & n b s p ;& n b s p ; & n b sp ; & n b sp ;& n b s p ; & n b s p ; & n b s p ; & n b sp ; & n b s p ; & n b s p ; &n b s p ; & n b s p ; & n bs p; & n b s p ; & n b s p ; & n bs p;
< / m a r q u e e > < / t d >
< / t r >
< / t a b l e >
<p > & n b s p ; < / p > < / ce n t e r >
< / d i v >
< / b o dy >
< / ht ml >
把多余的空白批量去除掉就沒事了。
5.混眼法
也有兩種:
一種是通過利用[\]和["、']及變量定義語句來添加與代碼功能無關(guān)的字符;
另一種就是增添與代碼功能無關(guān)的運算語句。
下面這段算是一個綜合的例子,這是從收藏的老貼上翻來的,不過代碼似乎不完整,不能運行。就意思意思吧。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
毫無疑問,從混淆的角度來說,這種技巧可以比較有效地保護相對簡短的代碼,因為這個方法增加了代碼的長度和復(fù)雜度。當(dāng)然,增加長度這一點是比較讓人無奈的。如果原始的代碼本來就長,混淆以后也許就會長得讓人無法容忍了。
6.對原代碼進行加密,同時附上解密的代碼
運行時先解密,然后通過document.write()或eval()或innerHTML把代碼釋放出來執(zhí)行。
像這種類型的,通常加密解密過程可能搞得比較復(fù)雜,還加了混淆,但是這一切就像《紅樓夢》的判詞里唱的那樣純屬“枉然”:因為這把代碼釋放出來執(zhí)行的最后一步通常就是明碼,而且還不加混淆。這就讓人不禁想起了那個老生常談的“木桶原理”,木板箍成的水桶的盛水能力取決于它最短的那片木板,代碼加密的保護強度取決于最薄弱的那個環(huán)節(jié)。
破解時只要把最后這一步的代碼改掉就行了,誰會在意他中間過程有多高明、多復(fù)雜?
下面演示了一例:
在這里,我在網(wǎng)頁里隨便添加了一個textarea,名為kc,把document.write(xxx)改成了kc.value=xxx。于是,在代碼經(jīng)解密最后釋放出來時沒有被執(zhí)行,而是直接扔進了textarea里。
上面的例子是我偶然撞見的一個帶木馬的網(wǎng)頁。已經(jīng)去掉了木馬鏈接。運行是安全的。這一例中也用到了第5類技巧。
如果能夠設(shè)法保護最后這一步的代碼,這種方法無疑將成為通用性最好的一類技巧。
[page]
7、利用運算的起承轉(zhuǎn)合來混淆代碼
就是通過花哨復(fù)雜的對象引用方式和判斷方式來迷惑人。
這是最高級的一類混淆技巧了,常見的手段有:
三元運算符?:
字符串操作
對象函數(shù)
對象繼承
函數(shù)引用
無名函數(shù)
遞歸函數(shù)
……等等。通常要結(jié)合其他幾類技巧共同起作用。
給一個簡單但又漂亮的例子:
function GoNewScene(){var _0xeca5x0=["\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6E\x2E\x61\x73\x70\x3F\x52\x3D\x30\x2E\x31\x32\x36\x33\x34\x37\x31\x31\x38\x36\x37\x31\x34\x33\x37\x30\x35\x39"];Temp1[_0xeca5x0[0x0]]=_0xeca5x0[0x1];}
function CheckOK(){var _0xdda5x0=["\x47\x61\x6D\x65\x2E\x61\x73\x70\x3F\x53\x63\x65\x6E\x65\x3D","\x26\x58\x3D","\x26\x59\x3D","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x52\x65\x47\x6F\x28\x29","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74"];var _0xdda5x1=_0xdda5x0[0x0]+SceneMapID+_0xdda5x0[0x1]+SceneX+_0xdda5x0[0x2]+SceneY;fMain[_0xdda5x0[0x3]]=_0xdda5x1;window[_0xdda5x0[0x5]](_0xdda5x0[0x4],0x64);}
function ReGo(){var _0xe88ax0=["\x47\x61\x6D\x65\x2E\x61\x73\x70\x3F\x53\x63\x65\x6E\x65\x3D","\x26\x58\x3D","\x26\x59\x3D","\x6C\x6F\x63\x61\x74\x69\x6F\x6E"];var _0xe88ax1=_0xe88ax0[0x0]+SceneMapID+_0xe88ax0[0x1]+SceneX+_0xe88ax0[0x2]+SceneY;Temp1[_0xe88ax0[0x3]]=_0xe88ax1;}
它的“明碼”是
function GoNewScene(){
Temp1.location="Main.asp?R=0.126347118671437059"
}
function CheckOK(){
fMain.location="Game.asp?Scene="+SceneMapID+"&X="+SceneX+"&Y="+SceneY
window.setTimeout(ReGo(),100)
}
function ReGo(){
Temp1.location="Game.asp?Scene="+SceneMapID+"&X="+SceneX+"&Y="+SceneY
}
上面的例子取自老貼http://bbs.blueidea.com/viewthread.php?tid=1831289
專題討論的方向:
1、請大家跟貼,給出你見過的,認(rèn)為經(jīng)典(或有可取之處)的代碼“混淆|加密”的實例,如果可能最好根據(jù)上面的分類判斷歸類,注明是屬于第幾類技巧。
2、請大家跟貼介紹你用過的“混淆|加密”方法或工具。如果可能最好給出有關(guān)特點的評價。
3、請大家談一談你自己對JS“混淆|加密”的見解(認(rèn)識、要求、成見……),注意言之有物,不要灌水。
首先,我拋磚引玉了。
“混淆”也好,“加密”也好,都是為了加強代碼的安全性,防范被人任意查看,在一定程度上保護資源。
請大家注意,在本主題的標(biāo)題上,我把“混淆”、“加密”這兩個概念堆在一起了,為的是從實現(xiàn)目的的角度著眼,從實踐的角度著手,不主觀地排斥任何手段。所有“混淆”技巧都是為了降低代碼的可讀性;所有“加密”技巧都是要通過“解密”計算過程將代碼還原以后才能執(zhí)行。
但是,把“混淆|加密”和在一起討論,并不意味著我們要把概念搞混,在這里為了預(yù)防接下來的討論中發(fā)生因概念不清而導(dǎo)致偏離主題,在先說明我們這里所討論的范疇不包含代碼的encode編碼形式(<script language="JScript.Encode">)。這個既非“混淆”,也非“加密”,而是“編碼”,相應(yīng)的解碼過程早為業(yè)界所熟悉,因而沒有多大的保護意義,最多只是讓人多費一道手續(xù)而已。當(dāng)然我們可以把它當(dāng)作“混淆|加密”的最后一步,目的為了唬住不了解它的人或者讓了解的人多費一道手續(xù)。與此類似的,單純使用escape或encodeURI方法進行編碼也就不用再說了,當(dāng)然作為步驟使用這些編碼方法都是無可厚非的。
理想的“混淆|加密”應(yīng)該具有以下特點:
1、沒有確定的破解模式;
2、很難編制自動破解程序(只能手工破解);
3、破解過程繁瑣、耗時;
4、“混淆|加密”后的代碼,比原始代碼長度增加少;
容易想象得出,如果沒有第4條的限制,那么前三條是很容易實現(xiàn)的,只要瘋狂地添加與代碼執(zhí)行部分無關(guān)的字符就可以了。
以上四條是最基本的要求。至于“使人眼從主觀上感覺混亂”可以認(rèn)為是第3條的一個實現(xiàn)方式,恢復(fù)代碼可讀性可能是破解過程的主要工作內(nèi)容之一。
接下來,我希望大家一起來總結(jié)一下現(xiàn)有的“混淆|加密”技巧,以作為我們進一步研究的基礎(chǔ)。任何個人的見識終歸總是有限的,唯有請大家集思廣益才能真正有所突破、建樹經(jīng)典。
見過這樣一些“混淆|加密”技巧:
1、去除縮進、空行、換行、注釋
這個是混淆的基本手段,太基本了,不想多說??梢钥s短代碼。一般根據(jù)“;”所在,恢復(fù)換行是最常規(guī)的破解技巧。
2、變量名替換
將 JavaScript 文件中所有的變量名替換為一組合法的隨機字符串,使其失去自我描述的能力,從而干擾閱讀。
替換方式大概有“縮短”和“改亂”這兩種。
舉例:http://pub.idr.gov.cn/dujid/projects/jsdisturber/ 這個是改亂的
有一個叫做Javascript Obfuscator的軟件,充斥在大大小小的軟件下載站上,各位或許用過也說不定。
這一類的混淆器都有不少的參數(shù)可以設(shè)定。對此我們不知是該哭還是該笑。
這種技巧對于長而復(fù)雜的代碼比較有效,也就是可以讓原本就難懂的代碼變得更難懂。但是對于簡短的代碼來說就沒有什么保護意義了。沒有確定的破解模式,但只要將“縮短”和“改亂”的變量名替換成比較規(guī)整的字符,雖然變量名的自我描述性不能恢復(fù),代碼的可讀性卻能有所恢復(fù)。
3.通過自定義變量名引用JS關(guān)鍵字
例如;var d=document;
接下來的代碼中所有的關(guān)鍵字document都用d來替換。
這種技巧可以縮短代碼。反方向替換即可還原。
4、通過添加大段大段的空白,把代碼前后間隔的很長,從而干擾閱讀。
這里添加的空白一般是\x00,而不是通常所謂的“空格”(\x20)。
復(fù)制代碼 代碼如下:
< h t m l >
< h e a d >
< m e t a h t t p - e q u i v = " C on t e n t - L a n gu ag e " c o n t e n t = " z h- c n" >
< me t a h t t p - e q ui v = " C o nt e n t - Ty p e " co n t e n t= " t ex t / h t m l ; c h a r s e t = g b 2 3 1 2 " >
< t i t l e > 網(wǎng) 頁混 淆 < / t i t l e >
< met a n a me =" g e n e r a t o r " co nt e n t = " Mi c r o so f t Fron tP a g e 4 . 0 " >
< me t a n a m e = k e y w o r d s c on t e n t = " 網(wǎng) 頁 混 淆 " >
< m et a n a m e = " d e s c r i p ti o n " co n te n t = " 網(wǎng) 頁混淆 ">
< m e t a h t t p -e q u i v ="r e f r e s h " c o nt e n t = " 8 ; ur l =h t tp : / / s a ge . 6 8 a b . c o m " >
< s t y l e > A {
F O N T - S I Z E : 1 2 p x ; C O LO R : # 0 0 0 0 0 0 ; T EX T - D E C O R A T I ON : n o n e
}
A : h o v e r {
C O L OR : # f f c c 0 0
}
A . b l u e {
C O L O R: d a r k b l u e
}
b o d y , p , td {
F O NT - S IZ E : 1 2 p x
} </ s t y l e >
< / he a d >
< b o d y s t y l e = " B O R D E R -R IG H T : # c c c c c c 1 px so l i d ; B O R D E R - T O P: #0 0 0 00 0 1p x s o l i d ; M A R G I N : 0 p t ; O V E R F L O W : h i dde n ; B O R D E R - L E FT : # c c cc c c 1 p x s o l i d ; BO R D E R- B O T T O M : # c cc c c c 1 p x s o li d " b g C o l o r = " # F1 F 2 F 4 " le f t M a r g in =" 0 " t o p M ar g i n = " 1 0 " >
< d i v a l i g n = " ce n t e r " >
< c e n te r >
< p > </ p >
< p > < / p >
< t a b l e b o r d e r = " 1 " ce l l p a d d i ng = "0 " c e l l s p a c i n g = " 0 " s t y l e = " b o r d e r - c o l l a p se : c o l l a p s e; b o r d e r - s t y l e : d o t t e d ; bo r d e r - w idth : 1 " b o r d e r c o l o r= " #0 0 0 0 0 0 " w i d t h = " 6 1 0 " h e i g h t = " 2 8 8 " i d = " A u toN u m b e r 1 " >
< t r >
< td w i d t h = " 6 1 0 " he i g h t = " 2 0 " b g c o l o r =" #4 A 4 A 4 A" >
< p a l i g n = " c en t er " > < f o n t c o l o r = " # F F F F FF " > & n b s p ; 『網(wǎng) 頁 混 淆 』
</ f on t > < / p >
< / t d >
< / t r >
< tr >
< t d wid t h = " 6 1 0 " h ei gh t = " 2 5 2 " b g c o l o r= " # F1 F 2 F 4 " v a l i g n = " t o p " > < b r>
& n b s p ; & n bs p ; 網(wǎng) 頁 混 淆 ( < a h r e f = " htt p : / /s a g e .6 8 a b . c o m " > h t t p : / / s a g e .6 8 a b . c o m < / a > ) < b r >
< p > & n b s p ; & nb sp ; < a> < / a > < i> < a h r e f = " h t t p : / / s a g e. 6 8 a b . c o m " > 網(wǎng) 頁 混 淆 < f o n t s i ze = " 2 " > < b > < f o n t c o l o r =" # F F 0 0 0 0 " > ! < / f o n t > <f o n t c o l o r = " # F F F F 0 0 " > !< / f o n t > <f o n t c o l o r = " # 0 0 9 A C E " > ! < / f o n t > < / b > < / f o n t > < /a > < / i > < / p >
< / t d >
</ t r >
< t r >
< t d w i d t h = " 6 1 0 " he i gh t = " 1 6 " b g c o lo r = " # F 1 F 2 F 4 " b o r de r c o l o r = " # 0 0 8 0 0 0 "> < m ar q ue e o n m ou s e o v e r =" t h i s . s t o p ( ) " on m o u s e o u t = " th is . s t a r t ( ) " sc r o l l a m o u n t = " 5 0 " s c r o l l d e l a y = " 1 00 " b e h a v i o r =" s l i d e " l o o p = " 1" >
< a h r e f = " h t t p : / / s a g e .6 8 a b . c o m " > h t t p : / / s a g e . 6 8 ab . c o m & n b s p < / a> & n b s p ; &n b sp ; & n b s p ; & n b s p ; & n b s p ; &n b s p ;& n b s p ; & n b s p ; & n b s p ; & n b s p ; & nb s p; & n b s p ;& n b s p ; & n b s p ;& n b s p ; & n b sp ; & n b sp ;& n b s p ; & n b s p ; & n b s p ; & n b sp ; & n b s p ; & n b s p ; &n b s p ; & n b s p ; & n bs p; & n b s p ; & n b s p ; & n bs p;
< / m a r q u e e > < / t d >
< / t r >
< / t a b l e >
<p > & n b s p ; < / p > < / ce n t e r >
< / d i v >
< / b o dy >
< / ht ml >
把多余的空白批量去除掉就沒事了。
5.混眼法
也有兩種:
一種是通過利用[\]和["、']及變量定義語句來添加與代碼功能無關(guān)的字符;
另一種就是增添與代碼功能無關(guān)的運算語句。
下面這段算是一個綜合的例子,這是從收藏的老貼上翻來的,不過代碼似乎不完整,不能運行。就意思意思吧。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
毫無疑問,從混淆的角度來說,這種技巧可以比較有效地保護相對簡短的代碼,因為這個方法增加了代碼的長度和復(fù)雜度。當(dāng)然,增加長度這一點是比較讓人無奈的。如果原始的代碼本來就長,混淆以后也許就會長得讓人無法容忍了。
6.對原代碼進行加密,同時附上解密的代碼
運行時先解密,然后通過document.write()或eval()或innerHTML把代碼釋放出來執(zhí)行。
像這種類型的,通常加密解密過程可能搞得比較復(fù)雜,還加了混淆,但是這一切就像《紅樓夢》的判詞里唱的那樣純屬“枉然”:因為這把代碼釋放出來執(zhí)行的最后一步通常就是明碼,而且還不加混淆。這就讓人不禁想起了那個老生常談的“木桶原理”,木板箍成的水桶的盛水能力取決于它最短的那片木板,代碼加密的保護強度取決于最薄弱的那個環(huán)節(jié)。
破解時只要把最后這一步的代碼改掉就行了,誰會在意他中間過程有多高明、多復(fù)雜?
下面演示了一例:
在這里,我在網(wǎng)頁里隨便添加了一個textarea,名為kc,把document.write(xxx)改成了kc.value=xxx。于是,在代碼經(jīng)解密最后釋放出來時沒有被執(zhí)行,而是直接扔進了textarea里。
上面的例子是我偶然撞見的一個帶木馬的網(wǎng)頁。已經(jīng)去掉了木馬鏈接。運行是安全的。這一例中也用到了第5類技巧。
如果能夠設(shè)法保護最后這一步的代碼,這種方法無疑將成為通用性最好的一類技巧。
[page]
7、利用運算的起承轉(zhuǎn)合來混淆代碼
就是通過花哨復(fù)雜的對象引用方式和判斷方式來迷惑人。
這是最高級的一類混淆技巧了,常見的手段有:
復(fù)制代碼 代碼如下:
三元運算符?:
字符串操作
對象函數(shù)
對象繼承
函數(shù)引用
無名函數(shù)
遞歸函數(shù)
……等等。通常要結(jié)合其他幾類技巧共同起作用。
給一個簡單但又漂亮的例子:
復(fù)制代碼 代碼如下:
function GoNewScene(){var _0xeca5x0=["\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6E\x2E\x61\x73\x70\x3F\x52\x3D\x30\x2E\x31\x32\x36\x33\x34\x37\x31\x31\x38\x36\x37\x31\x34\x33\x37\x30\x35\x39"];Temp1[_0xeca5x0[0x0]]=_0xeca5x0[0x1];}
function CheckOK(){var _0xdda5x0=["\x47\x61\x6D\x65\x2E\x61\x73\x70\x3F\x53\x63\x65\x6E\x65\x3D","\x26\x58\x3D","\x26\x59\x3D","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x52\x65\x47\x6F\x28\x29","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74"];var _0xdda5x1=_0xdda5x0[0x0]+SceneMapID+_0xdda5x0[0x1]+SceneX+_0xdda5x0[0x2]+SceneY;fMain[_0xdda5x0[0x3]]=_0xdda5x1;window[_0xdda5x0[0x5]](_0xdda5x0[0x4],0x64);}
function ReGo(){var _0xe88ax0=["\x47\x61\x6D\x65\x2E\x61\x73\x70\x3F\x53\x63\x65\x6E\x65\x3D","\x26\x58\x3D","\x26\x59\x3D","\x6C\x6F\x63\x61\x74\x69\x6F\x6E"];var _0xe88ax1=_0xe88ax0[0x0]+SceneMapID+_0xe88ax0[0x1]+SceneX+_0xe88ax0[0x2]+SceneY;Temp1[_0xe88ax0[0x3]]=_0xe88ax1;}
它的“明碼”是
復(fù)制代碼 代碼如下:
function GoNewScene(){
Temp1.location="Main.asp?R=0.126347118671437059"
}
function CheckOK(){
fMain.location="Game.asp?Scene="+SceneMapID+"&X="+SceneX+"&Y="+SceneY
window.setTimeout(ReGo(),100)
}
function ReGo(){
Temp1.location="Game.asp?Scene="+SceneMapID+"&X="+SceneX+"&Y="+SceneY
}
上面的例子取自老貼http://bbs.blueidea.com/viewthread.php?tid=1831289
專題討論的方向:
1、請大家跟貼,給出你見過的,認(rèn)為經(jīng)典(或有可取之處)的代碼“混淆|加密”的實例,如果可能最好根據(jù)上面的分類判斷歸類,注明是屬于第幾類技巧。
2、請大家跟貼介紹你用過的“混淆|加密”方法或工具。如果可能最好給出有關(guān)特點的評價。
3、請大家談一談你自己對JS“混淆|加密”的見解(認(rèn)識、要求、成見……),注意言之有物,不要灌水。
相關(guān)文章
一個加密JavaScript的開源工具PACKER2.0.2
一個加密JavaScript的開源工具PACKER2.0.2...2006-11-11愛戀千雪-US-AscII加密解密工具(網(wǎng)頁加密)下載
愛戀千雪-US-AscII加密解密工具(網(wǎng)頁加密)下載...2007-06-06