java

位置:IT落伍者 >> java >> 浏览文章

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


发布日期:2020年01月23日
 
反编译、破解JAVA软件的方法、实例与经验

前几天得到一个用JAVA编写的压缩软件iavaZip虽然好用可惜是个试用版本限定的时间一到就不能

用了能不能把这个软件据为己有呢?本人试图破解它在不到半个小时的时间里成功破解了这个JAVA

软件的注册码下面现把这个破解的方法和过程向大家做个详细的介绍

破解工具准备

要破解JAVA软件必须要反编译用JAVA编写的类文件由于网上大虾们的支持许多反编译软件被研制出来

其中我经常使用的是

cavaj Java Decompile

Java源代码反编译专家(该软件支持目录编译)

JAD

这三个软件各有优缺点前二个软件是GUI界面使用起来很方便尤其是Java源代码反编译专家支持

目录编译用起来很得心应手第三个软件JAD功能最强由于是字符界面但是相对初学者比较难一点

破解步骤

首先分析批处理文件找到第一个调用的CLASS

在分析iavaZIP软件的iavaZIPbat我把最重要的一句COPY到下行

comsfsappiavazipiavaZIP % % % % % % % % %

可以知道在com\sfs\app\iavazip的目录下的iavaZIPCLASS就是被调用的第一个CLASS

反编译第一个CLASS分析MAIN方法寻找版本控制的代码段

我用cavaj Java Decompile 编译iavaZIPclass文件很快就可以得到该软件的JAVA代码

main方法的全部代码如下

public static void main(String args[])

{

iavaZIP iavazip = new iavaZIP(args);

if(iavazipisExpired())

{

Systemoutprintln(iavaZIP trial time has expired Please purchase and enter licence key);

for(_cls _lcls = new _cls(iavazip true); _lclsexpirationFrameisShowing();)

{

try

{

Threadsleep(L);

}

catch(InterruptedException _ex) { }

}

if(_clsisSerialRegcode(((_cls) (iavazip))resgetProperty(userid)))

{

iavazip_fldremove(iavazip_fld);

iavazip_fldadd(Right iavazip_fld = iavazip_fld = new _cls(iavazip));

iavazip_fldvalidate();

} else

{

iavazipdispose();

Systemexit();

}

}

iavazipshow();

}

很明显iavazipisExpired()就是版本控制的代码

分析版本控制的语句找到破解的方法

由于isExpired()的方法的代码如下

public boolean isExpired()

{

return !_clsisSerialRegcode(superresgetProperty(userid )) && LongparseLong(superresgetProperty(magic)) + magicTime < System.currentTimeMillis();

}

看了com\sfs\app\iavazip20的所有文件,由于该文件夹中的文件都是从1-66之间的整数问文件名,“class”为扩展名的类文件,分析“!_cls66.isSerialRegcode”的方法是破解的关键类应该就是66.class文件

。Tw.wINgwiT.cOm试图用iavaj反编译该文件,居然不能反编译得到。改用JAD命令

“ jad -p 66.class > java得到部分编译后代码摘录如下

public class _cls

{

public _cls()

{

}

public static boolean isSerialRegcode(String s)

{

if(s == null)

return false;

boolean flag = true;

if(slength() != )

flag = false;

if(flag)

{

long l = IntegerparseInt(s);

if(l == L)

flag = false;

if(flag)

{

flag = false;

for(int i = ; (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。有好的见解和方法可以和我联系

               

上一篇:Java多语言编码问题解析(1)

下一篇:Java的逗号运算符