JSCFO当前版本号2.8。实现功能如下:
1、可同时对多个文件进行操作。
2、格式化代码。
3、合并文件。
4、变量名混淆(选择变量名混淆后会随机在if、for、while、dowhile中插入混淆用的判断)。
5、流程混淆。可选择打乱流程时进行分块的行数。(由于Javascript中没有goto,所以打乱代码后用for或while配合if或switch保证代码执行顺序。for或while和if或switch的配合有一定随机性,较难被找到规律。此功能会造成代码增大,不过没有办法)
6、字符串混淆。(目前方法较简单,后期考虑用压缩替代混淆)
7、数字混淆。(用数学表达式替代常数)
8、压缩。(简单的方法,Pack2的那种)
9、格式化和混淆时自动修正结尾没有加分号的情况。
10、修改正则表达式的写法,避免所有代码在同一行时发生错误。
界面如下:

试用版中ObfuscateOptions(混淆选项)不可设置,默认使用了变量混淆、流程混淆、字符串混淆、数字混淆;流程混淆时Lines(方块的行数)默认为1,压缩也不启用。Format Only(仅格式化)和Merge(合并)选项可自由设置。
使用方法:1、用File菜单下的Add和Remove菜单项增加删除文件。2、混淆选项可以不用选择,如果需要合并多个文件则钩选Merge,如果仅需要格式化代码请钩选Format Only。3、点击Obfuscate菜单下的Go进行混淆。如果Output Folder(输出目录)中有与源文件同名的文件,则在混淆后的文件名前加“Obfuscated_”。4、双击Files(文件列表)中的项可以在新窗口中显示所选择的JS文件格式化后的代码。
混淆前的代码:
var x = 0;
var z = false;
function Test()
{
for(var i=0; i<x; i++)
{
if(z)
{
var s = "Today's date is: ";
var d = new Date();
s += (d.getMonth() + 1) + "/"; //Get month
s += d.getDate() + "/"; //Get day
s += d.getYear();
alert(i+ ":" + s);
}
}
}
x = 10;
z = true;
Test();
混淆后的代码(未压缩):
var $_A, x, z, $_E;
function Test()
{
for(var i = ((0x36 * 0x0) + 0x0); i < x; i++)
{
if(z)
{
var s, d, $_D;
$_D = 0;
for(var $_D = 5; $_D >= 0; $_D--)
{
if($_D == ((0x22 * 0x3) - 0x66))
{
alert((i + $_A("%3B")) + s);
}
if($_D == ((0x4f * 0x3) - 0xec))
{
s += d.getYear();
}
if($_D == ((0x3 * 0x3) - 0x4))
{
s = $_A("e%C3%D3%C5%DA%A0%9A%93%84%C5%D5%D9%85%89%DC%ADZ");
}
if($_D == ((0x42 * 0x7) - 0x1cc))
{
s += (d.getDate() + $_A("0"));
}
if($_D == ((0x26 * 0x2) - 0x49))
{
s += ((d.getMonth() + ((0x8 * 0x2) - 0xf)) + $_A("0"));
}
if($_D == ((0x1d * 0x7) - 0xc7))
{
d = new Date();
}
}
}
}
}
$_A = function ($_B)
{
var $_C;
$_B = unescape($_B);
$_C = String.fromCharCode($_B.charCodeAt(0) - $_B.length);
for(var i = 1; i < $_B.length; i++)
{
$_C += String.fromCharCode($_B.charCodeAt(i) - $_C.charCodeAt(i - 1));
}
return $_C;
};
$_E = 5;
while($_E > 0)
{
$_E--;
if($_E == ((0x3a * 0x7) - 0x193))
{
z = false;
}
if($_E == ((0x30 * 0x0) + 0x1))
{
z = true;
}
if($_E == ((0x0 * 0x2) + 0x0))
{
Test();
}
if($_E == ((0x1e * 0x3) - 0x56))
{
x = ((0x27 * 0x5) - 0xc3);
}
if($_E == ((0x26 * 0x2) - 0x4a))
{
x = ((0x55 * 0x1) - 0x4b);
}
}
压缩后的代码如下:
eval(function(e,d){e=e.replace(new RegExp('\\b\\w+\\b','g'), function($0){return d[$0]});return e;}('0 $1=2($3){$3=4($3);0 $5=6.7($3.8(9)-$3.10);11(0 12=13;12<$3.10;12++){$5+= 6.7($3.8(12)-$5.8(12-13));}14 $5;};0 $15,$16;2 17(){11(0 12 = (18*19-20);(12 < $15) && !(21.$22>23);12++){24($16){0 $25,$26;$25 = $1(\"27%28%29%30%31%32%33%34%35%30%36%37%38%39%40%41\");$26 = 42 43();$25 += (($26.44() + (45*18-46)) + $1(\"9\"));$25 += ($26.47() + $1(\"9\"));$25 += $26.48();49(((12 + $1(\"%50\")) + $25));}}}$15 = (51*52-53);$16 = 54;$15=(55*18-56);$16=57;17();', 'var|_A|function|_B|unescape|_C|String|fromCharCode|charCodeAt|0|length|for|i|1|return|_D|_E|Test|0x2|0x4|0x8|this|_F|2|if|_G|_H|e|C3|D3|C5|DA|A0|9A|93|84|D5|D9|85|89|DC|ADZ|new|Date|getMonth|0x4b|0x95|getDate|getYear|alert|3B|0x52|0x3|0xf6|false|0x12|0x1a|true'.split('|')));
目前的流程混淆利用while或for配合if或switch控制打乱后代码的正常执行顺序,希望有朋友能提出更好的建议。字符串的加密也让人感到头疼。
混淆后的代码较原有代码增大不少,主要原因是针对每一行代码都进行了打乱并且没有进行压缩处理。进行压缩处理之后,还是可以接受的。
后期目标如下:
1、支持包含<Script language="javascript"></script>标记的文件。(暂定为此标记)
2、用压缩算法替代现在那个简单的字符串混淆方法。
3、尝试寻找新的流程混淆方法。
4、考虑是否加入函数名混淆。(个人目前认为函数名混淆的意义不大)
5、加入混淆排除选项。
6、考察是否有更高效的压缩算法,以替代Pack2目前的方法。
PS:
之前版本有用Themida加壳,发现很多朋友用ESET,故不用Themida,已更新。请想试用的朋友放心,绝无病毒。
至于有人说我不放源码的问题,这个似乎没有规定吧。我这个还只是给大家试用,并没有说要收钱干啥的。所以对源码有意见的请自己保留吧
准备开始新版本的工作,旧版本暂停下载。
posted @ 2008-04-23 03:20
陈鹏(偶是坏人) 阅读(1995)
评论(21) 编辑 收藏 网摘 所属分类:
JavaScript代码保护