百度首页 | 百度空间
 
查看文章
 
JavaScript加密解密原理详解
2007-05-05 19:28

VBS,VBScript代码写久了,回到JavaScript有点不习惯了……文章开始前先附上“网页加解密”很全的工具,可以到我网盘下载http://ycosxhack.ys168.com/,“黑客工具”目录,文件名为“网页加解密.rar”。

要继续看下面的文字首先记住两个原理:

原理1:无论源码被如何加密,被如何限制,最终都将还原成浏览器可以识别的HTML代码。
原理2:解铃还须系铃人。

一、要解密一个网页我们必须先拿到这个网页的源码,如何拿?“右键-->查看源文件”或“菜单栏-->查看-->源文件”?有时候不会这么简单的,干脆将这个页面flashget下载不就行了?别这么麻烦!利用原理1,所以构造下面这段代码:

javascript:x=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=x;

在要查看源码的网页的浏览器地址中输入上面这段代码,回车就可以看到源码了!

二、源码拿到了,我们要开始解密……别怕,我给你分析解密原理,你就会信息十足了……还是那句话:无论源码被如何加密,被如何限制,最终都将还原成浏览器可以识别的HTML代码。这是最重要的原理!其次,解铃还须系铃人!解密就从JavaScript自带的函数下手!

先看一段加密后的代码:

<SCRIPT LANGUAGE="JavaScript">
eval("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\u4f59\u5f26\u51fd\u6570\x22\x29")
</SCRIPT>

将这段代码保存为test.htm,运行这段代码后,页面出现“余弦函数”四个字。可是这四个字是如何出现的?想知道答案就必须解密!如何解密?可以用专门的工具。不过这里我们就用JavaScipt自带的函数来进行解密吧。而且效果非常的好!屡试不爽。给你四个解密方法:

a、将eval改为alert(通用)
b、将eval改为document.write(<>这之内的无法解密出来)
c、document.getElementById大法!(似乎仅对\转义符加密的有效,没深入实验)
d、object.toString()大法!(这个方法可以解密JScript.Encode加密的字符串)

这四个方法在JavaScript中是常用的,在解密方面各有各的好处。a、b两个方法都很简单,而“document.getElementById大法”与“object.toString()大法”最后说^^。先来看看上面被加密的代码为什么能运行?是不是所以被乱七八糟加密之后的代码都可以运行?当然不是这样,加密之后的代码是有一定规律的!且必须符合一些规矩,否则就无法被浏览器翻译解释了!

上面被加密的代码能够运行是托了eval函数的福,有时候也可以用document对象的方法来代替eval。还记得解密方法b吗?document.write无法将<>之内的字符串呈现在我们面前!因为<>之内的字符串被浏览器当作正常标签解释了,所以我们看不到<>之内的字符串。根据这个原理被加密的代码可以通过document.write而被浏览器解释。为了形象的说明,我将上面代码eval("")中的字符串前面添加\x3c(加密后的<),后面添加\x3e(加密后的>)。得到下面的代码:

<SCRIPT LANGUAGE="JavaScript">
eval("\x3c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\u4f59\u5f26\u51fd\u6570\x22\x29\x3e")
</SCRIPT>

这时将eval换成document.write就不行了!因为这段被加密的代码存在<>之内!被浏览器解释后,我们是看不到的!这种解密方法失败,而浏览器却成功解释<>之内的代码。所以,document.write也可以执行加密后的代码,以便浏览器可以解释。当然document.writeline(表示一行一行地写)也可以了。我不细说了……

三、document.getElementById大法:

虽然有局限性,不过这个方法如能解密成功,将是非常的方便,因为我们知道alert方法是以弹出窗口的方式解密出代码的!这样解密出的代码我们就无法复制下来了……而document.getElementById大法将可以办到这一点。不解释原理了,直接看下面的代码:

