试图破解 swf reader

研究算法的路没走通,就暴力吧,直接修改 DJ Java Decompiler 反编译d\a.class 出来的 a.java,然后用javac编译a.class,提示好多错误,加上 -classpath 为全部解压的class所在目录,还是提示有3个错误,c.c、c.b 找不到。

在研究过程中,不断打开class文件,打开个数达到一 定数目后,DJ Java Decompiler 3.12.12.96 不让打开了,于是找了个破解版 DJ Java Decompiler V3.9.9.91,没有限制了。无意中看到 jad 的资料,而又在DJ的目录下发现了jad.exe,原来DJ这个程序只是个外壳,都是通过jad.exe来进行反编译的,DJ仅仅是做了一些管理方面的工 作。

直接修改java文件的路子行不通,这下怎么办,上网找资料,看到说 IDA 可以反汇编 java的class文件。在全部class文件搜索Demo,在 Main\c.class找到,发现
b = new c(“FULL”, 0);
c = new c(“DEMO”, 1);

于是想把 DEMO 后面那个1改成0,用 IDA 打开 c.class,可以看到反汇编的代码,IDA的好处就是,鼠标选择的那行代码,可以在Hex那里高亮对应的16进制值,找到 FULL那行的16进制值和DEMO那行的值,然后用winhex修改。

修 改后的class文件怎么放回原包呢? 开始想用 jar 把解压出来的全部打包回去,打包是成功了,但程序不能执行了。因为在原包里 ac.class 和 aC.class 是2个不同文件,解压出来的时候,windows忽略大小写的,认为存在重名,就覆盖了,这样造成解压后的文件不全。(后来发现,解压时提示重名的时候, 选择全部重命名,可以得到全部文件,但重名的就被改了名字,也不能再被打包回去)

后来看资料说,可以把全部包压成zip文件,然后把zip后缀改成jar就行了。我这里不能解压,就双击打开压缩包,进入相应目录,然后把修改的文件拖进去,这样就是仅仅替换了我拖进去的那个文件。程序可以执行,但是仍然显示Demo版本。

在 isFull 那里,合格跟不合格的区分就是:合格 Main.a=c.b,不合格 Main.a=c.c,于是在 IDA 打开a.class,看代码,找16进制值,把 c.c改成了c.b。 结果还是显示Demo。

于是就想,我干脆直接在Main调用isFull那里让 Main.a=c.b。用IDA+winhex只能改动一些字节的,比如跳转什么的,现在不知道赋值命令的十六进制值,不能这样。于是搜 class修改,找到了

jclasslib(可以查看汇编代码)

http://www.ej-technologies.com/download/jclasslib/files.html

JBE – Java Bytecode Editor (在jclasslib基础上改写,增加了修改汇编代码的功能)。

http://www.cs.ioc.ee/~ando/jbe/

用jbe打开 Main.class,把调用isFull的那行,替换成了
getstatic Main/c/b LMain/c;
putstatic Main/Main/a LMain/c;

点save method后,拖回原包,提示stack错误,原来isFull有个返回值,程序那里有个pop来平衡堆栈,于是把pop删掉,没想到不能删,那就改成 nop,结果堆栈没错,提示另外的错误。仔细看,原来指令是占3字节,替换后指令占6字节,代码里的goto 都跑到错误的行了。不知怎么的,不能修改goto后面的值,于是用IDA+winhex来修改,发现十六进制是 A0+2字节的跳转距离(比如goto 行在 10,目标行是15,那么就是 A0 00 05)。

改后又提示 Exception 错误,在 jbe 里看 exception table,start_pc 异常作用的开始行,end_pc 是作用的结束行,handle_pc 是
invokevirtual java/lang/Exception/printStackTrace()V
在的行,增加指令后,错位了,但jbe里不能改,于是用winhex 搜 start_pc、end_pc、handle_pc 16进制值,发现他们3个是连在一起的,修改后就行。 这下终于没有错误了,但是启动后仍然是Demo,我要昏倒了!

用DJ打开class,反编译后 结果代码显示已经达到了我的修改意图,但为什么就是没起作用呢?

算了,不管这个授权的问题了,找下看能不能把 doSWF 那个菜单由灰色变成可点吧。

search and replace 在全部class文件里搜 doswf,没找到,我总不能挨个class用dj打开,然后把反编译后的文件复制出来吧(DJ会在关掉程序后把反编译生成的jad文件删除)。于是想到 了jad.exe,用 php 编个程序,遍历全部class文件,然后执行 system(“jad.exe -p $afile > $newfile”); 这样就把全部class反编译了,方便用 search and replace搜索特征字串。(jad.exe 不支持中文路径)

搜索doswf,找到
((ac) (h1)).d_javax_swing_JMenuItem_fld.setEnabled(false);
((ac) (h1)).d_javax_swing_JMenuItem_fld.addActionListener(new aB(h1));
((ac) (h1)).d_javax_swing_JMenuItem_fld.setText(“DoSWF (only AS3)”);
用IDA+winhex,修改false为true。程序打开后,doSWF那个菜单就是可以点击的了。但是打开后,点“Unprotect”按钮没有反应,可能程序在其他地方还有检验。2012.04.04 4点多了,放弃了,不用你了,睡觉。



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)