Topic: 反编译、破解JAVA软件的方法、实例与经验 |
Print this page |
1.反编译、破解JAVA软件的方法、实例与经验 | Copy to clipboard |
Posted by: wjj0828 Posted on: 2003-05-30 15:21 出自:程序员大联盟 痕迹 2003-5-28 前几天得到一个用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; 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; 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。有好的见解和方法可以和我联系 附录: 1.iavazip下载: http://www.hktk.com/soft/soft_pack/iavazip.html 2.iavazip安装后进入iavazip2 目录下 点击iavazip2.bat 3.jdk1.3可以在http://www.sina.com下载 |
2.Re:反编译、破解JAVA软件的方法、实例与经验 [Re: wjj0828] | Copy to clipboard |
Posted by: nothing Posted on: 2003-05-30 15:26 , 抓到了!!抓到了!! |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |