一次偶然的机会,遇到一个用vb开发的一个游戏外挂,服务器已经关闭,无法使用了,让我帮忙破解,黑吃黑,嘿嘿,有趣。
软件本身加壳,有服务器验证,验证内容加密。在破解的时候,软件一启动就报无法连接服务器,接着退出,还好之前有人把服务器和它通信的全部数据sniffer了一把。
第一步:脱壳,用esp定律,很快就找到oep,dump,修复IAT,脱壳完毕,没什么异样之处。
第二步:用ida pro扫,得到了一堆很难看懂的代码,感觉ida本身对vb程序支持的不好,在网上找到vb.idc文件,运行后,很多vb6runtime里面的函数全部都显现出来了,但代码太大,字符信息太少,一时找不到下手的地方。
第三步:用od动态跟踪,报错弹出消息窗的时候,f12,查堆栈,很快找到程序退出点,向上找到关键点,改掉之后,程序不退了,但也无法工作了。
第四步:找到vb decompiler pro 5.0(cracked),用它分析代码,好懂很多,但很多地方明显有错,造成逻辑混乱,无法阅读,不过好在每个模块的入口提示的很准,每个按钮事件的入口给出的函数名可读性很强,利用它的指引用od动态暴力修改外挂逻辑,让它在无服务器下进入工作状态,发现总是莫名其妙的进入死循环状态,看来服务器的交互必不可少
第五步:写一个简单的http服务器,当客户端发来认证请求的时候,简单的将以前抓包得到的数据发回,修改host文件,把服务器重定向到自己的服务器地址,下载vb decompiler lite 7,利用里面丰富的函数参数提示结合od动态跟踪,分析整个认证过程,发现它的通信用的密码是利用随机函数RandomNext生成的,为了稳定重现,nop掉它,并将初始值给定成抓包时的密码。发现客户端有多次请求,前几次顺利进行,界面有了可惜的改观,但最后还是报告连接服务器失败,看来客户端的确是通过服务器认证包动态获得关键数据,并在这些获取后客户端逻辑才能正常工作,同时简单的模拟服务器认证行不同,必须要得到数据包解密算法。
第六步:利用现有的抓包数据,对解密函数做单步跟踪,呵呵,很辛苦,vb的变量往往前面两个双字节是属性,第三个是一个指针,指针指向另一个地址,而文本又是用unicode保存,网络数据又是单字节的,要随时切换,看起来也比较费劲,好在咬牙坚持下来,几个小时后,完全搞明白它的算法了。
第六步:解密原有所有认证用的数据包,重写http服务器,用未做任何改动的外挂,再动态加密解密后的这些认证包,并发回客户端,客户端又恢复了生机。
呵呵,很多问题看似简单,其实做起来很麻烦,而看似做不了的事情,下功夫去做,也是能做出来的。(仅限于软件行业)