昨晚接了大头鞋一个电话,说他有一个linux服务器程序,有IP和MAC地址和时间限制的一个license文件,问我有没有办法搞定它。
我今天正好没啥事情,就小小的分析了一下这个程序,最后居然被我搞定了,hehe,算是除了winzip之外crack过的第二个程序吧,不过的确是cracking,不如那些能产生keygen那么NB。。
这个程序本身是strip过的,没有debug信息,gdb比较难跟踪。先ldd了一下,发现它link了libcrypt.so,想当然的认为它使用了DES加密算法,这个简单,我们替换掉libcrypt,看看它掉setkey的时候用了甚么key不就完了。。结果,没有调用!
后来试了试strace,没有太多有用的信息,还是找个ltrace吧。ltrace很强,能够跟踪所有的library call,跑了一下,果然,所有的memset, strcpy, fread都出来了,喜之。找到读license文件那个fread,然后开始看接下来的call。
果然,这个程序读入了这个文件,先一个int,再一大段,最后结尾的时候又分开读了几个int。接下来它seek到开头,又读入一边处理。。。结果到处理结束,也没有掉任何加密相关的函数。我就把这个程序用objdump给disasm了,不过这个东西没有debug信息,我又不太懂汇编。。所以看到头大。。这也是为啥搞不出来keygen的缘故。
后来快要放弃的时候,看了一下那段处理过程,发现他们原来是从那个license文件慢慢解密的,一个字节一个字节的解出来ip,mac,过期时间之类的信息,最后一下完整的字符串。于是又想起linux提供的伟大的LD_PRELOAD,嘿嘿,做一个memcpy()函数,当最后一次拷贝的时候,修改里面的IP/MAC和时间信息,试了一下,果然大功告成(来,亲个嘴儿),服务器显示过期日期是2099年。。。
只能说——这个程序做的不够好,要是RSA的静态库连接一下,我这样的小菜鸟是拿它一点办法也没有的。。除非找到那个关键的if判断,把它改成90909090…不过找到那个if会比较难。。。