在线版JavaScript混淆器,支持变量重命名、流程混淆、压缩等功能。

地址:JavaScript eXtreme Obfuscator Online

使用说明:

在线版混淆器允许输入的JavaScript脚本最大长度为800

RenameVariable: Filter:
是否重命名变量                          重命名变量时所用的过滤器                 过滤器匹配时是重命名还是跳过不处理
RenameFunction: Filter:
是否重命名方法                          重命名方法时所用的过滤器                  过滤器匹配时是重命名还是跳过不处理
FilterType:
过滤器的类型                        Prefix:前缀匹配、Suffix:后缀匹配、RegExp:正则表达式匹配
NewNamePrefix:
重名名时新名称的前缀
RemoveWhiteSpace:
是否删除回车、空格
ObfuscateNumber:
是否混淆数字
ObfuscateString:
是否混淆字符串
JunkCodeObfuscate:
是否插入花指令进行混淆
ControlFlowObfuscate:
是否进行流程混淆:                     Random:随机选择若干行进行混淆、EachRow:逐行进行混淆
Pack:
是否打包(压缩)

 

posted @ 2010-08-28 01:23 陈鹏(偶是坏人) 阅读(279) 评论(0) 编辑

JavaScript eXtreme Obfuscator:JavaScript极限混淆器

功能:

1、格式化代码

2、根据前缀、后缀、正则表达式重命名变量,并可指定新变量名的前缀

3、根据前缀、后缀、正则表达式重命名函数,并可指定新函数名的前缀 

4、去掉换行、空白、注释

5、数字混淆

6、字符串混淆

7、花指令混淆

8、流程混淆 

9、打包(或者叫压缩) 

截图:

 

 

 

说明:

1、格式化的过程不是简单地替换,而是进行了适当的改进。如:在语句的结束添加“;”,为if、for、while等增加“{}”,将正则表达式“/....../”改为“new RegExp”的形式。

2、数字混淆是将数字替换成一个十六进制的表达式。

3、字符串混淆是将字符串简单加密后通过一个函数进行解密。

4、花指令混淆:是随机插入一些比较让人迷惑的if……else……指令,加大阅读的困难。 

5、流程混淆:用随机的循环配合if或switch,在不破坏执行顺序的情况下打乱代码的顺序,加大阅读的困难。

6、Pack:用一个简单的方法减小代码的长度,很常见。但会造成效率降低。

 

也正因为不是简单地替换,带来了新的麻烦。已知问题有:

1、某些朋友认为“{}” 比较多余,但我还是加上去了。

2、算数表达式之类的我加上了“()” ,这个到不是为了好看,而是因为我比较懒,不想去把精力花在处理运算符的优先级上。结果导致一个算数表达式可能会变成这样“1+2*3+4”=>“((1+(2*3))+4)”(MS比较恶心些,下次再改进吧)。

3、对于正则表达式,一般情况下不会出现问题。目前唯一已知的问题是JQuery中出现了“/=.../” 这种类型的正则表达式,会导致无法解析。 

 

最后, 既然是混淆,不可避免地使代码变得庞大,但并会对效率造成什么太大的影响,这就是传说中的双刃剑吧。

posted @ 2010-04-27 15:12 陈鹏(偶是坏人) 阅读(136) 评论(0) 编辑

JavaScriptFormatter:JavaScript代码格式化工具

功能:

1、格式化代码

2、重命名变量,并可指定新变量名的前缀

3、去掉换行、空白、注释

截图:

 

 

 

说明:

格式化的过程不是简单地替换,而是进行了适当的改进。如:在语句的结束添加“;”,为if、for、while等增加“{}”,将正则表达式“/....../”改为“new RegExp”的形式。

也正因为不是简单地替换,带来了新的麻烦。已知问题有:

1、某些朋友认为“{}” 比较多余,但我还是加上去了。

2、算数表达式之类的我加上了“()” ,这个到不是为了好看,而是因为我比较懒,不想去把精力花在处理运算符的优先级上。结果导致一个算数表达式可能会变成这样“1+2*3+4”=>“((1+(2*3))+4)”(MS比较恶心些,下次再改进吧)。

3、对于正则表达式,一般情况下不会出现问题。目前唯一已知的问题是JQuery中出现了“/=.../” 这种类型的正则表达式,会导致无法解析。

posted @ 2010-04-21 12:27 陈鹏(偶是坏人) 阅读(72) 评论(0) 编辑

