一直与狗无缘,近日有机会得到一个软件,用的是sen***狗,决定好好研究一下。

    该软件从结构上分为界面与内核两部分,
    界面是用delphi一类软件写的,内核是java写的。

    不插狗时,软件启动显示为demo版;只能打开一个编辑窗口;
且运行脚本(该软件最重要的功能)时提示无狗,不能继续。

    经过跟踪发现用户界面使用一全局变量作为标志,启动时如果无狗会把该变量置0。
把这一变量锁住后,启动不再显示demo字样;只能打开一个编辑窗口的限制也去掉了。
但运行脚本时仍提示无狗。至此界面部分的破解已经完成,过程不在此敷述,因为本文重点不再此。

    该软件带了一大堆class文件,搜索一下果然发现某个class文件包含无狗的提示信息。
用jad1.4反编译一下这个class文件,可以看到如下代码

  ……
        if(protection == null)
            protection = new Protection(1);
        if(!protection.check())
        {
            report.message("Attach a dongle for licenced use");
            Report.terminate("or contact ****** for an authorised copy");
            System.exit(0);
        }
  ……

    显然对狗的判断是在protection.check()函数中进行的。如果没有狗,就会提示,然后退出。
看了一下具体的判断过程,比较麻烦。虽然是java的源代码,但本人的java功力太浅,懒得理他了。
还是想想怎么去掉System.exit(0)这句话吧。

    试着用eclipse把反编译得到的java文件重新编译,一大堆错误。要么少这个包,要么少那个包,
我这样可怜的java水平,还是想别的办法吧。

    exe文件不是能直接改吗,为什么class文件不能直接改?用ultraEdit打开class文件一看,惨不忍睹。
上网找了一大圈,愣是没有class修改工具。

    请教了一位java高手,答曰java虚拟机规范里有class文件的格式说明。幸好网上有规范,而且是中文的。
class文件格式比较规整。但对本人还是过于复杂了。class文件里的操作符都是一个字节,从00到ff已经用的差不多了。
用ultraEdit+jad1.4,外加save/load大法,一阵摸索加实践,发现if(!...)在class文件里是通过操作符9a(ifne)实现的。
如果改成99(ifeq),if(!protection.check())就变成了if(protection.check())。

    哈哈,这下爽了,不插狗可以运行,插上狗反倒提示无狗。破解完毕。至于怎么读狗,很遗憾,
本人还是一窍不通。不过最大的遗憾是没有class文件的修改工具。也许是本人孤陋寡闻了。
如果真的没有,希望本文能起到抛砖引玉的作用,哪位精通java虚拟机的高手愿意为密界做个贡献,
做个class文件修改器?看到class文件里哪句话不爽,直接删掉了事。

    还有一点感想,狗在我心目中一直相当神秘,今日一见不过如此。管你判断有多复杂,修改一个字节,
程序流程改变,保护就形同虚设了。