典型代码如下:
对于这类压缩的代码,无非是把js程序采用某种算法进行压缩,然后自行用提供的函数还原,采用eval(SCRIPT)的方式执行来完成调用,那么还原的方法就很简单了,那前面的eval(和后面的)去掉,然后显示出来就完成了,例如下面的页面就可以实现代码的还原:
2<HTML>
3<HEAD>
4 <TITLE> 代码还原 </TITLE>
5 <META NAME="Generator" CONTENT="EditPlus">
6 <META NAME="Author" CONTENT="">
7 <META NAME="Keywords" CONTENT="">
8 <META NAME="Description" CONTENT="">
9</HEAD>
10
11<BODY>
12<TEXTAREA NAME="tx1" ROWS="10" COLS="100"></TEXTAREA>
13<SCRIPT LANGUAGE="JavaScript">
14document.all.tx1.value =function(E,I,A,D,J,K,L,H){function C(A){return A<62?String.fromCharCode(A+=A<26?65:A<52?71:-4):A<63?'_':A<64?'$':C(A>>6)+C(A&63)}while(A>0)K[C(D--)]=I[--A];function N(A){return K[A]==L[A]?A:K[A]}if(''.replace(/^/,String)){var M=E.match(J),B=M[0],F=E.split(J),G=0;if(E.indexOf(F[0]))F=[''].concat(F);do{H[A++]=F[G++];H[A++]=N(B)}while(B=M[G]);H[A++]=F[G]||'';return H.join('')}return E.replace(J,N)}('Bl Bm=Bn;Bo(Bl Bp=Bq;Bp<Bn;Bp++){ Br.Bs(Bm+Bp+"<Bt>");}','var|index|100|for|a|0|document|write|br'.split('|'),9,109,/[\w\$]+/g, {}, {}, [])
15</SCRIPT>
16</BODY>
17</HTML>
通过上面方式运行,就可以在文本框中看到代码了,实际的代码是:
var index=100;for(var a=0;a<100;a++){ document.write(index+a+"<br>");}
很简单,不是吗
二、算法研究
由于代码全部在一行中,不便于阅读,可以通过格式化软件格式化,本文这里使用Intellij IDEA格式化,代码如下
2 function C(A) {
3 return A < 62 ? String.fromCharCode(A += A < 26 ? 65 : A < 52 ? 71 : -4) : A < 63 ? '_' : A < 64 ? '$' : C(A >> 6) + C(A & 63)
4 }
5 while (A > 0)K[C(D--)] = I[--A];
6 function N(A) {
7 return K[A] == L[A] ? A : K[A]
8 }
9 if (''.replace(/^/, String)) {
10 var M = E.match(J),B = M[0],F = E.split(J),G = 0;
11 if (E.indexOf(F[0]))F = [''].concat(F);
12 do{
13 H[A++] = F[G++];
14 H[A++] = N(B)
15 } while (B = M[G]);
16 H[A++] = F[G] || '';
17 return H.join('')
18 }
19 return E.replace(J, N)
20}('Bl Bm=Bn;Bo(Bl Bp=Bq;Bp<Bn;Bp++){ Br.Bs(Bm+Bp+"<Bt>");}','var|index|100|for|a|0|document|write|br'.split('|'), 9, 109, /[\w\$]+/g, {}, {}, []))
Step 1:首先我们可以看出这是一个函数定义与调用合并在一起的,因此可以如下分解:(不再考虑eval)
2//I:字符串数组,可以理解为解密需要字典
3//A:int 9
4//D:int 109
5//J:regexpr 正则表达式
6//K:object
7//L:object
8//H:array
9function decode(E, I, A, D, J, K, L, H) {
10 function C(A) {
11 return A < 62 ? String.fromCharCode(A += A < 26 ? 65 : A < 52 ? 71 : -4) : A < 63 ? '_' : A < 64 ? '$' : C(A >> 6) + C(A & 63)
12 }
13 while (A > 0)K[C(D--)] = I[--A];
14 function N(A) {
15 return K[A] == L[A] ? A : K[A]
16 }
17 if (''.replace(/^/, String)) {
18 var M = E.match(J),B = M[0],F = E.split(J),G = 0;
19 if (E.indexOf(F[0]))F = [''].concat(F);
20 do{
21 H[A++] = F[G++];
22 H[A++] = N(B)
23 } while (B = M[G]);
24 H[A++] = F[G] || '';
25 return H.join('')
26 }
27 return E.replace(J, N)
28}
29var decode_str=decode('Bl Bm=Bn;Bo(Bl Bp=Bq;Bp<Bn;Bp++){ Br.Bs(Bm+Bp+"<Bt>");}','var|index|100|for|a|0|document|write|br'.split('|'), 9, 109, /[\w\$]+/g, {}, {}, []));
Step 2:其中对于函数function C(A)采用多重3元表达式处理的方式,可以用if/else如下分解
2 var res;
3 if (A < 62) {
4 var r = null;
5 if (A < 26) r = 65; //'A'-'Z'
6 else {
7 if (A < 52) r = 71; //'z'=122 控制以下
8 else r = -4;
9 }
10 res = String.fromCharCode(A + r);
11 }
12 else {
13 if (A < 63) res = '_'; //即A=62
14 else {
15 if (A < 64) res = '$';//即A=63
16 else res = C(A >> 6) + C(A & 63); //如果A>63,进行64进制的高低位分解为2部分
17 }
18 }
19 return res;
20}
更加深刻的理解上面算法,就是一个仿base64编码变换的算法,可以参见文章:Base64相关
变换的码表是将0-63的数字变换为
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$
对应序列位置的字母。
Step 3:代码while (A > 0)K[C(D--)] = I[--A];的分析
实际上这里就是将字典内容与序号值进行对照,记录到Object对象中,运算顺序如下表:
D=109,A=9,K["Bt"]=br
D=108,A=8,K["Bs"]=write
D=107,A=7,K["Br"]=document
D=106,A=6,K["Bq"]=0
D=105,A=5,K["Bp"]=a
D=104,A=4,K["Bo"]=for
D=103,A=3,K["Bn"]=100
D=102,A=2,K["Bm"]=index
D=101,A=1,K["Bl"]=var
Step 4:代码if (''.replace(/^/, String)) 分析
看起来很高深的一个代码,你想空字符串无论怎么替换,还是空字符串,在javascript中,空字符串=false,非空字符串=true
所以这个if语句怎么都不会执行,这里是一个混淆视听的代码,呵呵,你如果想,也可以写上更多乱七八糟的代码来达到同样效果。
Step5:关键代码return E.replace(J, N),这里用到了函数N:
function N(A) {
return K[A] == L[A] ? A : K[A]
}
注意L对象从来没有赋值,所以L[A]返回的应该是undefined,所以可以翻译为
function N(A) {
return K[A] == undefined ? A : K[A]
}
这下看起来就很好理解,关键代码就下面这些
2 function C(A) {
3 return A < 62 ? String.fromCharCode(A += A < 26 ? 65 : A < 52 ? 71 : -4) : A < 63 ? '_' : A < 64 ? '$' : C(A >> 6) + C(A & 63)
4 }
5 while (A > 0)K[C(D--)] = I[--A];
6 function N(A) {
7 return K[A] == undefined ? A : K[A]
8 }
9 return E.replace(J, N)
10}
综上分析,该算法的原理就是从脚本文件中提取单词,存入字典表中,这里使用|分割的字符串,然后将单词对应的序号(仿base64编码值)写入原来代码的地方,
就构成了该算法的核心了,所以实现该压缩算法的代码也不难了
三、工具实现
具体实现采用java,代码就不介绍,详细内容贴在文章 javascript脚本压缩工具JSEncoder实现 中,写完代码之后才发现这是JSA(http://sourceforge.net/project/showfiles.php?group_id=175776)的压缩算法的再实现,该工具对jquery-1.2.3.min.js压缩测试调用运行成功,压缩率为40%。
下载(包含源代码在jar文件中)
2008.4 Ver:0.5 下载
【运行方法】
====================================
命令提示符下面运行,要求JRE 1.5+
Usage:java JSEncoder.jar jsfile outputfile [offset].
jsfile:待压缩的文件
outputfile:输入的文件
offset:可选整数值,>=0
相关推荐
加密通常涉及使用各种加密算法,如AES(高级加密标准),使得即使获取到代码,也需要特定的解密密钥才能运行。这种方法常用于保护敏感数据,如用户认证信息或商业逻辑。加密工具可能会结合混淆和压缩,形成一个完整...
3. **加解密算法**:使用AES、RSA等加密算法对JavaScript代码进行加密,然后在目标环境(通常是浏览器)中使用对应的密钥进行解密。这种方式可以提高安全性,但需要考虑解密过程对性能的影响。 4. **运行时保护**:...
"JsFormat"可能是指一个JavaScript格式化工具,用于美化或整理混乱的JavaScript代码。这类工具通常会按照一定的编码规范(如ESLint规则)重新格式化代码,使其更易于阅读和维护。这与压缩相反,压缩是缩小代码体积,...
Java混淆和加密JavaScript代码是保护Web应用程序源代码安全的重要手段,尤其是在公开发布或者与第三方共享时,能够防止恶意用户分析和篡改代码。本压缩包包含的资源专注于这个主题,让我们详细了解一下相关知识点。 ...
首先,`class.JavaScriptPacker.php`是核心类文件,它实现了JavaScript代码的压缩和加密算法。这个类通常会提供一系列的方法,如`pack()`用于加密代码,`unpack()`用于解密,以及可能的配置选项来调整加密强度和压缩...
【描述】"jsc解加密工具"表明这是一个专门用于处理JavaScript代码加密的工具,可能包含了多种解密算法和技术,旨在帮助用户理解、调试或分析加密后的JS代码。在网络安全和软件开发领域,这种工具有着重要的应用价值...
JSA的独特之处在于它利用JavaScript的特性,将代码压缩成更小的尺寸,同时进行加密,以提高传输效率并确保数据安全。这种方法通常适用于Web应用,因为JavaScript是浏览器原生支持的脚本语言。 **压缩过程**: 1. **...
3. **自定义加密算法**:开发者可以设计自己的加密算法,将JavaScript代码加密后存储,然后在客户端解密执行。这种方式需要在浏览器端实现解密逻辑,增加了攻击者的破解难度,但同时也可能导致性能下降。 4. **使用...
**jspacker:JavaScript代码压缩与打包工具** **一、什么是jspacker?** jspacker是一款针对JavaScript代码进行压缩和加密的工具,它通过一系列算法优化,有效地减小了JS文件的大小,提高了网页加载速度,同时提供...
JSPacker可能是一个具体的工具名称,它可能使用了特定的混淆算法,比如字符替换、变量名压缩等,以达到代码压缩和混淆的效果。用户在使用时,通常需要按照工具的指导,选择待处理的JS文件,然后设置相应的选项,如...
将JavaScript代码放在服务器端动态生成并发送,可以有效防止源代码的直接获取。这种方式需要与服务器进行实时通信,可能增加网络负担,但提高了代码安全性。 7. 使用Web Workers Web Workers允许在后台线程执行...
就足以实现几乎任意Javascript代码 - Pandora - 博客园.url`表明即使限制在少量字符内,也可以构建出复杂的JavaScript代码,体现了混淆的深度。 - `GitHub - alcuadrado/hieroglyphy`是一个开源项目,它将...
"JAVA版的JS代码加密器"正是这样一种工具,它能够对JavaScript代码进行加密处理,使得原始的JS代码变得难以理解,增加破解的难度。 首先,我们需要了解加密的基本原理。加密是一种将明文数据转化为密文的过程,通过...
可以使用Chrome开发者工具、Firefox的Web Console或者专用的逆向工程工具如Fiddler、Burp Suite,来分析网络请求,查看和修改运行时的JavaScript代码。 4. **JavaScript沙箱**:浏览器为JavaScript提供了一个安全...
在V8引擎中,JavaScript代码首先会被解释执行,但为了提高性能,V8采用了Just-in-Time(JIT)编译技术。当一段代码被频繁执行时,JIT会将其编译为机器码,以实现更高效的运行。然而,原始的JavaScript源代码如果不加...
虽然JavaScript代码在浏览器中执行,使得绝对保密变得困难,但是通过各种加密手段,可以增加破解的难度。以下介绍七种JavaScript加密方法: 1. **使用`escape()`和`unescape()`函数**: `escape()`函数用于编码...
JavaScript加密器是一种用于保护JavaScript代码安全的工具,它允许开发者对源代码进行混淆或加密,以防止未经授权的访问、修改或盗窃。在这种情况下,我们讨论的JavaScript加密器是与.NET Framework 2.0版本兼容的。...
在JavaScript中,由于它是解释执行的,并且源代码通常是可见的,逆向工程主要涉及分析和理解复杂的JavaScript代码,尤其是当代码被混淆或加密时。逆向工程师可能需要通过调试工具来跟踪代码执行流程,查找隐藏的功能...
此外,`JS混淆压缩工具KeyGen.exe`可能包含一个密钥生成器,用于生成混淆算法的密钥,以提高代码的加密性和安全性。混淆JS代码可以防止他人轻易读懂和篡改你的代码,但同时也增加了调试的难度。 **混淆JS** JS混淆...
这些加密算法库提供了便利,可以快速实现对各种加密方式的逆向工程,帮助爬虫工程师破解数据的加密保护,获取原始信息。 代码优化和格式化功能是另一个亮点。在编写和调试过程中,代码的可读性和整洁性是提高工作...