以这篇东东主要是作为一个新的起点,开始新的计划。

 

从2008年下半年起,就没有再碰过这个东西。其实我一直想将它做好、做精,只是苦于工作生活上的压力,将它丢在了一边。

今天对我来说,可能会算是一个转折点(不知道是好是坏)。我决定重新启动这个久违了的项目。

名称改为JSXO,JavaScript极限混淆器,版本号从3.0开始。

 

一定要把之前没有完成的东西做完,并且要做好、做精。

posted @ 2010-03-16 14:42 陈鹏(偶是坏人) 阅读(170) 评论(0) 编辑

上一回说到普通属性的延迟加载,这次说下我对于联结关系的延迟加载的看法。

 

所谓联结关系,就是一对一、一对多、多对多这样的对象之间的关系。一说到这类延迟加载,就不能不想到NHibernate。通过编辑配置文件,即可实现联结关系的延迟加载。我不想进行太多的介绍,毕竟,比我研究得深入的大有人在。所以就只如主题了。

 

曾经,我也曾经考虑过用配置文件和CustomAttribute来定义联结关系,并且付诸实现。基本的xml定义方式如下:

<Relation Property="" TargetType="" RelationType="" ConditionColumn="" SlaveColumn="" JoinTable="" JoinType=”” JoinTableConditionColumn="" JoinTableSlaveColumn=""></Relation>

其中:

1、 Property是实体的属性,如果用CustomAttribute就可以省掉。

2、 TargetType是延迟加载的数据类型。

3、 RelationType是关系类型,一对多还是多对多。

4、 ConditionColumn也就是作为条件的列,主要是为了取得延迟加载的条件。从ConditionColumn对应的属性中获取值进行查询。

5、 SlaveColumn是从表的列。

6、 JoinTable是中间表。

7、 JoinType是联结的类型,比如:left joinleft outer joinfull join之类。

8、 JoinTableConditionColumn是使用中间表的时候,中间表中作为条件的列。

9、 JoinTableSlaveColumn是谁哦用中间表的时候,中间表和从表列对应的列。

SQL语句来描述就是:

1、    不使用中间表:from TargetType.Table where SlaveColumn = ConditionColumn.Value

2、    使用中间表:from TargetType.Table JoinType join JoinTable on JoinTableSlaveColumn = SlaveColumn where JoinTableConditionColumn = ConditionColumn.Value

考虑以下几种情况:

1、 不使用中间表的一对一延迟加载

2、 不使用中间表的一对多延迟加载

3、 使用中间表的一对一延迟加载

4、 使用中间表的一对多延迟加载

其中12比较容易搞定,直接根据“ConditionColumn”所对应的属性,用“SlaveColumn”作为条件列,获取TargetType所对应的表名进行查询即可。如果是一对一,则填充实体,赋值。如果是一对多,则填充实体集合,赋值。对于34使用了中间表的情况,就更麻烦些,毕竟要生成“Join”语句嘛。先用“JoinTableConditionColumn”和“ConditionColumn”所对应的属性值生成“join”之后的“where”条件。然后用“SlaveColumn”和“JoinTableSlaveColumn”生成“join 语句的“on 部分。当然也少不了根据“JoinTable”和“JoinType”的“join”语句的“join”部分。查询的结果,就如12那样同等对待了。

从上面的描述可以看出,我没有特别定义多对多关系。因为,所谓的多对多只是数据库意义上的,在使用ORM后,如果从对象的加载的角度来看,多对多其实就是一对多,只是多对多一般都会有一个中间表而已。

 

现在,开始说关键问题了。上面说的是“曾经”,这表示现在我放弃了这种做法。下面就开始说明一下“现在”。

通过配置或者“CustomAttribute”的确可以实现延迟加载自动化(至少是半自动化吧)。但是这些自动化真能带来所期望的便利吗?不使用中间表的延迟加载还好说,使用中间表你要在配置中填多少东西?稍微写错,就会出现问题,虽然在调试时我会输出异常,但是这并不能像编译时检查那样方便,而且提供的信息也不如用SQL语句时那样直观。这也是使用配置动态生成SQL的弊端,不能在第一时间检查错误,也不能在出错时给出非常明确的提示。还有一点让我也觉得很头疼,SQL语句可以直接放到查询分析器进行调试,那些配置该如何验证,虽然我们可以用代码生成器,但是小的修改直接手工怎么减少出错呢?而且,自动化的加载只能做到有限的自动化,双向的关联就比较不好处理。如果再用配置,不是更容易导致混乱。持久化的时候呢?

