发表于 2015-6-19 10:50

申请会员ID:findreams【申请通过】

1、申请ID:findreams
2、个人邮箱:findreams@163.com
3、原创技术文章:DeltaWalker v2.1.1 破解

[软件介绍]
DeltaWalker是Deltopia出品的文件和文件夹比较和同步软件,可以让你比较,编辑和合并文件和同步文件夹,支持本地和远程文件。DeltaWalker不仅能对比普通的文本文件,还可以对比文本格式的pdf。此软件是用java和Eclipse编写的,所以程序会稍显很臃肿,貌似在MAC下比较受欢迎。

[背景]
最近由于工作原因,日常的工作OS切到了LINUX下,之前在WINDOWS下使用的文件对比工具就是Beyond Compare(同事5年前给的,版本超级老。。。基本上不用了)和这个DeltaWalker,DeltaWalker也是在几年前用朋友的MAC时,找此类软件时发现的(1.9.6版,有WIN32,MAC,LINUX三个版本),还算好用,而且由于是基于JAVA,支持全平台(当时BC好像还只有WINDOWS版),个人比较喜欢这种多平台的软件,省却了在不同平台下切换其他软件那种不适感,所以就一直在用这个,结果这次出问题了。。。

由于之前下的软件版本也有些老了,当时下载的LINUX版本是32位的,现在用的OS是64位,启动就报错,后来又是安装32位JVM,又是修改配置,折腾了一通,能用了,但还是有些小问题,界面不美观不说,主界面上有些该显示的内容显示不出来,查看log中一堆Exception,看来还是版本太老了,去官网一看,已经都是2.1.1版本了,仍旧是多平台,并且每个平台都分出了32与64位版,开始找破解。。。未果。。。网上能找到的最新的破解是1.9.9.2的,下载链接还都失效了,能下的只有1.9.8的,但是还只有WIN版的包,这个软件的旧版本安装包都很难找。。。

在寻找过程中,无意中发现了52pojie上Hmily破解的Beyond Compare 4.0.7,居然BC也是全平台的了,而且看网上的人说比DeltaWalker好用(这个见人见智,不过DeltaWalker是JAVA开发,占资源肯定要高些),煞是激动。。。再次失望,Hmily给出了WIN和MAC的破解,唯独没有LINUX的,说有空的时候再来弄,本人急性子,当时就想找找他的联系方式,看看有没眉目了。。。再次。。。论坛没注册的看不到他信息,注册吧得要邀请码,花钱的有点舍不得(其实不贵啦,比买个软件便宜),只能看看牛人通道能行不,一不做二不休,虽然没搞过破解,但天天弄JAVA,决定试一试破解DeltaWalker,本想着不管成功失败,把过程写出来看能不能注册上ID找Hmily要个BC的Linux破解。。。结果,把这玩意先给搞出来了

[过程]
balabala了一大堆,现在讲讲正式的过程,本人破解新手一枚,从没破过软件,所以方法可能比较笨,各位同仁见笑了。

最开始想了两个思路:
1. 使用Java的Remote Debug方式运行DeltaWalker,然后连接上去Debug,了解软件的运行过程,找到试用及注册的代码,再考虑如何修改。
2. 由于是JAVA软件,你懂得,使用JD-GUI这类工具,反编译出来,虽然出来的代码不好看,但总比人家分析C的简单多了,然后人工去找要修改的代码。

结果由于学艺不精,方法1不会弄。。。放弃,只能方法2了。

方法2有个缺点,就是程序不在运行时,要想找代码全靠人工感觉了,这时当年1.9.6的破解帮助了我。看当年的各JAR包和现在版本的虽然在结构上有变化,但是大体区别还不是很大,1.9.6当时的破解就是替换掉一个JAR包,com.deltawalker_1.9.6.jar,看包名没有其他后缀(其他包都是有表明功能的后缀的,比如xml,ui等等),估计程序的主要入口一类的都在这里面,新版可能也是类似的,于是找新版的这个文件,找到:com.deltawalker_2.1.1.201501261015.jar,反编译之,然后使出笨人的办法,全文件搜索。。。



搜索的思路是去找软件界面上的文字,然后去找显示这些文字的代码,因为试用版的About中会显示:Deltopia DeltaWalker 2.1.1.201501261015 Trial Edition ,Install License Key中会显示:Your DeltaWalker trial will expire in 30 days. 这些文字肯定在程序中有定义,但Trail Edition与30天肯定是程序算出来的,找到这些文字在哪里,计算这个的代码在哪里,破解就有了希望。