<TEXTAREA id=xx rows=30 cols=90></TEXTAREA>
<script language="javascript">
document.getElementById("xx").innerText="\x3c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\u4f59\u5f26\u51fd\u6570\x22\x29\x3e"
</script>

将要解密的字符复制到innerText=""中,保存此代码为jiemi.htm。运行后就可以看到解密后的代码了……上面代码解密"\x3c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\u4f59\u5f26\u51fd\u6570\x22\x29\x3e"为:<document.write("余弦函数")>。

四、object.toString()大法:

“alert("余弦函数")”通过JScript.Encode加密后为:#@~^FgAAAA==@#@&ls DD`J余弦函数r#p@#@&FgMAAA==^#~@,直接看解密代码:

<SCRIPT LANGUAGE="JScript.Encode">
function decode(){
#@~^FgAAAA==@#@
&ls DD`J余弦函数r#p@#@&FgMAAA==^#~@
}
alert(decode.toString());
</SCRIPT>

和document.getElementById大法一样,将要解密的字符复制到decode(){}函数中,保存此代码为jiemi1.htm。运行后就可以看到解密后的代码。识别字符串是否是通过JScript.Encode解密的,可以搜索字符串“JScript.Encode”与“execScript”,只要有满足的,就可以判断了……

这所有的一切都是依据文章开头提出的两大原理的。必须注意这4个方法并不能解密所有加密的字符串(这简直是废话- -)!以后你碰到被加密的网马就不用怕了。通过上面两个原理与四个方法,必要时再结合专门的工具就可以轻易解密出你想要的字符串。其他方法我还不知道,希望大家继续补充。


类别:Script Attack | 添加到搜藏 | 浏览() | 评论 (19)
 
最近读者:
 
网友评论:
1
2007-05-05 21:12
拜山贴
 
2
2007-05-05 22:15
基本看懂,唉,我还要加强学习呀
 
3
2007-05-05 23:40
好东西!转我BLOG!
 
4
2007-05-06 00:01
还有一个经验大法.上面那些是16进制ASCII码.直接手动转换了
 
5
2007-05-06 00:49
恩,进制转换。要是谁能看着16进制就知道其对应的其他进制值或知道起解密结果,那就太厉害了。呵呵。
 
6
2007-05-06 02:05
支持哦~~!
 
7
2007-05-06 13:02
我现在一般直接用Javascript Shell(http://www.squarefree.com/bookmarklets/webdevel.html;下载地址:http://www.squarefree.com/bookmarklets/importall.html)这个东西来解密网页源代码,但是里面的解密JS我一个都看不懂........
 
8
2007-05-06 13:08
恩,不过我打不开你提供的页面。
 
9
2007-05-06 18:31
好东西
 
10
2007-05-06 22:06
回ycosxhack:要用代理服务器......
 
11
2007-05-06 22:22
好文: )
2个原理总结的好
 
12
2007-06-18 14:44
基本米有看懂 鉴定完毕
 
13
2007-11-12 13:36
提个问题 关于javascript解密
内容太长所以放到这里了 http://slht.net/2007.11.12.txt
 
14
2007-11-29 16:47
查看网页源码偶用这个:

view-source:http://hi.baidu.com/ycosxhack/blog/item/77928135043a058aa71e120a.html
 
15
2007-11-29 17:42
还是这个要好:javascript:x=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=x; 。

view-source:有局限性。
 
16
2007-11-29 17:48
哦,收藏之.
 
17
2008-01-10 22:24
16进制的64的10进制6*16+4=100,d
16进制的6F的10进制6*16+15=111,o
......
可以写个函数,按'\'截子串,再把每个子串非“a”、“b”、“c”、“d”、“e”、“f”,的与16进制数无关的前面字符去掉,比如“u4f59”的“u”,之后就可以把每个子串里的16进制转10进制了。
 
18
2008-03-10 17:06
厉害啊,看都看不懂。
 
19
2008-04-12 21:41
第4种方法有问题,测试没有用?加密代码写错了?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu