lion

我一直以为悲伤是一种美丽,一种壮丽,这世界让我如此失望,我经不起这风吹雨打的折磨,我寻找的是悲惨的结局,我追寻的是哭里的笑声,默默地完成生命的剩余……如果有来生,我不会选择以悲伤为开始,我会选择以美丽为结局......
随笔 - 30, 文章 - 9, 评论 - 553, 引用 - 7
数据加载中……

如何解析被压缩过的Js文件?eval(function(p,a,c,k,e,d){.....,{}))

随着ajax的流行,大家一下子明白过来,原来js能够完成这么强大的功能,然后就是JS代码原来越复杂,js文件体积越来越大,同样也增加了安全隐患。

现在网上比较普遍的流行一些代码混淆和代码压缩工具:

JSConfusion    代码混淆工具,本人做的Big Smile

Javascript compressor  代码压缩工具,提供了一种特有的压缩算法对JS的代码进行减肥,也是我看到较早的一个工具,现在经常和JSConfusion结合去使用(当然是先混淆后压缩)

JSObfuscator  集混淆/压缩一体的工具,虽然功能比较多,但在压缩的时候效果不是很好,经过我测试会有时压缩过的代码不能运行

这些是见过的比较好的几个工具,如果你还见过哪些不错功能类似的工具,可以在后面补充~~~~ 

大家应该都知道这样一个理论:加密可以反加密,而混淆却无法反混淆.

混 淆也可以叫颠倒是非、混淆黑白,无非就是去掉缩进、空格、空行和注释,改表代码中的非保留字为简单的字母、符号、乱码什么的,这样做只是为了加大代码的阅 读难度,提高阅读成本,所以反混淆只有根据你对JS的了解程度去进行变量/方法/属性/类的替换。当然代码少你到是可以这样做,如果代码很多(可以看这个 混淆后的项目),你就会知道什么叫 "生气、愤怒、疯狂、哭笑不得"

上面为基础知识,下面进行正题:

alert("Welcome idoall.org");

被压缩过以后是下面的样子:

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[ c]=k[ c]||c;k=[function(e){return d[  e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[ c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[ c]);return p}('3("2 1.0");',4,4,'org|idoall|Welcome|alert'.split('|'),0,{}))

那么我们如何从压缩过的代码中提取出原文?

不管她会压缩混淆成什么样子,最终都是要被浏览器认可,解析,执行的。我们可以跟踪代码的运行,会发现最关键的位置在这里.....p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),kCoffee);return p

这里的变量 p 就是用来保存最终后的代码,我们可以在返回 p 的前面将值输出,就会得到alert("Welcome idoall.org");

本文的目的是回答一位网友的问题,顺便提供相关的思路,有助于大家的思考

posted on 2007-09-12 18:41 Lion 阅读(3063) 评论(10)  编辑 收藏 所属分类: Javascript

评论

#1楼    回复  引用  查看    

其实还有很多种做法,比如应用 Javascript 的特性输出函数实际代码 :)
还有,修改 Eval 很危险,很多别的程序会先报废掉。
2007-09-12 19:03 | 随风流月      

#2楼    回复  引用  查看    

如果我只是引用一下某个函数,直接拿MSScriptControl就搞定了,不会去读JS代码的
2007-09-13 09:39 | Clark Zheng      

#3楼    回复  引用  查看    

混淆加密js太麻烦. 至今都没有什么很好的方案.象我做的eform自定义web表单工具中就有多年写的大量的js.只能是简单做做混淆算了.
2007-09-13 09:47 | web报表      

#4楼    回复  引用    

这个东西不叫压缩吧,膨胀还差不多。

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[ c]=k[ c]||c;k=[function(e){return d[ e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[ c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[ c]);return p}('3("2 1.0");',4,4,'org|idoall|Welcome|alert'.split('|'),0,{}))
2007-09-13 10:16 | 阿所担负 [未注册用户]

#5楼    回复  引用    

以为你要讲什么,满心期待什么都没看到。
2007-09-13 10:17 | 阿所担负 [未注册用户]

#6楼 [楼主]   回复  引用  查看    

@阿所担负
代码量少是看不出来的,你可以试试拿多一些的代码到Javascript compressor试试效果,Javascript compressor可以显示压缩后的比率,如果你只是使用一个alert也用不着压缩加密什么的,对吗?


@Clark Zheng
如果直接引用函数,在FirFox下使用FireBug也可以看到声明的对象,然后在页面中直接使用

@web报表
万事都没有绝对了,在本文中已经说明,加密和混淆的原理无非是想增加别人阅读代码的成本,让你觉得成本过高时而放弃去阅读原代码

@随风流月
你说的Eval,在我看来并不应该被归档在这一类
2007-09-13 10:50 | Lion      

#7楼    回复  引用  查看    

谢谢:)

我看到的病毒的代码 中间有好多拷贝不出来的字符。形式如f    u   n  c  t  i  o  n

空格中的字符好像是不可显示的asc码字符 看到的是 一些‘口口口口口’。

用ultraEdit 直接打开看到的是二进制的,转化成asc,那些字符是乱码的形式,这种混淆方式是不是最后执行的时候也用了 replace 替换掉了呢?

不知道有没有replace的那段正则实现了替换’口口‘的功能。回去找找看研究一下:)


2008-应届生-校园招聘信息博客

2007-09-13 11:15 | 黑月      

#8楼 [楼主]   回复  引用  查看    

@黑月

f([\S\s].+?)u([\S\s].+?)n......
2007-09-13 11:19 | Lion      

#9楼    回复  引用    

js本来就很强大,跟ajax流行没有什么必然的联系

ajax就是炒概念而已,个人认为用隐藏iframe请求的方式更好一些
2007-11-12 01:43 | na-na [未注册用户]

#10楼    回复  引用    

#9楼说的很对, 我一直都是用iframe的,从不用什么ajax
2008-06-25 21:19 | ddd [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交