于是搜索Your DeltaWalker trial will expire,WOW,找到,有个文件UIMsg.properties,里面全是各种界面显示的字串,上面这两个就都在它里面.

AboutDlg_productInfo=Deltopia DeltaWalker {0} {1} Edition {2}\n\n\Copyright � 2004-2014 Deltopia Inc. All Rights Reserved.\n\n
AboutDlg_remainingDays=Your DeltaWalker trial will expire in {0} days

继续查找这两个字串的名字,AboutDlg_productInfo与AboutDlg_remainingDays,在类com.deltawalker.ui.UIMsg中,成员全是public的String,成员名和properties中的key都是一样的,好,继续查找这个UIMsg都在哪些类里被引用,看看AboutDlg_productInfo与AboutDlg_remainingDays是在哪里计算的。

在com.deltawalker.internal.ui.dialogs.AboutDialog中找到了对AboutDlg_productInfo的使用,这个类就是显示About界面的,看看那个Trial Edition是怎么来的,原来是AddonInfo.edition().displayName(),那接下来的重点就是AddonInfo了,这个类在com.deltawalker.AddonInfo,仔细一看下面还有个AddonVerifier,Verifier?这名字有戏.

分析了AddonInfo的代码,发现这个类保存了那个30天试用日期,产品的注册key等信息,正是我们要找的,以下是关键代码

public class AddonInfo implements IJsonState {
    private static final Logger LOG = LoggerFactory.getLogger(AddonInfo.class);
    public static final int TRIAL_DAYS = 30;
    private Addon addon;
    private String key;
    private final Map<AddonInfo.Param, Object> params;

    public Addon addon() throws AddonException {
      String var1 = this.paramValueAsString(AddonInfo.Param.KEY);
      if(this.key == null || !this.key.equals(var1) || this.addon == null) {
            this.addon = Addon.recreate(var1);
            this.key = var1;
      }

      return this.addon;
    }

}

而这其中的addon才是真正保存版本,edition的类,上面代码中的var1就是软件注册的key,通过Addon.recreate进行校验,Addon又将key的校验委托给AddonVerifier,以下是Addon中的关键代码,Addon中放着几个预定义的ENUM,分别是不同的几个版本,根据你输入的KEY,对这几个版本进行循环校验,哪个能对上就表示你是哪个版本,试用版的内置了一个TRAIL版本的KEY,所以就会校验到这个版本上面

public static enum Edition {
    ORO,
    PRO,
    STANDARD,
    TRIAL;

    private final String constName;
    private final String dispName;

    static {
      ORO = new Addon.Edition("ORO", 0, Msg.AddonEdition_oro, "oro");
      PRO = new Addon.Edition("PRO", 1, Msg.AddonEdition_pro, "pro");
      STANDARD = new Addon.Edition("STANDARD", 2, Msg.AddonEdition_standard, "standard");
      TRIAL = new Addon.Edition("TRIAL", 3, Msg.AddonEdition_trial, "trial");
    }
}

public static Addon recreate(String var0) throws AddonException {
    if(StringUtil.isEmpty(var0)) {
      throw new AddonException("\'key\' cannot be null or empty");
    } else {
      EnumSet var1 = EnumSet.allOf(Addon.Edition.class);
      EnumSet var2 = EnumSet.allOf(Addon.Type.class);
      String var3 = AddonInfoUtil.productVersion();
      String var4 = Platform.getOS();
      AddonVerifier var5 = new AddonVerifier(var0);
      Addon var6 = null;
      Iterator var8 = var1.iterator();

      while(var8.hasNext()) {
            Addon.Edition var7 = (Addon.Edition)var8.next();
            if(var6 != null) {
                break;
            }

            Addon var9 = new Addon(var7, (Addon.Type)null, var4, var3);
            if(var5.verify(var9)) {
                var6 = var9;
                break;
            }

            Iterator var11 = var2.iterator();

            while(var11.hasNext()) {
                Addon.Type var10 = (Addon.Type)var11.next();
                var9 = new Addon(var7, var10, var4, var3);
                if(var5.verify(var9)) {
                  var6 = var9;
                  break;
                }
            }
      }

      if(var6 == null) {
            throw new AddonException("Couldn\'t recreate addon");
      } else {
            return var6;
      }
    }
}

