>  기사  >  웹 프론트엔드  >  JavaScript 암호화 및 복호화를 위한 7가지 방법 요약 및 분석_Hacker Nature

JavaScript 암호화 및 복호화를 위한 7가지 방법 요약 및 분석_Hacker Nature

WBOY
WBOY원래의
2016-05-16 19:08:421222검색

이번 글에서는 총 7가지 자바스크립트 암호화 방법을 소개합니다.

웹페이지를 만들 때(실제로는 웹트로이목마 ㅎㅎ) 가장 짜증나는게 제가 공들여 작성하고 클라이언트 IE에서 실행시킨 자바스크립트 코드가 남들이 쉽게 베끼면 좀 불편하긴 해요. 혼자 쓰기엔 꽤 피곤한 일이잖아요...^*^

하지만 우리도 분명히 알아야 할 것 같아요. 자바스크립트 코드 때문에 IE에서 설명하고 구현하는 것은 절대적인 기밀 유지가 불가능합니다. 우리가 해야 할 일은 그가 물러날 수 있도록 복사의 난이도를 최대한 높이는 것입니다(부디~!~). 아래에 결합하세요. 지난 몇 년간의 저의 실습과 개인적인 연구 경험을 바탕으로 웹 페이지의 JavaScript 코드 암호화 및 복호화 기술에 대해 논의하겠습니다.

다음의 암호화된 자바스크립트 코드를 예로 들어보겠습니다.




1: 가장 간단한 암호화 및 복호화

누구나 자바스크립트에 익숙합니다. function escape() unescape()에 익숙해야 합니다(많은 웹 페이지에서 이를 암호화에 사용합니다). 이는 각각 문자열을 인코딩하고 디코딩하는 것입니다. 예를 들어 예제 코드는 escape() 함수로 암호화되며 다음 형식이 됩니다.

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

어떻게요? 아직도 이해하시나요? 물론 ASCII 문자 "alert"는 암호화되지 않습니다. 원하는 경우 다음과 같이 일부 자바스크립트 코드를 작성하여 다시 암호화할 수 있습니다.

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

하하! 어떻게? 이번에는 완전히 암호화되었습니다!

물론 암호화된 코드를 직접 실행할 수는 없지만 다행히 eval(codeString)이 가능합니다. 이 함수의 기능은 자바스크립트 코드를 확인하고 실행하는 것입니다. 유효한 자바스크립트 코드에 문자열 값을 추가하고 위의 unescape()를 디코딩하면 암호화된 결과는 다음과 같습니다.



아주 간단하지 않나요? 기뻐하지 마세요. 해독도 간단하고, 해독 코드는 다른 사람에게 맡겨져 있습니다(unescape())! ㅎㅎ

2: 이스케이프 문자 ""의 놀라운 활용

이스케이프 문자 ""가 익숙하지 않을 수도 있지만 JavaScript는 n(줄 바꿈)과 같은 특수 문자를 제공합니다. , r(Enter), '(작은따옴표) 등은 익숙할 것입니다. 실제로 "" 뒤에는 8진수 또는 16진수 숫자가 올 수도 있습니다. 예를 들어 문자 "a"는 "141" 또는 "x61"로 표현될 수 있습니다(참고: 소문자 "x"임). 중국어 문자 "Black"과 같은 2바이트 문자는 "u9ED1"(소문자 "u"에 유의)로만 16진수로 표현할 수 있습니다. 여기서 문자 "u"는 2바이트 문자를 나타냅니다. 예제 코드는 다음과 같이 표현할 수 있습니다.

8진수 이스케이프 문자열은 다음과 같습니다.




16진수 이스케이프 문자열은 다음과 같습니다.




이번에는 JavaScript가 실행될 때 자체적으로 변환되므로 디코딩 기능이 없습니다. 디코딩도 다음과 같이 매우 간단합니다.




A 해독된 결과를 알려주는 대화 상자가 나타납니다!

셋: 마이크로소프트에서 제작한 스크립트 인코더를 사용해 인코딩하세요

도구 사용법에 대해서는 별로 소개하지 않겠습니다! 인코딩을 완료하기 위해 JavaScript를 직접 사용하여 Scripting.Encoder 컨트롤을 호출했습니다! 코드는 다음과 같습니다.

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


인코딩된 결과는 다음과 같습니다.




이해하기 힘들 정도로 추악하죠? 그러나 해당 암호 해독 도구는 이미 출시되었으며 암호 해독 웹 페이지도 있습니다! 웹페이지를 해독하기에는 코드가 너무 많아서 더 이상 말하지 않겠습니다! 저의 원래 복호화 코드를 다음과 같이 소개하겠습니다.




어떨까요? 아주 간단하죠? 원칙은 다음과 같습니다. IE는 인코딩된 코드를 실행하기 전에 디코딩합니다. 먼저 암호화된 코드를 위의 decode()와 같은 사용자 정의 함수에 넣은 다음 사용자 정의 함수 decode 메서드에서 toString()을 호출하면 결과는 다음과 같습니다. 해독된 코드!

이렇게 인코딩된 코드의 LANGUAGE 속성이 사람이 쉽게 알아볼 수 있는 JScript.Encode라고 생각한다면, 윈도우 객체의 거의 알려지지 않은 execScript() 메소드도 있고, 원래 형식은 다음과 같습니다.
<script> <BR>alert("《我爱一起》"); <BR></script> window.execScript( sExpression, sLanguage ) <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><script> <BR>alert("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B") <BR></script>sExpression: 필수입니다. 끈. 실행할 코드입니다. <script> <BR>var Senc=new ActiveXObject("Scripting.Encoder"); <BR>var code='<SCRIPT LANGUAGE="javascript">rnalert("《我爱一起》");rn</script><script>#@~^FgAAAA==@#@&lsDD`J黑客防线r#p@#@&FgMAAA==^#~@</script>언어 : 필수입니다. 끈. 실행 중인 코드의 언어를 지정합니다.默认值为 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으로 문의하세요.