Allatori Glassfish 代码混淆采坑

1、framework 版本

  • Glassfish 3.1.2
  • Allatori 6.8
  • Jersey 1.18.1

2、遇到的问题

2.1 class 重名

在使用Glassfish 3.1.2版本混淆的时候,Class 重名(不区分大小写),Ab , ab 两个类,EJB 在加载的时候会报错。应该是Glassfish 自身的问题。
设置:

1
<property name="classes-naming" value="abc"/>

全部使用小写命名CLass名称。

2.2 Jersey

CLass 中存在重名的方法,Jersey 会报错,应该也是Jersey的Bug,方法本身是没有问题的。

1
Producing media type conflict. The resource methods

配置:

1
<property name="methods-naming" value="unique"/>

保证方法名不重复。

2.3 @WebService

如果使用了 javax.jws.WebService 发布 JAX-WS Webservice 服务,一定要指定 Service的名称
@WebService(serviceName=”MyService”)
否则会出现以下的异常:

1
Caused by: java.lang.IllegalArgumentException: Servlet [r] and Servlet [com.apptalking.ee.controller.ui.services.eum.common.r] have the same url pattern: [/rService]

@WebService 默认会发布 public 方法(非static 非final),所有 public 方法应该不要混淆,但是class的名称是可以混淆的。

2.4 接口字符串加密

Allatori 会在类中生成一个方法用于字符串的解密,但是如果这个字符串是在 Interface中, Allatori 会在其他的类中添加一个静态的解密方法,Interface 调用这个方法解密。Class 中 cinit(静态块和属性的初始化)也是和上述方式一致 。Allatori 这时候选择的类是随机的,有可能会添加在自己不想出现的位置上。Allatori 应该可以指定位置最好。(需要升级到 6.9 版本)
使用自定义加密方法

1
2
3
 <property name="string-encryption-type"
value="custom(EncryptClassName1.encryptMethodName1, DecryptClassName1.decryptMethodName1)"
apply2class="class com.some.package.*"/>

Allatori 在加密的环节会使用到加密的方法,在运行时候是不需要加密的方法的,所有加密方法可以单独放到一个jar中。

2.5 EJB 加密

EJB 组件服务发布的名称默认会私有Bean的 不带包名的 Class 名称,需要保证 EJB Bean Class名称不重复。

1
<property name="classes-naming" value="unique"/>

EJB注解上使用了BeanName , 对应的Bean上也要加上name , Class 混淆后名称发生变化,会找不到组件

1
2
3
4
5
6
@EJB(beanName="TestBean")
private ISchedulerTimerTask test;

@Stateless(name="TestBean")
@Local({ISchedulerTimerTask.class})
public class TestBean extends AScheduleTimerTask