现在有一个j2ee的web应用,在启动的时候会有个验证类读取本地磁盘存放的一个license并判断使用该应用是否合法,类似于注册码一样的机制,为了弄清楚他的原理,我反编译了核心jar包的class文件获取到了代码,通过分析我知道它将license信息读取到一个名为License类的list变量中,License类的职责很单一:class License{
 public static List info=new ArrayList();//某验证类调用License时,类加载器加载该类并实例化info变量供某验证类调用}原理初步为当验证类准备验证license时,通过License.info方式取得该list,然后读取本地的license,将验证信息存放到list中作为一个静态变量一直存在。如果注册码不对或者其他原因,则直接system,exit
于是我开始调试,准备将该验证类找到。
在License类中设置断点并启动应用,发现的确经过了该处,但是让我不理解的是在调试的时候发现调用License类的验证类名为ClassAuth,该类完整的路径为com.comp.auth.ClassAuth,我找遍了整个工程以及所有的代码都没有发现该类的踪影?我确定它不在我我应用下面,在myeclipse的debug窗口中显示的调用栈信息,的确是名为ClassAuth的类调用的,但是就是没有该类的踪影,在com.comp.auth路径下也没有该类。请问各位牛人,这是怎么回事?java有隐藏类的技术吗?我该去哪里找到ClassAuth类呢?这个类是验证注册码的,肯定受到了很好的保护,请各位指点!可以继续追加分数

解决方案 »

  1.   

    我觉得应该是你没找到,也有可能在其它jar包中
      

  2.   

    不会在其他jar包中的,我ctrl+h全局搜索该类没有搜到,而且ctrl+alt+t也没有找到该类,该路径下就没有该类,但是在debug的时候显示该类的实例为com.comp.auth.ClassAuth@5ef56ef等信息,后面是hashCode因此我断想是否是隐藏了该类,或者是动态生成该类?有无这方面的技术?
      

  3.   

    猜测是采用了动态的类加载技术,比如将java文件编译成class文件,然后将class文件读到byte[]中进行加密,生成加密的字符串,要使用该类的时候,逆向翻译改字符串,将class文件加载,然后revoke相关方法
    这是一种典型的类隐藏技术
      

  4.   


    楼上正解,太强大了,的确是这样的,通过艰难的寻找,终于明白了,作者为了版权保护,真是煞费苦心。
    将验证类进行编译,将class文件二进制读取之后再64位加密成为字符串,然后写到java文件中,将该字符串解密然后再翻译成class文件,使用自定义的类加载器进行加载........
    真是煞费苦心,找到这个机制纯粹是偶然。
    学习了
      

  5.   


    楼上正解,太强大了,的确是这样的,通过艰难的寻找,终于明白了,作者为了版权保护,真是煞费苦心。
    将验证类进行编译,将class文件二进制读取之后再64位加密成为字符串,然后写到java文件中,将该字符串解密然后再翻译成class文件,使用自定义的类加载器进行加载........
    真是煞费苦心,找到这个机制纯粹是偶然。
    学习了