Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 373|回复: 0

[Java基础知识]Jshrink的破解过程

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 16:02:47 | 显示全部楼层 |阅读模式
    作者:舵手
    申明:如转载请保证文章的完整性
    来源:www.blogjava.net/galaxyp/
    软件下载:www.e-t.com 软件简介:
         Jshrink extracts the minimal set of java class files for an application, removes unused code and data, obfuscates symbolic names, finalizes code for optimized execution, and stores the results in a Java arcHive .jar file.   
         Jshrink typically reduces program size by 30-40%. Jshrink obfuscated code is much harder to comprehend when decompiled, a claim that can be readily verified using Jshrink"s built-in Java decompiler. What at first
    glance seems to be meaningful names in Jshrink obfuscated code are often reused system names, a Jshrink obfuscation technique called semantic recycling.

       
      


         一直没怎么用过,闲来无聊想研究下它的功能,用jshrink打开一个class文件双击提示“Missing license key, see www.e-t.com/jshrink.html to request evaluation license”,以前申请了一个试用的license key,恢复过系统,早丢了。java写的,反编译出来看看,解压jar,并反编译所有的class文件,类被混淆过,这里要注意的是,有些方法混淆后名称和类名一样,但千万不要把它当作构造函数,否则可能会带来一点麻烦。在整个源代码中查找上面的报错字符串,居然没找到。在解压后的目录里找了一下,发现I.gif挺可怀,打开一看果然是加密了的东东,并不是gif文件,在I.I.class反编译源代码中果然发现了I.gif,如下:
    InputStream inputstream = (new I()).getClass().getResourceAsStream("" + "I" + "." + "g" + "i" + "f");
         即然建立输入流读取方文件,肯定有解密过程,分析原代码后写出一个解密代码:
    import java.io.InputStream;
    public class I
    {
      static byte COWY[];
         static String append[] = new String[256];
         static int close[] = new int[256];
      public String td(int i)
         {
             int j = i & 0xff;
             if(close[j] != i)
             {
                 close[j] = i;
                 if(i < 0)
                     i &= 0xffff;
                 String s = new String(COWY, i, COWY[i - 1] & 0xff);
                 append[j] = s;
             }
       System.out.println(append[j]);
             return append[j];
         }
      public static void main(String[] args)
      {
       try
             {
                 InputStream inputstream = (new I()).getClass().getResourceAsStream("" + "I" + "." + "g" + "i" + "f");
          //这里他用"I" + "." + "g" + "i" + "f",如果我们直接查找I.gif,肯定没有结果,所以当搜索I.gif没找到时,
          //一定要试试这种方法,还有数组形式存放。
                 if(inputstream != null)
                 {
                     int i = inputstream.read() << 16 | inputstream.read() << 8 | inputstream.read();
                     COWY = new byte;
                     int j = 0;
                     byte byte0 = (byte)i;
                     byte abyte0[] = COWY;
                     while(i != 0)
                     {
                         int k = inputstream.read(abyte0, j, i);
                         if(k == -1)
                             break;
                         i -= k;
                         for(k += j; j < k; j++)
                             abyte0[j] ^= byte0;
                     }
                     inputstream.close();
                 }
             }
             catch(Exception exception) { }
       
       I i = new I();
       for (int j=0; j<7200; j++ )//为什么这个j最大值为7200,因为大概查看了一下源代码中调
       //用I.I.I()这个方法的最大值就是这个,试图加大后,抛出异常。
       {
        System.out.print(j+":");
        i.td(j);
       }
      }
    }
         当上面的循环体里j为4088时字符串是Missing license key, see www.e-t.com/
    jshrink.HTML to request evaluation license,在整个原代码是搜索4088,发现只在A.class中有,
      switch(getViewRect)
             {
             case -1:
             case 0: // ""
                 return true;
             case 1: // "01"
                 getChildCount();
                 getJarEntry(I.I.I(4088));
          //Missing license key, see www.e-t.com/jshrink.html to request evaluation license
          //I.I.I(4088)返回的串
                 return false;
             case 2: // "02"
                 getChildCount();
                 getJarEntry(I.I.I(4168));
          //Evaluation license key has expired, purchase new key at www.e-t.com/jshrink.html
          //I.I.I(4168)返回的串
                 return false;
             case 3: // "03"
                 getChildCount();
                 getJarEntry(I.I.I(4249));
          //Invalid license key
          //I.I.I(4249)返回的串
                 return false;
             case 4: // "04"
                 getJarEntry(I.I.I(4269));
          //Internal error verifying license key
          //I.I.I(4269)返回的串
                 return false;
             }
             return false;
         不想分析注册key详细算法,暴破试一下,把上面每个case子句里的代码变为 return true; 可能问题就能解决,用十六进制编辑器打开A.class,查找03AC,连续五个在一起,改为04AC,现在程序已经可以正常运行,只是还有无License的提示对话框,那么把04AC(前面已修改)前的十个四字节,如:2AB7016B2A110FF8B8056DB7003A全改为00,相当于汇编里的nop保存打包,运行就再没有提示对话框了。这样不完全暴破就已经成功,之所以说不完全是因为还有Z.class有类A.class的功能,读取I.gif文件并解密,我们并没有对A.class这个类的调用做跟踪分析,这样很有可能还有一些地方有限制而我们没有破除掉。
         没什么技术性,但能为菜鸟破JAVA程序提示一点思路。今天搜了一下,才发现这个早有人已经写出注册机了,牛人多多。不过想研究暴破的可以从下面下载本人修改过的和原版程序:
    http://www.blogjava.net/Files/galaxyp/jshrink.rar
      
       
       
         
         

          
         

          
         
       
      




    源码下载:http://file.javaxxz.com/2014/10/1/160246500.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 19:10 , Processed in 0.428025 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表