var5.verify(var9),这是真正执行校验的地方,对一个Addon进行验证以判断是否成功注册某个版本,以下是AddonVerifier的校验代码

public boolean verify(Addon paramAddon) throws AddonException {
    byte[] arrayOfByte1 = this.getLicenseKeyBytes();
    if(arrayOfByte1 == null) {
      return false;
    } else {
      Signature localSignature = this.getSignature();
      byte[] arrayOfByte2 = paramAddon.toBytes();

      try {
            localSignature.update(arrayOfByte2);
            return localSignature.verify(arrayOfByte1);
      } catch (SignatureException var6) {
            throw new AddonException(var6);
      }
    }
}

二话不说,改这里,我们想要的是ORO版本,及ENTERPRISE的注册类型,给他加上:

if(paramAddon.edition() == Edition.ORO && paramAddon.type() == Type.CMRL_ENTERPRISE) {
    return true;

不进行实际的校验,在前面所说的循化检验时,如果传过来的是ORO ENTERPRISE版本,就跳过实际的代码直接给他返回校验成功。

修改完毕,啦啦,编译替换成文件打包,运行测试,WOW,About中变为了:Deltopia DeltaWalker 2.1.1.201501261015 Oro Edition Enterprise,下面的License Key中也有了显示(显示的其实就是内置的TRAIL KEY,只不过我们骗他这是ORO版本)。



搞定~~~

[后话]
搞定之后还发现个问题,已解决,我在这里提出来,但就不说如何解决的了,给大家留个作业,请感兴趣的人根据我上面的思路去自己找一下,很容易的,我会把我改好的版本打包发出来,需要的人可直接使用。

上面的修改会解决版本问题,但是在Install License Key界面中提示可以输入另一个新KEY,而我们之前其实并没有输过任何的KEY,所以在这儿输入的话,会提示KEY的格式不合法,因为我也不知道合法的KEY是什么样的,也懒得去分析相关的校验逻辑了,所以想办法屏蔽之,大家可以自己研究下屏蔽方法,我的包中已经改好。



屏蔽后只保留了用户名等信息的输入,同时发现代码中有一段会向官方发个信息,也一并干掉(没分析具体用途,貌似不要的好。。。因为是在输入了KEY等信息后发包),屏蔽后如图



如果遇到了输入了KEY,提示不合法,然后关掉软件,每次打开都让输入KEY无法使用的情况,在你的home目录下(我的是linux,就是~目录,WINDOWS应该是USER那个目录吧,这个没去找过),有个叫.XXXXXX.dwk的文件,这里的X就是字母和数字,这个是保存注册信息的,删除他等于重置了注册信息,打开软件时就不报那个了。

[喊话]
Hmily,我还在等你做的BC Linux版破解哟。

--------------------------------------------------------------------------------------------
下面是做好的破解补丁,替换掉安装目录下,plugins目录中对应的文件即可。



Hmily 发表于 2015-6-19 11:30

ID:findreams
邮箱:findreams@163.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

PS:欢迎新同学,申请通过后可以把文章重新发布到脱壳破解区吧,成品可以单独发帖到原创区,Beyond Compare 4 linux下好像好几个下载版本,下哪个合适?抽空高下。

赖哥 发表于 2015-6-19 11:31

{:301_999:}又来一位大神得膜拜一下

发表于 2015-6-19 11:34

我是用的KUBUNTU,所以对我个人来说DEB的包啦

懒惰的上帝 发表于 2015-6-19 11:35

哎呦我去 欢迎高手加入吾爱

findreams 发表于 2015-6-19 11:41

Hmily 发表于 2015-6-19 11:30
ID:findreams
邮箱:



报到是回复在这里就可以是么?

我是用的KUBUNTU,所以对我个人来说DEB的包啦

1085213558 发表于 2015-6-19 12:43

{:301_993:}又一个大神

Hmily 发表于 2015-6-19 15:13

findreams 发表于 2015-6-19 11:41
报到是回复在这里就可以是么?

我是用的KUBUNTU,所以对我个人来说DEB的包啦

Beyond Compare Pro v4.0.7.19761 CracKed For Linux
http://www.52pojie.cn/thread-375567-1-1.html

搞定。
页: [1]
查看完整版本: 申请会员ID:findreams【申请通过】