![]() |
Java开发网 |
注册 |
登录 |
帮助 |
搜索 |
排行榜 |
发帖统计
|
您没有登录 |
» Java开发网 » Java Security
![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
作者 | Java 软件破解入门 |
snowbug
![]() CJSDN高级会员 ![]() 发贴: 418 积分: 130 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 破解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 加密机制后,利用其原有的代码来生成注册文件。 最后,恭祝大家新年快乐,心想事成,破解软件无往不利 ![]() |
作者 | 提供了一般方法 [Re:snowbug] |
menzy
![]() 版主 ![]() 发贴: 754 积分: 113 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() 是自己总结的么? 反编译对付普通的软件效果还行,如果出现类似瑞星、解霸之类的,多处设置不同监测点的软件,恐怕不那么容易 anyway, you deserve the point. |
作者 | Re:Java 软件破解入门 [Re:snowbug] |
烂泥
![]() ![]() ![]() ![]() ![]() ![]() 发贴: 538 积分: 72 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() 好! |
作者 | Re:Java 软件破解入门 [Re:snowbug] |
chaor
![]() CJSDN高级会员 ![]() 发贴: 122 积分: 80 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 经过混淆的怎么办? |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() |
![]() |
![]() |
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 |