Kali-J 发表于 2016-9-18 03:17

Android分析神器Jeb2最新版破解

本帖最后由 Kali-J 于 2016-9-18 13:05 编辑

参考了F8大神的思路,但是等到真正动手,逆向分析写代码的时候才发现知道怎么做和真正做起来还是蛮大距离的

分析的思路我就不说了……太麻烦了……看代码吧……真的有兴趣的可以留言
和吾爱的朋友们讨论之后发现上传的附件有些问题,打包有错,我会更新附件并上传,朋友们也可以用我贴出来代码编译运行。同时发现因为我们在没有购买full版本的时候只能下到demo版本,这两个版本的代码是不一样的,所以即使激活了也只是一个使用期限很长的demo版本。还是在论坛下载流出的full版本吧,给各位朋友带来困扰了

先贴上代码
Decrypt.java
import com.sun.xml.internal.ws.server.AbstractWebServiceContext;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import java.util.concurrent.SynchronousQueue;

public class Decrypt{

    //public static final String str = "Copyright (c) 1993, 2015, Oracle and/or its affiliates. All rights reserved. ";

    public static void main(String[] args) {
      long IP = BX.IP();
      int beforez=(((int)(IP >> 32))) - 28363537 + 1432778632 & 2147483647;
      long beforezint = beforez ;
      beforezint = beforezint << 32;
      beforezint = ((int)(((int)BX.IP())+ 1460952406)) + beforezint;
      int time = ((int)(System.currentTimeMillis() / 1000));
      time = (time + 300000000 - 3456000)^1450416845;
      int check=0;
      for (int i = time;i > 0 ; i >>= 4){
            check += i & 15;
      }
      check = check % 10;
      System.out.print(String.valueOf(beforezint)+"Z"+String.valueOf(time)+String.valueOf(check));
    }

}

BX.java
import java.io.*;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import java.security.MessageDigest;
import java.nio.*;

public final class BX {
private static long[] GS = null;
private static String osName = null;
private static final long LK = 121820464987384338L;
private static String userName;

      static {// static修饰的代码块为静态代码块,该类被加载时就会执行该代码块
            int v0 = 2;
            osName = System.getProperty(Decode.decode(new byte[]{44, 28, 94, 23, 19, 4, 2}, v0, 129), "");
            userName = System.getProperty(Decode.decode(new byte[]{54, 28, 21, 11, 92, 7, 6, 5, 17}, v0, 73), "Lambda");
            if(!osName.startsWith(Decode.decode(new byte[]{-123, 62, 7, 10, 11, 24, 4}, 1, 210))) {
                v0 = 1;
            }

            GS = new long;
            for(v0 = 0; v0 < GS.length; ++v0) {
                GS = -1;
            }
      }

    public BX() {
      super();
    }



    private static long IP(int arg7) {
      long result=0;
      int v1;
      int v6 = 3;
      int v5 = 2;
      String v0 = null;

      if(arg7==0){
            v1 = 23;
            try {
                v0 = BX.IP(Decode.decode(new byte[]{52, 2, 25, 26, 82, 10, 20, 24, 6, 79, 76, 22, 74,
                        84, 17, 94, 92, 71, 12, 85, 71, 89, 85}, 2, 65), Decode.decode(new byte[]{40,
                        0, 28, 13}, 1, 125)) + "__" + BX.ry();
            }
            catch(Exception v1_1) {
            }

            if(v0 == null) {
                v0 = Decode.decode(new byte[]{15, 14, 29, 27, 22, 8, 43, 9, 25, 66, 76, 2}, v5, 107) + "__" +
                        BX.userName;
            }


            try {
                MessageDigest v1_2 = MessageDigest.getInstance("MD5");
                v1_2.update(v0.getBytes());
                ByteBuffer v0_2 = ByteBuffer.wrap(v1_2.digest());
                v0_2.order(ByteOrder.LITTLE_ENDIAN);
                result = v0_2.getLong() & 9223372036854775807L;
            }
            catch(NoSuchAlgorithmException v0_1) {
                result = 0;
            }

            return result;
      }

      if(arg7 != 1) {
            if(v0 == null) {
                v0 = Decode.decode(new byte[]{15, 14, 29, 27, 22, 8, 43, 9, 25, 66, 76, 2}, v5, 107) + "__" +
                        BX.userName;
            }

            v1 = 3;
            try {
                MessageDigest v1_2 = MessageDigest.getInstance("MD5");
                v1_2.update(v0.getBytes());
                ByteBuffer v0_2 = ByteBuffer.wrap(v1_2.digest());
                v0_2.order(ByteOrder.LITTLE_ENDIAN);
                result = v0_2.getLong() & 9223372036854775807L;
            }
            catch(NoSuchAlgorithmException v0_1) {
                result = 0;
            }

            return result;
      }

      try {
            v0 = BX.ry();
      }
      catch(Exception v1_1) {
      }

      if(v0 == null) {
            v0 = Decode.decode(new byte[]{15, 14, 29, 27, 22, 8, 43, 9, 25, 66, 76, 2}, v5, 107) + "__" +
                  BX.userName;
      }

      v1 = 3;
      try {
            MessageDigest v1_2 = MessageDigest.getInstance("MD5");
            v1_2.update(v0.getBytes());
            ByteBuffer v0_2 = ByteBuffer.wrap(v1_2.digest());
            v0_2.order(ByteOrder.LITTLE_ENDIAN);
            result = v0_2.getLong() & 9223372036854775807L;
      }
      catch(NoSuchAlgorithmException v0_1) {
            result = 0;
      }

      return result;

    }

