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



作者 提供了一般方法 [Re:snowbug]
menzy



版主


发贴: 754
积分: 113
于 2003-01-03 09:27 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
是自己总结的么?
反编译对付普通的软件效果还行,如果出现类似瑞星、解霸之类的,多处设置不同监测点的软件,恐怕不那么容易
anyway, you deserve the point.



作者 Re:Java 软件破解入门 [Re:snowbug]
floater

Java Jedi

总版主


发贴: 3233
积分: 421
于 2003-01-03 12:05 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
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!



"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
- Martin Fowler, Refactoring - Improving the Design of Existing Code
作者 Re: Java 软件破解入门 [Re:snowbug]
snowbug



CJSDN高级会员


发贴: 418
积分: 130
于 2003-01-04 12:27 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
是我自己总结的 Smile

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

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



作者 Re: Java 软件破解入门 [Re:snowbug]
floater

Java Jedi

总版主


发贴: 3233
积分: 421
于 2003-01-04 12:40 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
snowbug wrote:
floater,
我想解释的话只有举几个例子,等有时间我慢慢加上来。其实这些软件加密很有意思的 Smile


Thanx, yea I figured it would be very intriguing.



"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
- Martin Fowler, Refactoring - Improving the Design of Existing Code
作者 Re:Java 软件破解入门 [Re:snowbug]
烂泥





发贴: 538
积分: 72
于 2003-03-06 20:45 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
好!


作者 Re:Java 软件破解入门 [Re:snowbug]
chaor



CJSDN高级会员


发贴: 122
积分: 80
于 2003-03-09 17:07 user profilesend a private message to usersend email to chaorsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
经过混淆的怎么办?


作者 Re:Java 软件破解入门 [Re:jchaor]
snowbug



CJSDN高级会员


发贴: 418
积分: 130
于 2003-03-11 00:26 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
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.




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