Topic: Java 软件破解入门

  Print this page

1.Java 软件破解入门 Copy to clipboard
Posted by: snowbug
Posted on: 2003-01-01 03:17

记得当初我开始试着破解Java软件的时候,在网上找不到这方面的任何资料,只有自己摸索,其间走了不少弯路。写这篇文章的目的就是把自己破解Java软件的基本过程总结一下,使初学破解的朋友少走一些弯路,节省一些时间。

破解Java软件的总思路和破解windows可执行文件的方法大致是一样的:把程序还原成可读代码,找出加密逻辑并破解。不同的是,windows可执行代码是还原成汇编语言,而Java程序可以还原出Java代码,因而破解也相对容易得多。

破解Java程序一般需要有一个好的反编译器。我常用的是JAD。这个程序已经很久没有更新了,不过效果还可以,而且可以批量反编译。有很多图形界面的反编译器都使用它作引擎,因而他们产生的代码都是一样的。

破解Java程序一般可以分为四步来进行:反编译,找出破解入口,研究认证代码,最后是破解。下面就这四个步骤一一解释:

1、反编译。
首先把需要破解软件的相关 .class 文件反编译到一个新建目录下。现在大部分软件都把编译后的 .class 文件用 jar 打包。如果是这种情况,找到相应的 .jar 文件,使用 winzip (或其他 zip 工具)把 .jar 文件打开,解压到一个 temp 目录下,再进行反编译。有的软件使用了许多第三方类库,安装目录下会有很多 jar 文件,如 xerces.jar, log4j.jar, jdom.jar, 等等。这些文件一般都不会含有软件的注册确认信息,可以略过。
反编译后的文件建议使用 .java 后缀名,这样可以使用你最喜欢的IDE来进行编辑。另外,不管用那个反编译器,你应当熟悉如何使用。

2、找出破解入口
一个软件一般会有成百上千个 .class 文件,我们不可能每一个都研究一下。在这么多文件中,和注册有关的文件一般只有几个,多的也不会超过一打。这一步的目的就是在所有的文件中把和注册有关的文件分离出来,使我们可以集中精力研究软件的加解密逻辑。
软件的注册方法各不相同,一般不会超过以下几种可能:输入序列号或是密匙来注册(如 Alloy look and feel, Jshrink),使用 license 文件(如Jbuilder)。有的软件会跳出一个窗口让你输入这些信息(如 Jshrink),有的是直接调用某个方法(如 Alloy look and feel)。这些都提示了程序的加密解密的入口。
例如 faceless 的 PDF Lib, 注册的方法是直接调用方法 PDF.setLicenseKey(String),所以反编译出来的 PDF.java 就是破解的入口。如果软件运行时跳出一个对话框来输入注册码,就应该先找出显示这个对话框的类作为入口。如果是使用注册文件,就应当试着找出读取这个注册文件的代码作为入口。
还有一个常用的方法是在所有反编译出的代码中搜索某个字串,如“license”。

3、研究认证代码
从第二步找出的入口入手,我们可以通过研究反编译出的源代码一步步找出软件的认证逻辑。比如输入的序列号是如何被处理和比较的,这个过程用了那些加密解密的类等等。不同的软件使用不同的方法,没有一定之规。有的调用 native dll 来进行认证,有的使用 Java 自带的类。例如 Alloy LookAndFeel,序列号中包括了用户的 email 地址,一些随机字串,以及相应的 CRC 值。确认序列号的时候,重新计算字串的 CRC 值,再和原来的比较,如果符合就通过。
有的序列号或是认证文件使用了 PKI 进行加密解密。这种加密方法使用私人密匙加密认证信息,在软件中再使用公开密匙获得明码进行确认。由于私人密匙一般不会被包括在软件中,所以这种加密方法即使知道了加解密的逻辑也无法生成注册机。一般只要不是使用这类方法,在研究反编译的代码后,都可以自己写出注册机来。
很多软件的注册认证过程使用了位运算符(bit operator: |, &, ^, and ~)。所以相关的知识是必不可少的。
研究源代码的过程需要极大的耐心。由于反编译出的代码没有注释,逻辑一般不很直观。特别是现在的软件大部分都使用混淆器混淆过,使的源代码更加难以理解。可以一边读代码一边加入自己的注释。我一般爱使用 IDEA 来读源程序,当读懂了某个变量或是方法后,使用IDEA的 refactor 功能把变量或是方法改成有意义的名字,这样越到后来代码越容易读懂。

