在看雪论坛潜伏了好几年了
,去年年底才注册帐号,现在忍不住了,上来发些帖子。
我学过很多语言,但对Java只是纸上谈兵,看过两本书,但是几乎没写过代码。
对于破解,我只是懂一点皮毛罢了,我用OD是为了看运行时一些变量的值,用IDA只是因为,用它看汇编比较好看……
现在因为需要,要破解一个很大的软件系统,并写出注册机。这个系统,使用的语言包括Delphi、Java、C#三种,更郁闷的是,内部有个Delphi写的编译器,用来编译我在这个平台上写的代码,而在平台上写代码,所要调用的函数,由Delphi、Java、C#三种语言提供。它这个编译器,使用CLI规范,但又不完整……
软件限制就是:用这个平台的未注册版本开发的系统,限制了在线用户数量。
目前进度:已获释机器码产生算法,已确定注册后会生成一个授权文件。
我想在这把对这个软件的破解记录下来,同时,也希望各位大侠帮忙解决一些碰到的问题。
首先,我尝试了查找特征码的方法,因为在线用户超过限制时,会有提示,所以,我肯定这个信息来自Java写的一些类包。
然后,我写了一段vbs脚本,调用最新版本的JAD,反编译了所有的jar包,包括JDK的,因为我担心它可能修改了JDK里面的jar,JDK是随着该软件发布的。用文本编辑工具UE,搜索所有反编译后的java文件,居然未发现该特征字符串。我已经打开JAD的-8选项,Unicode文字是可以显示了的,所以不存在乱码不能显示的可能。
那么,剩下两个可能:一,该字符串被加密了,如果是这样,我就肯定得放弃了,因为,仅仅jar包,就有四千多个,更不用说java文件了,我不可能找到它在哪里被解密,要不我也不用写脚本来处理了,我可是专门用了一台四CPU的服务器来反编译的;二,调用了外部程序取得该字符串,或者读配置文件了,配置文件我翻过了,没有。至于调用外部程序,这是常事,我今年才发现它调了一个DLL![]()
后来,通过网络抓包,我找到了在出错前它调用了服务器的最后的一个方法(它是用Hessian通信的)。正想到jar里面找这个方法,突然发现,这个目录怎么只有class没有java,手工再调一次jad,不行,提示不是java格式程序,开IDA,也说格式不对,用UE,天哪,都是十六进制的……
我在所有java文件中全面搜索这个jar的名字,发了在一个java中使用了它,也发现了它旁边的System.load方法,赶快上百度。看到这里,别笑我,我真的不懂Java!
我不仅搜到了这个方法的用法,还知道了它跟Java加密技术密切相关。原来是一个Java中用户动态加载类的方法,许多人重写了该方法的实现来保护Java代码。
下一步,搜索ClassLoader。得到近千条结果,不怕,服务器都不怕累,我也不怕,呵呵。慢慢检查发现,有一个类继承了URLClassLoader,重写的方法,与网上的保护方法极为类似,记下,继续看(我可不会因为找到一个而放弃后面的,那可是服务器大哥花了好几分钟帮我找到的呀),后面都没有可疑文件了。看来,这个类就是我要找的目标。
重点查看构造函数和defineClass方法,因为构造函数可能初始化一些东西(使用了上面提到的那个jar包的路径),而加载类的核心,就在defineClass中。在defineClass中,只是做了一些准备工作,最重要的加载,而通过调用另外一个方法完成的,但我只看到该方法声明是这样的:public native Class。我猜测(真的不懂Java,反正C#中是这样的),它应该是调用外部native代码(不懂该怎么理解,反正我理解成PE格式之类的)。继续查找该类的可疑地方,发现一个static{}代码段,晕倒,又不懂是干嘛用的,我学过的语言里面,都没有这样的写法。不过不要紧,懂里面的代码就行了。哈哈,用System.load调了一个dll,它应该就是上面那个方法的所在地了。
找到那个dll,首先PEid商场,“什么都没发现”。这已经没什么奇怪的啦,1G多的文件,鬼才知道哪个是用那种工具写的呢,再说,它自身就有编译器,搞不好就是他自己编译出来的。不管了,用IDA能打开就行。真的得来不费功夫,唯一的导出函数,名字就是上面的那个方法。赶紧进去看,好恐怖哦,好多好多var_xxx。看到下面的代码,哭笑不得:
sub esp, 666h
mov eax, dword_10066060
xor eax, esp
mov [esp+666h+var_4], eax
mov eax, [esp+666h+arg_8]
mov edx, [esp+666h+arg_14]
mov ecx, [esp+666h+arg_10]
esp先减去一个数,然后用的时候,每次都加上……不知道是哪门子编译器搞的。
往下直到第一个call:
push esi
mov esi, [esp+688h+arg_0]
mov edx, [esi]
mov eax, [edx+18h]
push esi
call eax
这种方法,很像OO中调用一个对象的方法的做法(昨天刚学会的一点皮毛)。似乎esi就是这个对象,在call eax前,用了push esi,可能是想把这个对象做法参数传进去。
Java中那个方法声明有6个参数,而这里有7个arg,呵呵,真的很像。
现在只是想说 阿你托佛 ,保佑这个dll里面,没有再调用别的程序……毕竟是千山万水追到这里来的。
昨天发现的注册窗体的线索断了,现在正在请教vhly。解决了再发出来。
好了今天就写到这里了,我前天才刚开始接触Java的逆向,欢迎大家赐教!
- 标 题: 一个软件的逆向分析日志(一)(二)
- 作 者:nnhy
- 时 间:2007-05-10 21:50
- 链 接:http://bbs.pediy.com/showthread.php?t=44273