服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

反编译、破解java软件的方法、实例与经验


  前几天得到一个用java编写的压缩软件iavazip2.0,虽然好用可惜是个试用版本,限定的时间一到就不能
  
  用了。能不能把这个软件据为己有呢?本人试图破解它,在不到半个小时的时间里,成功破解了这个java
  
  软件的注册码,下面现把这个破解的方法和过程向大家做个详细的介绍。
  
  
  
  一.破解工具准备
  
  要破解java软件,必须要反编译用java编写的类文件。由于网上大虾们的支持,许多反编译软件被研制出来
  
  其中,我经常使用的是:
  
  1. cavaj java decompile 1.11
  
  2.java源代码反编译专家(该软件支持目录编译)
  
  3.jad
  
  这三个软件各有优缺点:前二个软件是gui界面,使用起来很方便。尤其是"java源代码反编译专家",支持
  
  目录编译,用起来很得心应手;第三个软件jad功能最强,由于是字符界面,但是相对初学者比较难一点。
  
  
  
  二.破解步骤
  
  1.首先分析批处理文件,找到第一个调用的class。
  
  在分析iavazip20软件的iavazip2.bat,我把最重要的一句copy到下行:
  
  com.sfs.app.iavazip20.iavazip20 %1 %2 %3 %4 %5 %6 %7 %8 %9
  
  可以知道,在com/sfs/app/iavazip20的目录下的iavazip20.class就是被调用的第一个class.
  
  
  
  2.反编译第一个class,分析main方法,寻找版本控制的代码段
  
  我用“cavaj java decompile 1.11”编译iavazip20.class文件,很快就可以得到该软件的java代码,
  
  main方法的全部代码如下:
  
  public static void main(string args[])
  
  {
  
  iavazip20 iavazip20 = new iavazip20(args);
  
  if(iavazip20.isexpired())
  
  {
  
  system.out.println("iavazip20 trial time has expired. please purchase and enter licence key.");
  
  for(_cls13 _lcls13 = new _cls13(iavazip20, true); _lcls13.expirationframe.isshowing();)
  
  {
  
  try
  
  {
  
  thread.sleep(1000l);
  
  }
  
  catch(interruptedexception _ex) { }
  
  }
  
  
  
  if(_cls66.isserialregcode(((_cls1) (iavazip20)).res.getproperty("user.id")))
  
  {
  
  iavazip20._fld6.remove(iavazip20._fld4);
  
  iavazip20._fld6.add("right", iavazip20._fld4 = iavazip20._fld0 = new _cls13(iavazip20));
  
  iavazip20._fld6.validate();
  
  } else
  
  {
  
  iavazip20.dispose();
  
  system.exit(0);
  
  }
  
  }
  
  iavazip20.show();
  
  }
  
  
  
  很明显,iavazip20.isexpired()就是版本控制的代码。
  
  
  
  
  
  3.分析版本控制的语句,找到破解的方法
  
  由于isexpired()的方法的代码如下:
  
  public boolean isexpired()
  
  {
  
  return !_cls66.isserialregcode(super.res.getproperty("user.id", "0")) && long.parselong(super.res.getproperty("magic")) + magictime < system.currenttimemillis();
  
  }
  
  
  
  看了com/sfs/app/iavazip20的所有文件,由于该文件夹中的文件都是从1-66之间的整数问文件名,“class”为扩展名的类文件,分析“!_cls66.isserialregcode”的方法是破解的关键类应该就是66.class文件
  
  。试图用iavaj反编译该文件,居然不能反编译得到。改用jad命令
  
  “ jad -p 66.class > 66.java”,得到部分编译后代码,摘录如下:
  
  public class _cls66
  
  {
  
  
  
  public _cls66()
  
  {
  
  }
  
  
  
  public static boolean isserialregcode(string s)
  
  {
  
  if(s == null)
  
  return false;
  
  boolean flag = true;
  
  if(s.length() != 9)
  
  flag = false;
  
  if(flag)
  
  {
  
  long l = integer.parseint(s);
  
  if(l == -1l)
  
  flag = false;
  
  if(flag)
  
  {
  
  flag = false;
  
  for(int i = 0; (long)i <= 9l; i++)
  
  if(_fld0[i * 2] <= l && _fld0[i * 2 + 1] >= l)
  
  flag = true;
  
  
  
  }
  
  }
  
  return flag;
  
  }
  
  
  
  private static long _fld0[];
  
  private static final long _fld1 = 10l;
  
  
  
  static
  
  {
  
  _fld0 = new long[20];
  
  _fld0[0] = 0xd3f3471l;
  
  _fld0[1] = 0xd3f34d4l;
  
  _fld0[2] = 0x1653939l;
  
  _fld0[3] = 0x165399cl;
  
  _fld0[4] = 0x313abcc9l;
  
  _fld0[5] = 0x313abd2cl;
  
  _fld0[6] = 0x320aa371l;
  
  _fld0[7] = 0x320aa3d4l;
  
  _fld0[8] = 0x11761f91l;
  
  _fld0[9] = 0x11761ff4l;
  
  _fld0[10] = 0xd52b0b9l;
  
  _fld0[11] = 0xd52b11cl;
  
  _fld0[12] = 0x391d5681l;
  
  _fld0[13] = 0x391d56e4l;
  
  _fld0[14] = 0x196c9351l;
  
  _fld0[15] = 0x196c93b4l;
  
  _fld0[16] = 0x185a2d39l;
  
  _fld0[17] = 0x185a2d9cl;
  
  _fld0[18] = 0xc0053a1l;
  
  _fld0[19] = 0xc005404l;
  
  }
  
  }
  
  
  
  代码if(s.length() != 9),表明sn的长度必须是九位。
  
  代码 long l = integer.parseint(s);
  
  if(l == -1l)
  
  表明sn必须是数字,而且是九位数字。
  
  
  
  代码:for(int i = 0; (long)i <= 9l; i++)
  
  if(_fld0[i * 2] <= l && _fld0[i * 2 + 1] >= l)
  
  flag = true;
  
  表明,sn必须是小于―fld0[]数组中相邻数组的值,sn共有10组。
  
  我们注意到
  
  _fld0[0] = 0xd3f3471l;
  
  _fld0[1] = 0xd3f34d4l;
  
  用计算器计算_fld0[0]和_fld0[1]的十进制,得到
  
  _fld0[0]=22246001
  
  _fld0[1]=22246100
  
  也就是你把sn输入为22246001 - 22246100 中的任何一个数字都是合法的序列号。
  
  
  
  4。经验总结
  
  1。要选择不同的工具进行反编译,
  
  2。破解软件的目的是为了学习软件编写的思想和方法以及个人使用,而不是用于达到商业目的。
  
  3。有好的见解和方法可以和我联系

扫描关注微信公众号