4、破解
最后一步就是破解了。一般有两种方法:自己写注册机和修改反编译代码来跳过认证的部分。如果可以,我一般喜欢写一个注册机,这样对软件本身没有任何影响。可是有的时候只能通过修改源代码来破解,如上问题到的用PKI加密(SimonLei 说可以通过公共密匙算出私人密匙,不过我还没有搞懂具体怎么做。希望有人能给出具体的指导)的软件,以及用 native dll 来确认注册信息的软件。
如果是自己写注册机,首先要明白认证信息是如何确认的,再把相应的逻辑反过来就是产生认证信息的过程。这部分需要 Java 的编程知识即可。
修改源代码相对要简单许多,具体方法如下:
编辑:找出用来确认注册信息的类,编辑它的反编译出的类源代码,把具体的认证逻辑跳过,加入自己的代码使得认证永远成功。注意有时需要设定类变量的值来表示认证通过。
编译:编译修改过的代码,注意要在 classpath 中包括软件的 .class 或是 .jar 文件来使编译器能找到其他编译需要的类。 假设原来的 class 文件都放在一个叫 mysoftware.jar 的文件中,修改的认证类是:License.java,那么编译时应该用: java –classpath mysoftware.jar –d c:\tempdir License.java 。
重新打包:编译成功后用把新生成的 .class 文件覆盖原来的 .class 文件。如果原来的类是在一个 jar 文件中,也要把新的文件覆盖并入到这个 jar 文件中。

总结
破解软件的方法根据软件认证的方法不同而不同,以上介绍的只是一个基本步骤。 真正破解某个软件时需要自己动脑筋找到最好的方法。一个软件的保护机制象是一条链,由许多环组成的。破解时只要找出这些环中最弱的一环加以攻击,不需要浪费力气在其他环上。比如 ScottLai 兄的 Jbuilder 注册机就是在仔细解读 Borland 加密机制后,利用其原有的代码来生成注册文件。

最后,恭祝大家新年快乐,心想事成,破解软件无往不利 Smile

2.提供了一般方法 [Re: snowbug] Copy to clipboard
Posted by: menzy
Posted on: 2003-01-03 09:27

是自己总结的么?
反编译对付普通的软件效果还行,如果出现类似瑞星、解霸之类的,多处设置不同监测点的软件,恐怕不那么容易
anyway, you deserve the point.

3.Re:Java 软件破解入门 [Re: snowbug] Copy to clipboard
Posted by: floater
Posted on: 2003-01-03 12:05

Snowbug,

Is it possible you could explain some 加密方法, how complex they are, and the way to deal with them in general? This could help us in step 3 and 4 in your article a great deal in practice, otherwise we just shoot the stars, Smile.

Thanks, man!

You too, have a great year!

4.Re: Java 软件破解入门 [Re: snowbug] Copy to clipboard
Posted by: snowbug
Posted on: 2003-01-04 12:27

是我自己总结的 Smile

瑞星、解霸一类的软件加密的是 windows exe 文件,对吗?一般 Java 的软件好像只有混淆一下,因为加密的话就不能用 JRE 运行了。

floater,
我想解释的话只有举几个例子,等有时间我慢慢加上来。其实这些软件加密很有意思的 Smile

5.Re: Java 软件破解入门 [Re: snowbug] Copy to clipboard
Posted by: floater
Posted on: 2003-01-04 12:40

snowbug wrote:
floater,
我想解释的话只有举几个例子,等有时间我慢慢加上来。其实这些软件加密很有意思的 Smile


Thanx, yea I figured it would be very intriguing.

6.Re:Java 软件破解入门 [Re: snowbug] Copy to clipboard
Posted by: 烂泥
Posted on: 2003-03-06 20:45

好!

7.Re:Java 软件破解入门 [Re: snowbug] Copy to clipboard
Posted by: chaor
Posted on: 2003-03-09 17:07

经过混淆的怎么办?

8.Re:Java 软件破解入门 [Re: jchaor] Copy to clipboard
Posted by: snowbug
Posted on: 2003-03-11 00:26

jchaor wrote:
经过混淆的怎么办?


It usually very very hard to crack a application if it is well obfuscated. With a goo obfuscator, even the string literals are encrypted and the encryption key is different for each class. I wish there would be some runtime tool (like softice for windows exe) that allow us to inpect the objects at the runtime.


   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