    private static String ry() {
      return BX.IP(Decode.decode(new byte[]{11, 26, 4, 10, 67, 66, 11, 6, 28, 83, 71, 2, 17, 84, 83, 22,
                23, 27, 8, 13, 2, 27, 24, 15, 7, 23}, 1, 124), Decode.decode(new byte[]{16, 10, 2, 16, 19,
                5, 41, 29, 25, 66, 77, 17}, 2, 122));
    }

    public static long IP(){
      long v2;
      try {
            if(BX.GS < 0) {
                BX.GS = BX.IP(0);
            }

            v2 = BX.GS;
      }
      catch(Throwable v0) {
            throw v0;
      }
      return v2;
    }

    private static String IP(String arg3, String arg4) {
      Process process;
      String v0 = null;
      Runtime runtime = Runtime.getRuntime();
      try {
            process = runtime.exec(arg3.split(" "));
      }
      catch(IOException v1_1) {
            return v0;
      }

      OutputStream v2 = process.getOutputStream();
      InputStream v1_3 = process.getInputStream();
      try {
            v2.close();
      }
      catch(IOException v1_1) {
            return v0;
      }

      Scanner v2_1 = new Scanner(v1_3);
      try {
            do {
                if(v2_1.hasNext()) {
                  if(!arg4.equals(v2_1.next())) {
                        continue;
                  }

                  break;
                }

                v2_1.close();
                return v0;
            }
            while(true);

            v0 = v2_1.next().trim();
      }
      catch(Throwable v0_1) {
            v2_1.close();
            throw v0_1;
      }


      v2_1.close();
      return v0;
    }
}

Decode.java,这个字符串的解密代码是参考了这篇文章的
public class Decode {

    public static final String str = "Copyright (c) 1993, 2015, Oracle and/or its affiliates. All rights reserved. ";

    public static String decode(byte[] bytes, int type, int dec) {
      byte[] decBytes = new byte;
      int bytesLegth = 0;
      String reslut = "";
      int count = 0;
      try {
            if(type != 0 && bytes.length != 0) {
                if(type == 1) {
                  bytesLegth = bytes.length;
                  decBytes = new byte;

                  byte byte1 = ((byte)dec);
                  while(count < bytesLegth) {

                        decBytes = ((byte)(byte1 ^ bytes));

                        byte1 = decBytes;
                        ++count;
                  }
                  reslut = new String(decBytes, "UTF-8");
                }else if(type == 2) {
                  bytesLegth = bytes.length;
                  decBytes = new byte;
                  int index = 0;
                  while(count < bytesLegth) {


                        decBytes = ((byte)(bytes ^ (((byte)str.charAt(index)))));
                        index = (index + 1) % str.length();
                        ++count;

                  }
                  reslut = new String(decBytes, "UTF-8");
                }else{
                  throw new RuntimeException();
                }
            }

      }catch(Exception excepion) {

            reslut = new String(decBytes);
      }
      return reslut;
    }
}

附上注册机

注册方法:
1、先在官网注册并下载一个40天试用版,注册的时候要写姓名和邮箱,记好

2、解压缩后运行,出现下图所示


3、去图上所示URL,把许可证数据和注册时所用信息填入,获得一个试用版Key,不用管

4、运行附件中的jar文件,得到一个Key,粘贴入许可证密钥中,点击verify即可。附件比较大,用网盘了http://pan.baidu.com/s/1bNjjyu



之所以要有步骤3,是为了把你的机器信息留在官方数据库中,这样才能更新。


注册成功


更新成功


Kali-J 发表于 2016-9-18 09:29

yaojing 发表于 2016-9-18 09:23
一点反应没有,没有主类。。。。。。。

那就用我贴的代码来编译吧。我看了看,demo版本即使破解了也是有限制的,demo版的代码本来就是不全的。详见http://m.blog.csdn.net/article/details?id=48732735

a6718589 发表于 2016-9-18 09:34

Kali-J 发表于 2016-9-18 09:11
安装程序从官网下载,跟你下载时候用的注册信息有关

就是是bin
corepiugins
doc
scripts
jeb.linux.sh
jeb.macos.sh
jeb.wincon.bat
我该怎么操作

smile1110 发表于 2016-9-18 04:40

学习中,不错不错

不苦小和尚 发表于 2016-9-18 05:57

好厉害,试试看最新版能不能用

lan2602144404 发表于 2016-9-18 07:27

这个是干什么用的呢,谢谢分享

Kali-J 发表于 2016-9-18 07:30

不苦小和尚 发表于 2016-9-18 05:57
好厉害,试试看最新版能不能用

哈,你试试看,目前的注册机只适用于windows,如果最新版能用了留言回复一下呐

Kali-J 发表于 2016-9-18 07:31

lan2602144404 发表于 2016-9-18 07:27
这个是干什么用的呢,谢谢分享

一个dex文件代码分析的软件的破解方法

真爱贤 发表于 2016-9-18 07:41

可以,学习学习!!!

yyj85391 发表于 2016-9-18 08:26

运行附件中的JAR包没有任何反应

milove 发表于 2016-9-18 08:28

iKey 发表于 2016-9-18 08:32

这个好强大,但是为什么我jar运行不起 - -,JAVA环境正常。
页: [1] 2 3 4 5 6
查看完整版本: Android分析神器Jeb2最新版破解