经过一番斗争之后,我决定从另一个角度来思考问题。我在《我的框架(11)——普通属性延迟加载》中间但描述了处理的思路,和普通属性延迟加载一样,联结关系延迟加载也简化为“Relation(KeyColumn)”。联结关系延迟加载和普通属性延迟加载稍微有些不同,普通属性延迟加载仅进行一次加载,但是联结关系延迟加载时只要“Key”发生了变化,就会导致重新加载。框架仅负责在Key改变后,在需要加载时将必要的信息提供给使用者,并对延迟加载属性赋值。使用者则根据框架提供的信息自己负责数据的加载。这样一来,就避免了复杂的配置,也可以让使用者用自己最擅长的方式根据框架提供的“Key”加载数据。更进一步,因为数据的加载方式是由使用者自己定义的,当异常出现时,使用者可以很容易根据异常所包含的信息来排除错误。
posted @ 2009-12-28 08:40 陈鹏(偶是坏人) 阅读(1855) 评论(0) 编辑
摘要: 普通属性的延迟加载,实现这个东西也是一个比较麻烦的事情。不过应用的场合确实很多,最容易想到的就是包含BLOB字段的实体。如果不论是否使用,都一次性加载,性能肯定下降不少。虽然也能考虑把这种BLOB字段放到另一个表中,但又觉得如果要求使用者接受这样的硬性规定,别说别人了,就算我自己也觉得麻烦。 首先来思考一下普通属性的延迟加载需要什么东西:1、哪个属性。2、加载的条件是什么。要标记是哪个属性需要做延...阅读全文
posted @ 2009-12-16 11:09 陈鹏(偶是坏人) 阅读(1878) 评论(10) 编辑
摘要: 上一篇《我的框架(9)——关于默认值》中说到关于默认值的想法,得到了一些有意思的反馈。我一直很纳闷,为什么只有在自动生成的SQL语句中支持默认值,才是自动化呢?既然是程序员,既然有OO,还有代码生成器,为什么不自己动手,把该做的事情做掉呢?不过既然有人提出这个问题,我也还是来说明一下实现的方式(虽然我不想在自己的框架里实现)。 对于这个问题,必须从两个方面考虑:1、像我这样...阅读全文
posted @ 2009-11-26 14:21 陈鹏(偶是坏人) 阅读(1368) 评论(2) 编辑
摘要: 说句实话,我根本没考虑去实现对默认值的支持。因为我觉得,既然用实体嘛,都面向对象了,完全可以写个虚函数public virtual void InitDefaultValue()来完成这个事情。可能会有人觉得麻烦。但不可否认,无论从效率还是代码量上来说,这个做法最优,还有编译时检查。编译一下,该有的错误提示都有了。当然还有一种啦。直接给属性对应的字段设个初始值(更省事的样子O)。 要让实体用其他方...阅读全文
posted @ 2009-11-23 15:12 陈鹏(偶是坏人) 阅读(1185) 评论(13) 编辑
摘要: n级撤消,我给它的定义很简单。当用户对数据进行修改时,能将各个阶段的数据都保存下来。当有需要的时候,能快速地回溯(单向)就可以了。并不需要像文本编辑器那样,既能undo又能redo。虽然要做到这个也不是很难,但不想在内存中存放过多的数据,所以撤消后就顺便把这个阶段的数据删除了。这也比较符合实际情况吧,回溯一般出现在发生错误的时候,但undo之后却并不需要redo。 之前的《我的框架(3)̵...阅读全文
posted @ 2009-11-17 15:11 陈鹏(偶是坏人) 阅读(1422) 评论(2) 编辑
摘要: 在一开始就提到了与数据源无关的问题。当时只是从泛化的角度出发,利用ADO.net的DbProviderFactory根据不同的数据提供程序的名称来实现一个与数据库无关的数据访问基类。但仅仅做到这一步还不能实现真正意义上的与数据源无关。 在程序的开发过程中,如果不考虑使用DbParameter的情况,绝大部分应用都可以用Transact-SQL来搞定,而不需要用到与具体数据源相关的特性。但是,现实总...阅读全文
posted @ 2009-10-30 09:11 陈鹏(偶是坏人) 阅读(2093) 评论(15) 编辑