Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Java 软件破解入门
snowbug



CJSDN高级会员


发贴: 418
积分: 130
于 2003-01-01 03:17 user profilesend a private message to usersend email to snowbugsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
记得当初我开始试着破解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




话题树型展开
人气 标题 作者 字数 发贴时间
15685 Java 软件破解入门 snowbug 2899 2003-01-01 03:17
11664 提供了一般方法 menzy 92 2003-01-03 09:27
11862 Re:Java 软件破解入门 floater 283 2003-01-03 12:05
11348 Re: Java 软件破解入门 snowbug 141 2003-01-04 12:27
11698 Re: Java 软件破解入门 floater 142 2003-01-04 12:40
11306 Re:Java 软件破解入门 烂泥 2 2003-03-06 20:45
11529 Re:Java 软件破解入门 chaor 9 2003-03-09 17:07
11885 Re:Java 软件破解入门 snowbug 363 2003-03-11 00:26

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   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