彩神ll官网

  • <tr id='UeWXWj'><strong id='UeWXWj'></strong><small id='UeWXWj'></small><button id='UeWXWj'></button><li id='UeWXWj'><noscript id='UeWXWj'><big id='UeWXWj'></big><dt id='UeWXWj'></dt></noscript></li></tr><ol id='UeWXWj'><option id='UeWXWj'><table id='UeWXWj'><blockquote id='UeWXWj'><tbody id='UeWXWj'></tbody></blockquote></table></option></ol><u id='UeWXWj'></u><kbd id='UeWXWj'><kbd id='UeWXWj'></kbd></kbd>

    <code id='UeWXWj'><strong id='UeWXWj'></strong></code>

    <fieldset id='UeWXWj'></fieldset>
          <span id='UeWXWj'></span>

              <ins id='UeWXWj'></ins>
              <acronym id='UeWXWj'><em id='UeWXWj'></em><td id='UeWXWj'><div id='UeWXWj'></div></td></acronym><address id='UeWXWj'><big id='UeWXWj'><big id='UeWXWj'></big><legend id='UeWXWj'></legend></big></address>

              <i id='UeWXWj'><div id='UeWXWj'><ins id='UeWXWj'></ins></div></i>
              <i id='UeWXWj'></i>
            1. <dl id='UeWXWj'></dl>
              1. <blockquote id='UeWXWj'><q id='UeWXWj'><noscript id='UeWXWj'></noscript><dt id='UeWXWj'></dt></q></blockquote><noframes id='UeWXWj'><i id='UeWXWj'></i>

                本文版◥权归兆鑫软件所有,原创未经许可禁止转载!
                本文仅作学习交流目的,提倡▂软件正版,反对盗版!


                工欲善其事必先利其器

                做事要先掌握大局

                1. 将已签名包转化为未签名包;
                2. 定位关键代码位置;
                3. 修改class文∩件字节码;
                4. 替换class文件重新打包;

                不行动总也不能成功

                1.将已签名包转化为未签名包

                如果你用到@ 的Jar文件使用了签名,它会保证里面的每个class文件不能被修改,所以即使你成功修改了class文件中的◆字节码,得到的Jar也是无法运行的。这些经过签名的Jar包的META-INF文件夹中一般包含了*.SF和相应的*.RSA文件。这些文件记录Jar包中每个文件的签名信息,以∮保证代码不被篡改。

                使用下面的方法可以重新生成一个未签名Jar包。参考自stackoverflow作者Houtman的回答

                // 使用JDK编译代码
                javac JarUnsigner.java
                
                // 执行JarUnsigner,如果是同一个文件夹
                java -cp . JarUnsigner <inJar> <outJar>
                

                附上源代码,免得回答被删

                // JarUnsigner.java
                import java.io.BufferedReader;
                import java.io.File;
                import java.io.FileOutputStream;
                import java.io.IOException;
                import java.io.InputStream;
                import java.io.InputStreamReader;
                import java.util.Enumeration;
                import java.util.zip.ZipEntry;
                import java.util.zip.ZipFile;
                import java.util.zip.ZipOutputStream;
                
                public class JarUnsigner {
                
                  private static final String MANIFEST = "META-INF/MANIFEST.MF";
                
                  public static void main(String[] args){
                
                    if (args.length!=2){
                      System.out.println("Arguments: <infile.jar> <outfile.jar>");
                      System.exit(1);
                    }
                    String infile = args[0];
                    String outfile = args[1];
                    if ((new File(outfile)).exists()){
                      System.out.println("Output file already exists:" + outfile);
                      System.exit(1);
                    }
                    try{
                      ZipFile zipFile = new ZipFile(infile);
                      final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outfile));
                      for (Enumeration e = zipFile.entries(); e.hasMoreElements();) {
                        ZipEntry entryIn = (ZipEntry) e.nextElement();
                
                        if (! exclude_file( entryIn.getName() ) ) {
                
                          /* copy the entry as-is */
                          zos.putNextEntry( new ZipEntry( entryIn.getName() ));
                          InputStream is = zipFile.getInputStream(entryIn);
                          byte[] buf = new byte[1024];
                          int len;
                          while ((len = (is.read(buf))) > 0) {
                            zos.write(buf, 0, len);
                          }
                          zos.closeEntry();
                
                        } else {
                
                          if (MANIFEST.equals(entryIn.getName())){
                            /* if MANIFEST, adjust the entry */
                            zos.putNextEntry(new ZipEntry(MANIFEST));
                
                            // manifest entries until first empty line. i.e. the 'MainAttributes' section
                            // (this method is used so to keep the formatting exactly the same)
                            InputStream mIS = zipFile.getInputStream(entryIn);
                            BufferedReader in = new BufferedReader(new InputStreamReader(mIS));
                            String line = in.readLine();
                            byte[] mNL = "\n".getBytes("UTF-8");
                            while( line != null && !line.trim().isEmpty() ) {
                              zos.write( line.getBytes("UTF-8"));
                              zos.write( mNL );
                              line = in.readLine();
                            }
                            zos.write( mNL );
                            zos.closeEntry();
                
                          }else{
                            /* else: Leave out the Signature files */
                          }
                
                        }
                
                      }
                      zos.close();
                      System.out.println("Successfully unsigned " + outfile);
                
                    }catch(IOException ex){
                      System.err.println("Error for file: " + infile);
                      ex.printStackTrace();
                      System.exit(1);
                    }
                  }
                
                  /**
                   * Exclude .SF signature file
                   * Exclude .RSA and DSA (signed version of .SF file) 
                   * Exclude SIG-  files  (unknown sign types for signed .SF file)
                   * Exclude Manifest file
                   * @param filename
                   * @return 
                   */
                  public static boolean exclude_file(String filename){
                    return filename.equals("META-INF/MANIFEST.MF") ||
                           filename.startsWith("META-INF/SIG-") || 
                           filename.startsWith("META-INF/") && ( filename.endsWith(".SF") || filename.endsWith(".RSA") || filename.endsWith(".DSA") );
                  }
                
                }
                


                2. 定¤位代码关键位置▃

                举一个需要输入序列号才能试用的库文件的例子,但是为了▲保护Jar包作者权益,对包名进行打码了。通过Jar包的说明书,可以知道如何使用它,就知道是什么地方输入序列号啦,要不然是个正常人也没法用对吧。例如

                // 文档说这样子可以验证序列号
                authentication.User("333");
                authentication.Serial("94306-56191-128286-2967422");
                

                rock & roll

                1. 使用JD反编译Jar包,然后Save All Sources,具体步骤这里省略;
                2. 从IDEA新建▓一个工程,把反编译的Ψ源代码放到源目录,Jar包可能是经过混淆过的,不过这个关系不大,我们字节码都能改,还怕看不懂混淆↘?继续往下走
                3. 右击authentication这个类文件,选择Find Usages,快捷键一般是Ctrl+G,看到有个叫做p.java的文件用到,做了一些判卐断操作Blabla,看屏◣幕截图1:
                4. 点开这个p.java类搜索到◣的地方,可以看到,它在比较一个返回结果,然后给出不同的错误提示,这个↑结果是由一个t.a(三个参数)的方法计算得到,并且看得出来当ζ计算结果的a属性值为0时就是Licence OK!,看屏幕截图2:
                5. 好,我们再来看t.java这个文件的a方法又有什么东东(按住Ctrl键,鼠标点击那个t.a),我们只要保证他得到的结卐果的a属性等于0就好了,可以看到只有一种情况下a属性才会等于0,其他时候都是等于-1的,到这一步IDEA的使命就完成了,看屏幕截图3:

                结果

                通过上面5步(取决于不同的包,不一定都是5步),我们知道了需要改动t类里面的a方法,让它里面操作属性a时,值为-1的都改为0就能成功。

                3. 修改class文件字节码

                接下来就要使用dirtyJOE软件来定位并修改字节码了,作者也』试过Class Editor, Java Bytecode Editor都因年久失修,没改成功。通过查阅JVM文档我们知道给整数赋值有几种指令,这里就说两种:

                • iconst_<i> i可以为 m1,0,1,2,3,4,5,分★别设置的值为-1,0,1,2,3,4,5,指令16进制字节码分别是02设置-1,03设置0,04设置1,以此类推
                • bipush <i> i范围可以是0-255,指令16进制字节码是10,比如代码里面有的21就是bipush 21,16字①节码表示为10 15

                let's go

                1. 使用dirtyJOE打开t.class文件,切换到 Methods 页上,如下图所示:

                2. 双击我们需要修改的方法(同名时通过比对方法签名来区分),进入编辑界面,图中的两个指令的组合◆就是将值-1赋值给t$a.a属性,双击图中♂的iconst_ml,字节码是02,改为03,然后回车即可,可以使用Ctrl+F查找多处进行修改:

                3. 关闭编辑窗口,保存修改。

                warning

                要保证字节码的数量不增多,也不减少,因为类和类之▂间代码调用跟字节位置关系密切。不然会卐导致修改的class文件无法使用。原来一行是1个字节的,继续用1个字节,2个的就继续两个,3个的继续保持三个。

                4. 替换class文件重新打包

                这是最简单的一步◥,将修改好的class文件,使用zip压缩工具替换掉即可。如果是你Windows用户不推荐使用WinRaR,可以将jar文件(第一步生成的未签名♀包)重命名为zip文件,然后选择用◆Windows资源管理器打开,将修改的class文件复制粘贴进去。


                内容采集自互联网,若侵权ω 请联系站长删帖